renzai 利用itchat搭建微信机器人详解

编辑:
发布时间: 2020-12-13 00:56:00
分享:

本文简介

好久没更新文章啦,因为最近在赶一本Py的入门书,碰巧今天把这篇文章赶出来了。 而很多加群的小朋友很多都是咨询如何搭建机器人的,所以就把这一章放出来了, 取需,三个实用示例:定时发信息,集成图灵API实现聊天机器人,防撤回实现,基本够玩了。 另外,改版了网页端,很多接口都开始用不了,比如拉人进群,可以通过无障碍服务或者 Xposed来解决,具体怎么玩可以参见前面的章节,谢谢。

2011年1月21日,推出第一个正式版本,到现在已有7个年头。从一开始的不被看到好,到现在的用户量超10亿,大众的日常生活越来越离不开。人生苦短我用Python,有没有办法通过Python来对我们使用提供一些便利呢? 答案肯定是有的,在Github上有一个基于网页版接口开源库:itchat,通过几十行的代码就能轻松实现一个机器人。本章我们就来了解学习这个库,然后通过三个实用案例来帮大家玩转这个库。

19.1 itchat库详解

我们跟着文档来解读下itchat这个库的用法。

19.1.1 文档与安装

itchat的仓库地址:https://github.com/littlecodersh/ItChat 官方文档:http://itchat.readthedocs.io

安装也很简单,直接通过pip命令安装即可,命令如下:

pip install itchat19.1.2 简单的使用示例

通过一个简单的例子来让读者体会下通过itchat编写一个机器人有多简单,代码功能: 扫码登录后给文件助手发送一条信息,监听接收到的文件信息,打印出来,具体代码如下。

import itchatimport time@itchat.msg_registerdef reply_msg: printif __name__ == "__main__": itchat.auto_login time.sleep itchat.send itchat.run

代码执行结果:

先会弹出一个二维码图片,扫描后会登陆网页端,间隔一会儿后文件助手收到如图19.1所示的信息

图19.1 文件传输助手收到信息

然后用另一个账号发送一条信息给这个账号,控制台会把接收到的信息打印出来

Getting uuid of QR code.Downloading QR code.Please scan the QR code to log in.Please press confirm on your phone.Loading the contact, this may take a little while.TERM environment variable not set.Login successfully as Robot PigStart auto replying.收到一条信息: 你好

通过上面8行有效代码就实现了一个简单的技巧人,酷不酷,带着这样的思路,我们可以进行扩展,比如添加一个自动回复的功能,比如在忙的时候,别人给你发信息,自动回复:”在忙,晚点给你回复信息”等。

19.2 使用itchat的注意事项

在学习itchat的详细用法前,先和读者说一些要注意的东西。

itchat不是官方提供的库,意味使用这个库会有风险,笔者的小号就曾被封过一段时间,禁止网页端登录,移动端和电脑客户端还是能正常使用的,此举旨在封杀泛滥的微商机器人。 如何减少被封概率:消息发送不要过于频繁;不要发送过多重复信息;尽量少调用加人的接口; 被封如何解封:被封后是无法找到申述入口,只能随缘解封,笔者在坚持了一周用手机聊天和朋友圈点赞留言后突然就解封了。 正在慢慢收窄网页端的功能,意味着一些接口会慢慢失效,比如说拉人进群聊的接口,以前还能用,现在就不行了。在调用某个接口没有得到意料中的结果,可能就是接口失效了,可以到官方仓库查找相关的issues。 只支持双端登录,不使用黑科技的话,移动端加上Web网页端或PC客户端。 新注册的号是无法使用网页版登录的。

最后,还是要感谢开源作者的无私奉献。

19.3 itchat详细用法

巧妇难为无米之炊,在扩展前先跟笔者把文档过一过,理解得差不多了,再开始去扩展,这样效率会高很多。

19.3.1 登陆

登陆时通过itchat.auto_login这个函数来完成的,不带参数的话会生成一个二维码图片文件供你扫描登陆。一般的话我们的电脑都会关机,如果机器人有需要持久在线的需求,我们可以把脚本挂到服务器上,24小时跑,但是一般的云服务器是没有界面的,都是通过终端命令行进行操作,这个时候可以添加enableCmdQR=True参数,让二维码显示到命令行上,另外部分系统可能字符宽度有出入,如图19.2所示,可以通过把enableCmdQR赋值为特定的倍数进行调整。

图19.2 命令行二维码错位

比如enableCmdQR=2后,二维码图片如图19.3所示

图19.3 调整后正常的二维码图片

扫码登录后,如果想退出程序以后还暂存登录状态,重新执行程序也不用扫码可以添加参数hotReload=True。

19.3.2 退出

如果在启动时没有设置hotReload=True参数,程序退出后过一会儿就会自动掉线的了,如果想快速退出的话可以调用itchat.logout注销登录状态。另外,有时我们可能想在登录成功或者注销登录后执行一些操作,可以添加两个调用登录时传入两个方法参数loginCallback和exitCallback,简单示例如下:

import itchatimport timedef after_login: printdef after_logout: printif __name__ == "__main__": itchat.auto_login time.sleep itchat.logout

代码执行结果如下:

Getting uuid of QR code.Downloading QR code.Please scan the QR code to log in.Please press confirm on your phone.Loading the contact, this may take a little while.登录后调用退出后调用19.3.3 查找用户

itchat提供四种查找用户的搜索方式,

获取自己的用户信息 示例如下:

# 获取自己的用户信息,返回自己的属性字典 result = itchat.search_friends print

代码执行结果如下:

{"MemberList": , "UserName": "@299f59697878267efb48e8cad07xxxxcadd0efbb63xxxxxxx0964c51f028e8474", "City": "", "DisplayName": "", "PYQuanPin": "", "RemarkPYInitial": "", "Province": "", "KeyWord": "", "RemarkName": "", "PYInitial": "", "EncryChatRoomId": "", "Alias": "", "Signature": "♡", "NickName": "Robot Pig", "RemarkPYQuanPin": "", "HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=1663312400&username=@299f59697878267efb48e8cad07f5f1cadd0efbb63ae19610964c51f028e8474&skey=@crypt_2d4a1972_5e7829c893346a53135fb03affa39f9c", "UniFriend": 0, "Sex": 2, "AppAccountFlag": 0, "VerifyFlag": 0, "ChatRoomId": 0, "HideInputBarFlag": 0, "AttrStatus": 0, "SnsFlag": 1, "MemberCount": 0, "OwnerUin": 0, "ContactFlag": 0, "Uin": 3454488193, "StarFriend": 0, "Statues": 0, "WebWxPluginSwitch": 0, "HeadImgFlag": 1}

根据昵称查询某个用户,代码示例如下:

# 根据姓名查找用户 result = itchat.search_friends print

代码执行结果如下:

[, "Uin": 0, "UserName": "@xxb096c3036543exx2d4de4fc222xxxx", "NickName": "培杰", "HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@40b096c3036543e5b2d4de4fc22208ed&skey=@crypt_2d4a1972_ac0122b1740b332921afc9f2fffa546f", "ContactFlag": 3, "MemberCount": 0, "RemarkName": "", "HideInputBarFlag": 0, "Sex": 1, "Signature": "Expectation is the root of all heartache.", "VerifyFlag": 0, "OwnerUin": 0, "PYInitial": "PJ", "PYQuanPin": "peijie", "RemarkPYInitial": "", "RemarkPYQuanPin": "", "StarFriend": 0, "AppAccountFlag": 0, "Statues": 0, "AttrStatus": 33783847, "Province": "广东", "City": "江门", "Alias": "", "SnsFlag": 17, "UniFriend": 0, "DisplayName": "", "ChatRoomId": 0, "KeyWord": "zpj", "EncryChatRoomId": "", "IsOwner": 0}>]

根据号查找用户,代码示例如下:

# 根据号查找用户 result = itchat.search_friends print

代码执行结果如下:

[, "Uin": 0, "UserName": "@xxb096c3036543exx2d4de4fc222xxxx", "NickName": "培杰", "HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@40b096c3036543e5b2d4de4fc22208ed&skey=@crypt_2d4a1972_ac0122b1740b332921afc9f2fffa546f", "ContactFlag": 3, "MemberCount": 0, "RemarkName": "", "HideInputBarFlag": 0, "Sex": 1, "Signature": "Expectation is the root of all heartache.", "VerifyFlag": 0, "OwnerUin": 0, "PYInitial": "PJ", "PYQuanPin": "peijie", "RemarkPYInitial": "", "RemarkPYQuanPin": "", "StarFriend": 0, "AppAccountFlag": 0, "Statues": 0, "AttrStatus": 33783847, "Province": "广东", "City": "江门", "Alias": "", "SnsFlag": 17, "UniFriend": 0, "DisplayName": "", "ChatRoomId": 0, "KeyWord": "zpj", "EncryChatRoomId": "", "IsOwner": 0}>]

另外,2和3功能可以同时使用,比如itchat.search_friends

根据UserName查找用户,就是上面返回结果里跟着的UserName字段,@xxxx这样一串东西,代码示例如下:

# 根据UserName查找用户 result = itchat.search_friends print

代码执行结果如下:

[, "Uin": 0, "UserName": "@xxb096c3036543exx2d4de4fc222xxxx", "NickName": "培杰", "HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@xxb096c3036543exx2d4de4fc222xxxx&skey=@crypt_2d4a1972_ac0122b1740b332921afc9f2fffa546f", "ContactFlag": 3, "MemberCount": 0, "RemarkName": "", "HideInputBarFlag": 0, "Sex": 1, "Signature": "Expectation is the root of all heartache.", "VerifyFlag": 0, "OwnerUin": 0, "PYInitial": "PJ", "PYQuanPin": "peijie", "RemarkPYInitial": "", "RemarkPYQuanPin": "", "StarFriend": 0, "AppAccountFlag": 0, "Statues": 0, "AttrStatus": 33783847, "Province": "广东", "City": "江门", "Alias": "", "SnsFlag": 17, "UniFriend": 0, "DisplayName": "", "ChatRoomId": 0, "KeyWord": "zpj", "EncryChatRoomId": "", "IsOwner": 0}>]19.3.4 发送信息

itchat提供了几个发送不同类型信息的函数,没有发送语音的原因是网页版没有这个接口,可供调用 的函数如表19.1所示。

函数名作用send_msg
相关阅读
热门精选
孩子 皮肤