推荐学习书目
› 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 · Mar 4, 2016 · 30222 views
    This topic created in 3898 days ago, the information mentioned may be changed or developed.
    用 Python 的 wxBot 框架+图灵机器人实现。
    机器人会回复来自联系人的消息,以及所有群里 @此账号的消息。
    详细实现方法参考: http://blog.csdn.net/tobacco5648/article/details/50802922

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

    实现的效果:

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

    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
    tobacco
    OP
    Mar 5, 2016
    35
    @weaming sudo update-ca-certificates 这个有用吗

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

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

    感谢分享!
    cheerzeng
    cheerzeng
    Mar 9, 2016
    69
    刚玩起来了,有意思。
    图灵机器人本来可以直接 API 接入微信公众号的,但是提示说未认证,然后设置不了。
    lixuda
    lixuda
    Mar 16, 2016
    70
    经常掉线无反应哦
    hillerliao
    hillerliao
    Mar 17, 2016
    71
    能否支持群发消息给不同的人?
    upoint
    upoint
    Mar 30, 2016
    72
    机器人发图片可以实现么?
    jojobobo
    jojobobo
    Aug 15, 2016
    73
    @tobacco 真棒
    dengxiaowu
    dengxiaowu
    May 7, 2018
    74
    怎么实现给微信群发消息呢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2687 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 69ms · UTC 13:42 · PVG 21:42 · LAX 05:42 · JFK 08:42
    ♥ Do have faith in what you're doing.