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

有了 itchat, python 调用微信个人号从未如此简单(新增 py3 支持)

  •  7
     
  •   NxnXgpuPSfsIT ·
    littlecodersh · 2016-09-17 20:43:43 +08:00 · 45416 次点击
    这是一个创建于 2991 天前的主题,其中的信息可能已经有所发展或是发生改变。

    itchat 是一个开源的微信个人号接口。

    近期完成了 py3 与文档的完善,欢迎各位使用与测试。

    使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。

    当然,该 api 的使用远不止一个机器人,更多的功能等着你来发现。

    如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号、方便自己的生活。

    Installation

    可以通过本命令安装 itchat :

    pip install itchat
    

    Simple uses

    有了 itchat ,如果你想要回复发给自己的文本消息,只需要这样:

    import itchat
    
    @itcaht.msg_register(itchat.content.TEXT)
    def text_reply(msg):
        itchat.send(msg['Text'], msg['FromUserName'])
    
    itchat.auto_login()
    itchat.run()
    

    一些进阶应用可以在 Advanced uses 中看到,或者你也可以阅览文档

    Have a try

    这是一个基于这一项目的开源小机器人,百闻不如一见,有兴趣可以尝试一下。

    QRCode

    Advanced uses

    各类型消息的注册

    通过如下代码,微信已经可以就日常的各种信息进行获取与回复。

    #coding=utf8
    import itchat, time
    from itchat.content import *
    
    @itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
    def text_reply(msg):
        itchat.send('%s: %s' % (msg['Type'], msg['Text']), msg['FromUserName'])
    
    @itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
    def download_files(msg):
        msg['Text'](msg['FileName'])
        return '@%s@%s' % ({'Picture': 'img', 'Video': 'vid'}.get(msg['Type'], 'fil'), msg['FileName'])
    
    @itchat.msg_register(FRIENDS)
    def add_friend(msg):
        itchat.add_friend(**msg['Text']) # 该操作会自动将新好友的消息录入,不需要重载通讯录
        itchat.send_msg('Nice to meet you!', msg['RecommendInfo']['UserName'])
    
    @itchat.msg_register(TEXT, isGroupChat=True)
    def text_reply(msg):
        if msg['isAt']:
            itchat.send(u'@%s\u2005I received: %s' % (msg['ActualNickName'], msg['Content']), msg['FromUserName'])
    
    itchat.auto_login(True)
    itchat.run()
    

    命令行二维码

    通过以下命令可以在登陆的时候使用命令行显示二维码:

    itchat.auto_login(enableCmdQR=True)
    

    部分系统可能字幅宽度有出入,可以通过将 enableCmdQR 赋值为特定的倍数进行调整:

    # 如部分的 linux 系统,块字符的宽度为一个字符(正常应为两字符),故赋值为 2
    itchat.auto_login(enableCmdQR=2)
    

    默认控制台背景色为暗色(黑色),若背景色为浅色(白色),可以将 enableCmdQR 赋值为负值:

    itchat.auto_login(enableCmdQR=-1)
    

    退出程序后暂存登陆状态

    通过如下命令登陆,即使程序关闭,一定时间内重新开启也可以不用重新扫码。

    itchat.auto_login(hotReload=True)
    

    用户搜索

    使用get_friends方法可以搜索用户,有四种搜索方式:

    1. 仅获取自己的用户信息
    2. 获取特定UserName的用户信息
    3. 获取备注、微信号、昵称中的任何一项等于name键值的用户
    4. 获取备注、微信号、昵称分别等于相应键值的用户

    其中三、四项可以一同使用,下面是示例程序:

    # 获取自己的用户信息,返回自己的属性字典
    itchat.get_friends()
    # 获取特定 UserName 的用户信息
    itchat.get_friends(userName='@abcdefg1234567')
    # 获取任何一项等于 name 键值的用户
    itchat.get_friends(name='littlecodersh')
    # 获取分别对应相应键值的用户
    itchat.get_friends(wechatAccount='littlecodersh')
    # 三、四项功能可以一同使用
    itchat.get_friends(name='LittleCoder 机器人', wechatAccount='littlecodersh')
    

    附件的下载与发送

    itchat 的附件下载方法存储在 msg 的 Text 键中。

    发送的文件的文件名(图片给出的默认文件名)都存储在 msg 的 FileName 键中。

    下载方法接受一个可用的位置参数(包括文件名),并将文件相应的存储。

    @itchat.msg_register(['Picture', 'Recording', 'Attachment', 'Video'])
    def download_files(msg):
        msg['Text'](msg['FileName'])
        itchat.send('@%s@%s'%('img' if msg['Type'] == 'Picture' else 'fil', msg['FileName']), msg['FromUserName'])
        return '%s received'%msg['Type']
    

    如果你不需要下载到本地,仅想要读取二进制串进行进一步处理可以不传入参数,方法将会返回图片的二进制串。

    @itchat.msg_register(['Picture', 'Recording', 'Attachment', 'Video'])
    def download_files(msg):
        with open(msg['FileName'], 'wb') as f:
            f.write(msg['Text']())
    

    FAQ

    Q: 为什么中文的文件没有办法上传?

    A: 这是由于requests的编码问题导致的。若需要支持中文文件传输,将fields.py(py3 版本见这里)文件放入 requests 包的 packages/urllib3 下即可

    Q: 为什么我在设定了itchat.auto_login()enableCmdQRTrue后还是没有办法在命令行显示二维码?

    A: 这是由于没有安装可选的包pillow,可以使用右边的命令安装:pip install pillow

    Q: 如何通过这个包将自己的微信号变为控制器?

    A: 有两种方式:发送、接受自己 UserName 的消息;发送接收文件传输助手( filehelper )的消息

    Comments

    如果有什么问题或者建议都可以在这个Issue和我讨论

    或者也可以在 gitter 上交流:Gitter

    15 条回复    2017-06-21 16:52:13 +08:00
    uucloud
        1
    uucloud  
       2016-09-17 22:35:37 +08:00
    po 主知道微信第三方验证的时候那个 code 字段是怎么得到的吗?可不可以直接通过 python 完成和微信第三方的交互,比如签到。
    bearqq
        2
    bearqq  
       2016-09-17 22:45:10 +08:00 via Android
    上周才用这个搞了个微信端 bot ,接 char-rnn 神经网络,折腾着玩。
    挺稳定,没掉过。
    要说不满的话,命令行的二维码太大,我得退几步才能扫码。。
    airqj
        3
    airqj  
       2016-09-17 22:53:11 +08:00
    已 start :)
    bao3
        4
    bao3  
       2016-09-18 00:28:09 +08:00 via Android
    heiybb
        5
    heiybb  
       2016-09-18 00:31:41 +08:00
    赞,最近的小玩具应该会用上,已 STAR
    dreamcog
        6
    dreamcog  
       2016-09-18 00:34:09 +08:00 via iPhone
    fy
        7
    fy  
       2016-09-18 01:53:24 +08:00
    资瓷 收藏一发
    ben3ai
        8
    ben3ai  
       2016-09-18 07:05:43 +08:00 via iPhone
    资瓷 收藏一发
    pubuntu
        9
    pubuntu  
       2016-09-18 08:28:22 +08:00 via Android
    非常好。赞赞
    Gothack
        10
    Gothack  
       2016-09-18 08:44:37 +08:00 via iPhone
    好东西 果断收藏
    NxnXgpuPSfsIT
        11
    NxnXgpuPSfsIT  
    OP
       2016-09-18 10:46:47 +08:00
    @uucloud 不知道,这方面没有做过研究。
    NxnXgpuPSfsIT
        12
    NxnXgpuPSfsIT  
    OP
       2016-09-18 10:53:25 +08:00
    @bearqq 命令行显示的话是会有些大,因为为了达到最大的兼容,用的字符的形式拼成的二维码。
    如果想要二维码小一些的话可以试试看直接显示图片或者自定义登录过程。
    omegatao
        13
    omegatao  
       2017-04-18 20:37:59 +08:00
    非常非常赞
    randix
        14
    randix  
       2017-06-12 16:17:22 +08:00
    get_friends 这个方法是搜索本地的用户的吗?
    HanningWu
        15
    HanningWu  
       2017-06-21 16:52:13 +08:00
    add_friends 是用于添加新好友?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1048 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 20:16 · PVG 04:16 · LAX 12:16 · JFK 15:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.