Python中如何使用wxpy优雅地实现微信个人号机器人/API

wxpy: 用 Python 玩微信

优雅的微信个人号 机器人 /API ,基于 itchat ,全面优化接口,更有 Python 范儿

用来干啥

一些常见的场景

  • 控制路由器、智能家居等具有开放接口的玩意儿
  • 跑脚本时自动把日志发送到你的微信
  • 加群主为好友,自动拉进群中
  • 充当各种信息查询
  • 转发消息
  • 逗人玩
  • ...
# 脑洞太大的就不提了...

总而言之,可用来实现各种微信个人号的自动化操作

轻松安装

使用 Python 3.x

pip3 install -U wxpy

简单上手

登陆微信:

# 导入模块
from wxpy import *
# 初始化机器人,扫码登陆
robot = Robot()

找到好友:

# 搜索名称含有 "游否" 的男性深圳好友
my_friend = robot.friends().search('游否', sex=MALE, city="深圳")[0]

发送消息:

# 发送文本给好友
robot.my_friend.send('Hello WeChat!')
# 发送图片
robot.my_friend.send_image('my_picture.jpg')

自动响应各类消息:

# 打印来自其他好友、群聊和公众号的消息
[@robot](/user/robot).register()
def print_others(msg):
  print(msg)

回复 my_friend 的消息 (优先匹配后注册的函数!)

@robot.register(my_friend) def reply_my_friend(msg): return ‘received: {} ({})’.format(msg.text, msg.type)

开始监听和自动处理消息

robot.start()

模块特色

  • 全面对象化接口,调用更优雅
  • 默认多线程响应消息,回复更快
  • 附带 共同好友、图灵机器人 等实用组件
  • 覆盖大部分常用功能:
    • 发送文本、图片、视频、语音、文件
    • 通过关键词或用户属性搜索 好友、群聊、群成员 等
    • 获取好友 /群成员昵称、备注、性别、地区
    • 加好友,建群,邀请进群,踢出群

了解更多

说明文档: http://wxpy.readthedocs.io

加入讨论

GitHub: https://github.com/youfou/wxpy


加入微信交流群 (真的是群哦)

  • 加以下微信,填写验证 [ wxpy ],即可自动受邀入群


Python中如何使用wxpy优雅地实现微信个人号机器人/API

50 回复

已 star 。

以前也想做一个类似可以挂群里的机器人,但是微信必须保持手机同时在线不然会掉,有点烦。


wxpy是个挺不错的库,基于itchat,封装得更友好。要优雅地实现微信机器人,核心是处理好登录、消息处理和异常。

from wxpy import *
import logging

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class WeChatBot:
    def __init__(self, cache_path=True):
        """初始化机器人"""
        self.bot = Bot(cache_path=cache_path, console_qr=True)
        self._setup_handlers()
        
    def _setup_handlers(self):
        """设置消息处理器"""
        
        # 自动接受好友请求
        @self.bot.register(msg_types=FRIENDS)
        def auto_accept_friends(msg):
            """自动接受好友请求"""
            if 'wxpy' in msg.text.lower():
                msg.card.accept()
                return f"已自动接受好友请求,我是wxpy机器人!"
        
        # 处理文本消息
        @self.bot.register(msg_types=TEXT)
        def handle_text(msg):
            """处理文本消息"""
            try:
                # 这里可以根据消息内容做不同的处理
                if msg.text == '帮助':
                    return "我是wxpy机器人,支持:\n1. 帮助\n2. 时间\n3. 天气"
                elif msg.text == '时间':
                    from datetime import datetime
                    return f"当前时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
                else:
                    return f"收到消息:{msg.text}"
            except Exception as e:
                logger.error(f"处理消息失败:{e}")
                return "处理消息时出错了"
        
        # 处理群聊@消息
        @self.bot.register(Group, TEXT)
        def handle_group_at(msg):
            if msg.is_at:
                return f"@{msg.member.name} 我在呢!"
    
    def run(self):
        """运行机器人"""
        logger.info("微信机器人启动...")
        # 保持运行
        embed()

# 使用示例
if __name__ == '__main__':
    bot = WeChatBot()
    bot.run()

关键点:

  1. 用类封装,结构更清晰
  2. 使用装饰器注册处理器,代码简洁
  3. 添加日志记录,方便调试
  4. 异常处理要到位,避免崩溃
  5. 支持缓存登录,不用每次都扫码

如果要实现API,可以结合Flask:

from flask import Flask, request, jsonify
import threading

app = Flask(__name__)
bot = WeChatBot()

@app.route('/send_msg', methods=['POST'])
def send_message():
    data = request.json
    friend = bot.bot.friends().search(data['name'])[0]
    friend.send(data['message'])
    return jsonify({'status': 'success'})

# 在另一个线程运行机器人
threading.Thread(target=bot.run).start()
app.run(port=5000)

这样就能通过HTTP API控制机器人发消息了。记得用多线程,不然机器人会阻塞Flask。

总结:用面向对象的方式封装,结合装饰器处理消息。

已 star 感觉不错⊙▽⊙

这个确实无解,反正我是拿备用机登的…

诶等等,真的可以发送语音了么?我记得 itchat 还有各路利用网页端 API 开发的都不支持耶。

抱歉,才发现文档错了,不支持语音发送,只能接收语音…
帖子已经无法修改,已在 doc source 中修

不错,之前做了 java 版的但是功能不全, star

已 star

我一直以为是 api 限制呢,原来是要手机在线。。

赞。已 star

登入好像有些问题哦


<br>json.decoder.JSONDecodeError: Unterminated string starting at: line 6505 column 13 (char 120732)<br>

看上去是在解析一个很长的 JSON … 这个问题会反复出现吗?
不介意的话可以贴下完整的 traceback 哈。

wxpy -> 微信 pao 友

微信 py 666

微信屁眼……

我这里有一些 itchat 的用例,有一些只需要修改变量就可以直接使用了,比如直接加群主填写特定验证信息自动邀请加群的。
https://github.com/discountry/itchat-examples
希望楼主有空研究研究怎么处理红包或其他特殊类消息。

顺道发个 go 版本的
https://github.com/songtianyi/wechat-go

我自己用来撩骚,开开车 发发 gif, 美剧更新提醒等等 :)
https://github.com/songtianyi/go-aida

这个是个人微信?
我第一眼还以为是微信公众号呢

如果能 py2 就好了。。

wxpy 就是基于 itchat 开发的,是它的一层接口封装,希望提供更好用的接口哈

正好试试 Python 3 吧,我也是用了两年 py2 后下决心升级到 3 的,还是有不少提升的

对 py3 ,不是很感兴趣,因为我现在好多东西不会做,py3 只是添加了一个异步,如何高性能而已

py 交易利器

可以搞个双开 APP ,一天开一下小号就行
无责任推荐双开工具: http://parallel-app.com/

既然用的还不多,可以考虑直接切到 3 嘛,将来会有更多项目迁移到 3 ,很多新项目也是直接从 3 开始

嗯 我就是用的他双开,只是习惯性的用完就杀掉了,所以过两三天 bot 就没反应了

发现这个帖子都是收藏,回复很少,自己顶顶…😢

厉害了。。。真心的

再顶~ 顺带说下,二维码中的小机器人已经开启了被调戏功能…

我也想写一个,问一下,好友信息是怎么拿到的?是通过抓包解析协议,然后拿到信息的吗?有知道的能告诉我吗?

谢谢,果然是要抓包,我目前就是还不知道如何通过 tcpdump/wireshark 抓包,然后把信息实时更新到自己的程序里,谢谢。

厉害了,加人,加群还能自动化,好玩

抓包不是只抓数据,而是通过观察流量摸索协议,有了协议,就可以通过自己的方式获取数据啦

网页抓包 还是直接用浏览器的开发者工具吧

我也弄了个 WebQQ 不过 tody.ml/webqq/ 用来做广西联通流量自动充值。

朋友圈的功能不知道什么时候弄得到

赞,已 star

已 star

好奇,基于 itchat 的优化为何没 pr 回去呀?

导入 itchat ,而不是直接修改 itchat 的代码。而且也修改了很多接口,很难合入原项目,所以才另立项目呢。

另外结合 hug 可实现 api 接口了,这样通用性更好,可以给其他服务调用,非常简洁

哈哈我去了解下 hug ,业余 Pythoner

这个还真无解, Web 微信一直没有朋友圈功能。考虑到产品定位,估计以后也不会有…

同样业余,我是做 java ,封装成 api 几行代码就搞定了,一条消息可以群发给多个人的实现方法
.get(’/send_msg’)
def private_msg(content, username:hug.types.text=“filehelper”):
nameArr = username.split()
name = ‘’;
for i in range(len(nameArr)):
name = nameArr[i]
print(“users:{name} content : {content}”.format(**locals()))
itchat.send_msg(content, toUserName=name)
return ‘{“result”:1}’

最近正好在想怎么通过 web 来方便远程登陆 /控制微信机器人

有其他协议的研究么?网上看了其他其他协议,都需要收费。我想找一个其他协议的开源代码,参考一下。

回到顶部