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
V2EX  ›  Python

用 Python 写微信群聊机器人

  •  
  •   tobacco · 2016-03-04 15:55:19 +08:00 · 28582 次点击
    这是一个创建于 3179 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用 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 感觉这循环有点问题,有时候会卡住没反应
    haython
        28
    haython  
       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
    haython
        33
    haython  
       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
    haython
        36
    haython  
       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 函数。
    haython
        58
    haython  
       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   ·   实用小工具   ·   1015 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 19:56 · PVG 03:56 · LAX 11:56 · JFK 14:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.