用 Python 写微信群聊机器人 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
tobacco
1.51D
V2EX    Python

用 Python 写微信群聊机器人

  •  
  •   tobacco 2016-03-04 15:55:19 +08:00 29114 次点击
    这是一个创建于 3515 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 Python 的 wxBot 框架+图灵机器人实现。
    机器人会回复来自联系人的消息,以及所有群里 @此账号的消息。
    详细实现方法参考: http://blog.csdn.net/tobacco5648/article/details/50802922

    wxBot: https://github.com/liuwons/wxBot
    图灵机器人: http://www.tuling123.com/

    实现的效果:

    74 条回复    2018-05-07 23:17:59 +08:00
    Monad
        1
    Monad  
       2016-03-04 17:06:54 +08:00   1
    咦这东西是不是可以用来挂机抢红包?
    CloudnuY
        2
    CloudnuY  
       2016-03-04 17:25:33 +08:00
    @Monad 微信红包只在手机端显示,在 Web 端和软件版上都是显示的 当前设备无法显示。。。
    Monad
        3
    Monad  
       2016-03-04 17:26:51 +08:00
    @CloudnuY 好吧 那就只有破解微信手机的协议才行了吧-.-
    tobacco
        4
    tobacco  
    OP
       2016-03-04 17:59:41 +08:00
    @Monad 是的, Web 微信目前不能打开红包,只会通知你用手机接收红包
    abmin521
        5
    abmin521  
       2016-03-04 18:12:15 +08:00 via Android
    有没有 QQ 的?好像接口被封了
    tobacco
        6
    tobacco  
    OP
       2016-03-04 18:34:48 +08:00
    @abmin521 哪个接口被封了?
    abmin521
        7
    abmin521  
       2016-03-04 18:41:51 +08:00 via Android
    @tobacco 我是说 web qq 的协议
    tobacco
        8
    tobacco  
    OP
       2016-03-04 18:55:48 +08:00
    @abmin521 web qq 的协议好像是不能用了,以前很多类似 https://github.com/im-qq/webqq-core 这样的项目都停了
    7z7
        9
    7z7  
       2016-03-04 22:48:13 +08:00
    https://ooo.0o0.ooo/2016/03/04/56d9a0c92c51f.png
    python 2.7.9.这是什么错误呢 我新手
    tobacco
        10
    tobacco  
    OP
       2016-03-04 23:15:44 +08:00
    @7z7 下载最新的 wxBot 试试~
    csx163
        11
    csx163  
       2016-03-05 01:19:56 +08:00
    @abmin521 酷 Q ,用易语言开发,收费的
    xifangczy
        12
    xifangczy  
       2016-03-05 02:29:51 +08:00
    File "bot.py", line 64, in handle_msg_all
    if 'display_name' in snames and len(snames['display_name']) > 0:
    TypeError: argument of type 'NoneType' is not iterable
    7z7
        13
    7z7  
       2016-03-05 10:01:05 +08:00
    @tobacco 下载的是 github 上的
    tobacco
        14
    tobacco  
    OP
       2016-03-05 10:20:01 +08:00
    @7z7 更新到现在的最新版本问题还在吗?
    tobacco
        15
    tobacco  
    OP
       2016-03-05 10:22:56 +08:00
    @xifangczy github 上现在的最新版本还存在这个问题吗?
    zzutmebwd
        16
    zzutmebwd  
       2016-03-05 11:09:56 +08:00
    @Monad xposed 微信红包插件就可以了吧
    Monad
        17
    Monad  
       2016-03-05 11:47:15 +08:00 via iPhone
    @zzutmebwd 未越狱 iOS 应该没办法的吧
    7z7
        18
    7z7  
       2016-03-05 12:47:50 +08:00
    @tobacco 还存在这个问题.
    CrazySpiderMan
        19
    CrazySpiderMan  
       2016-03-05 12:56:16 +08:00   1
    garipan
        20
    garipan  
       2016-03-05 13:45:07 +08:00
    为什么这个机器人 只会 hi 啊……
    别人说啥他都 hi
    tobacco
        21
    tobacco  
    OP
       2016-03-05 13:47:51 +08:00
    @7z7 好奇怪,我再找找原因
    tobacco
        22
    tobacco  
    OP
       2016-03-05 13:48:34 +08:00
    @garipan 你看看 bot.py 的运行方法, test.py 只回复 hi
    garipan
        23
    garipan  
       2016-03-05 14:07:42 +08:00
    不好意思 智硬了
    但是这次是只回复"知道了"
    应该是 API 没有接入
    但是我按照要求填写了 conf.ini 也获取了 API key 啊
    是需要设定函数名吗?可以手动录入 api 吗
    garipan
        24
    garipan  
       2016-03-05 14:15:17 +08:00
    好了 手动填写 key 好了
    看来是读取 conf.ini 出错了
    weaming
        25
    weaming  
       2016-03-05 18:23:22 +08:00
    @tobacco 我提交了个合并请求
    tobacco
        26
    tobacco  
    OP
       2016-03-05 19:18:47 +08:00
    @weaming 好的,已 merge ~
    weaming
        27
    weaming  
       2016-03-05 19:48:39 +08:00
    @tobacco 感觉这循环有点问题,有时候会卡住没反应
    displayabc
        28
    displayabc  
       2016-03-05 19:50:51 +08:00
    如果有人昵称一样,这个只会发一个
    tobacco
        29
    tobacco  
    OP
       2016-03-05 20:05:18 +08:00
    @haython 所以尽量使用 send_msg_by_uid 函数来发送消息。
    tobacco
        30
    tobacco  
    OP
       2016-03-05 20:08:12 +08:00
    @weaming 卡住是在网络不好的时候 post 要等待很久,而且还可能被服务器端判断为断线然后被强制下线。我在网络比较稳定的一台机子上挂了一整天没什么问题。
    weaming
        31
    weaming  
       2016-03-05 20:32:10 +08:00
    @tobacco linux 上跑会有错误

    File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 447, in send
    raise SSLError(e, request=request)
    requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
    tobacco
        32
    tobacco  
    OP
       2016-03-05 20:43:52 +08:00
    @weaming Python 是最新的 2.7.9 吗,如果已经是最新的,那就更新 requests 并用 openssl 代替 ssl 模块:
    pip install pyopenssl ndg-httpsclient pyasnl
    displayabc
        33
    displayabc  
       2016-03-05 20:46:17 +08:00
    @tobacco 如果 pip 装不上,可能是需要先安装 yum install libffi-devel openssl-devel
    weaming
        34
    weaming  
       2016-03-05 20:47:18 +08:00
    无效

    File "bot.py", line 112, in main
    bot.run()
    File "/root/wxBot/wxbot.py", line 538, in run
    self.get_uuid()
    File "/root/wxBot/wxbot.py", line 568, in get_uuid
    r = self.session.get(url, params=params)
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 480, in get
    return self.request('GET', url, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 468, in request
    resp = self.send(prep, **send_kwargs)
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 576, in send
    r = adapter.send(request, **kwargs)
    File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 447, in send
    raise SSLError(e, request=request)
    requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
    tobacco
        35
    tobacco  
    OP
       2016-03-05 21:01:51 +08:00
    @weaming sudo update-ca-certificates 这个有用吗

    我在我的 Linux 上测了下没问题,你参考下:
    Linux Mint 17.1 64bit, Linux Kernel 3.13, Python2.7.6 , requests2.9.1
    displayabc
        36
    displayabc  
       2016-03-05 21:07:18 +08:00
    send_msg 的 name 为空字符时,会发好多人。。。。。。。
    CBBing
        37
    CBBing  
       2016-03-05 21:12:59 +08:00
    @tobacco 我修改了一下代码,可以运行在 python 3.4 上,亲测可用, LZ 能不能新开一个分支接受合并
    tobacco
        38
    tobacco  
    OP
       2016-03-05 21:20:29 +08:00
    @haython 嗯,的确是这样的。 send_msg 函数有挺多问题的,在有重名联系人时也有问题,所以一般用 send_msg_by_uid
    tobacco
        39
    tobacco  
    OP
       2016-03-05 21:20:52 +08:00
    @CBBing python3 分支已开~
    CBBing
        40
    CBBing  
       2016-03-05 21:25:23 +08:00
    @tobacco 有一个问题是在群聊天的时候,控制台能准确显示发消息的 nickname,但是在一对一的时候显示对方的是 unknown ,一直没找到原因
    tobacco
        41
    tobacco  
    OP
       2016-03-05 21:27:09 +08:00
    @CBBing 这问题在 github 上最新的版本上还存在吗,貌似我之前修复过名称显示的一个问题。
    CBBing
        42
    CBBing  
       2016-03-05 21:33:55 +08:00
    @tobacco python 3.4 版本的是我昨天晚上修改的,目前还不清楚
    tobacco
        43
    tobacco  
    OP
       2016-03-05 21:38:13 +08:00
    @CBBing 你能更新到现在的最新版本,然后再修改下发 PR 吗, conflict 太多我这边也没有 Python3 的测试环境。。。。
    CBBing
        44
    CBBing  
       2016-03-05 21:39:19 +08:00
    @tobacco 好吧我试试
    CBBing
        45
    CBBing  
       2016-03-05 21:59:12 +08:00
    simonsmh
        46
    simonsmh  
       2016-03-05 22:03:19 +08:00
    跟#23 同样是只回复 知道了。。正在找问题
    HaoC12
        47
    HaoC12  
       2016-03-05 22:47:15 +08:00
    果然是大神,先顶一下。在慢慢膜拜代码。
    mV2GK
        48
    mV2GK  
       2016-03-06 10:50:10 +08:00
    是不是需要一个微信号用于登录机器人才行的?

    就是说,联系人与微信号连续,图灵负责答案,机器人负责通信协议,将答案回复过去?
    tobacco
        49
    tobacco  
    OP
       2016-03-06 13:33:39 +08:00
    @mV2GK 是的,机器人需要微信号才能登录。 wxBot 主要是负责微信的通信协议。
    fecho
        50
    fecho  
       2016-03-06 19:28:10 +08:00
    你好 为什么有时候会闪退???
    garipan
        51
    garipan  
       2016-03-06 19:42:10 +08:00 via iPhone
    反馈一下~
    时不时会突然停止运行 没有任何反应
    然后过几个小时 连续发 n 条
    “对不起,只认字,其他杂七杂八的我都不认识,,,,,”
    使用环境: osx 微信群(已保存至通讯录)
    tobacco
        52
    tobacco  
    OP
       2016-03-06 23:39:48 +08:00
    @garipan 这问题的确存在,还在分析中。。
    tobacco
        53
    tobacco  
    OP
       2016-03-06 23:40:52 +08:00
    @fecho 闪退时有什么错误信息吗?
    fecho
        54
    fecho  
       2016-03-07 00:27:46 +08:00
    @tobacco 什么都没有 直接窗口关闭
    tobacco
        55
    tobacco  
    OP
       2016-03-07 09:32:36 +08:00
    @fecho 在命令行里运行呢,有 log 吗
    sdshiyan2005
        56
    sdshiyan2005  
       2016-03-07 10:56:19 +08:00
    请问通过 wxBot 获取的图片 url 是否不能外链使用?我尝试使用第三方 api 直接通过该 url 处理图片失败了,谢谢!
    tobacco
        57
    tobacco  
    OP
       2016-03-07 11:28:40 +08:00
    @sdshiyan2005 图片是不能外链使用的,因为获取图片是要有 HTTP Cookie 的,只能处理下载好的图片文件或者直接处理图片二进制数据,参考 wxBot 的 get_msg_img 函数。
    displayabc
        58
    displayabc  
       2016-03-08 22:19:25 +08:00
    好像是一天左右就退出了
    tobacco
        59
    tobacco  
    OP
       2016-03-09 00:03:08 +08:00
    @haython 是的,现在还没找到原因。。
    ZEOH
        60
    ZEOH  
       2016-03-09 00:21:08 +08:00
    handle_msg_all 和 schedule 不能同时实现吗?貌似机器人会等到 schedule 里 sleep 时间满了才会进行回复。
    tobacco
        61
    tobacco  
    OP
       2016-03-09 00:49:15 +08:00 via iPad
    @ZEOH 是的,程序是单线程的,可以在 schedule 里每次判断下当前时间代替 sleep 的方式。
    jackyspy
        62
    jackyspy  
       2016-03-09 08:40:53 +08:00
    @tobacco 谢谢分享!
    几点建议:
    1 、把网络 api 部分、消息转换部分和最终提供的接口分离开来,容易维护和使用;
    2 、发消息部分封装成简易的 Web API ,供第三方调用(可由用户自己封装);
    3 、考虑使用 gevent 处理并发网络请求,避免阻塞(可由用户引入 gevent )。
    tobacco
        63
    tobacco  
    OP
       2016-03-09 09:13:57 +08:00
    @jackyspy 好的,谢谢您的建议~
    ZEOH
        64
    ZEOH  
       2016-03-09 09:15:53 +08:00
    @tobacco 好的,谢谢,我现在就是这么做的。还有就是微信手机端退出了网页端也会跟着退出,这个有什么好的解决方法吗,还是必须用台手机挂着。
    jackyspy
        65
    jackyspy  
       2016-03-09 09:25:51 +08:00
    @ZEOH 不建议用 schedule 在循环内处理消息。建议多线程,或者 coroutine 的方式并行处理
    tobacco
        66
    tobacco  
    OP
       2016-03-09 09:49:48 +08:00
    @jackyspy 微信消息并发很小,所以前期一直单线程处理。后期防止 schedle 被堵塞考虑再开一个单独的线程。
    tobacco
        67
    tobacco  
    OP
       2016-03-09 09:52:12 +08:00
    @ZEOH 这个目前是没办法的, Web 微信在手机端退出后会被服务器端强制下线。
    ZEOH
        68
    ZEOH  
       2016-03-09 10:06:50 +08:00
    @tobacco 登上网页版,手机开飞行模式下线可以支撑几个小时。不过最后还是难逃被强制下线的命运。

    感谢分享!
    cheerzeng
        69
    cheerzeng  
       2016-03-09 21:53:17 +08:00
    刚玩起来了,有意思。
    图灵机器人本来可以直接 API 接入微信公众号的,但是提示说未认证,然后设置不了。
    lixuda
        70
    lixuda  
       2016-03-16 17:09:23 +08:00
    经常掉线无反应哦
    hillerliao
        71
    hillerliao  
       2016-03-17 15:55:24 +08:00
    能否支持群发消息给不同的人?
    upoint
        72
    upoint  
       2016-03-30 00:31:01 +08:00
    机器人发图片可以实现么?
    jojobobo
        73
    jojobobo  
       2016-08-15 14:43:59 +08:00
    @tobacco 真棒
    dengxiaowu
        74
    dengxiaowu  
       2018-05-07 23:17:59 +08:00
    怎么实现给微信群发消息呢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     970 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 19:09 PVG 03:09 LAX 12:09 JFK 15:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86