Fork me on GitHub

python制作微信聊天机器人

python制作微信聊天机器人

周末心情不好搞了一个微信陪聊机器人陪我聊天。

本系列文章在 https://github.com/freestylefly/javaStudy 持(huan)续(ying)更(jia)新(ru)中,欢迎有兴趣的童鞋们关注。

目录

一、前言

由于在抖音上刷到微信机器人自动陪聊,心血来潮,自己利用itchat和图灵机器人实现了微信自动回复,监听消息,消息防撤回等。周末心情不好搞了一个微信陪聊机器人陪我聊天。

注意:

1、图灵机器人更新,对于新注册的号未认证每个号仅有2次请求,请注册后尽快完成身份认证。

2、用到了python的部分知识(不会也无关紧要),会安装即可。

3、有很多人想用自己的微信小号进行玩耍,但不幸的是,微信官方已经禁止这种行为,其实自动回复机器人本质是基于微信网页版原理实现的,也就是说很多微信小号,连微信网页版都被限制了不能登录,那么这个机器人是不会成功的。所以,首先确保微信能登上网页版。

4、关于安全问题,由于itchat是别人开发的开源库,有没有安全风险暂时不得而知。在开始测试前请确保你已知悉相应的风险。

二、itchat库详解

itchat的仓库地址https://github.com/littlecodersh/ItChat

itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单

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

。。。。。

三、Python下载与安装

下载地址:https://www.python.org/downloads/windows/(官网地址)下载最新版本3.7.3

点击download windows x86-64 executable installer下载windows64位exe可执行性文件

详细 下载安装步骤参考:https://blog.csdn.net/mingzhuo_126/article/details/81239156

下载完后,键盘按下win,输入python,可以看到Python3.7和IDLE Python

四、itchat库下载

打开cmd或者Python3.7

1
pip install itchat

查看下载成功与否

1
python -c "import itchat"

如果没有报错信息说明你已经将实验环境安装完成。

五、简单示例

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

注意:接下来的代码均在Python3.7客户端运行

1
2
3
4
5
6
7
8
9
10
11
12
13
import itchat
import time

@itchat.msg_register(itchat.content.TEXT)
def reply_msg(msg):
print("收到一条信息:",msg.text)


if __name__ == '__main__':
itchat.auto_login()
time.sleep(5)
itchat.send("文件助手你好哦", toUserName="filehelper")
itchat.run()

代码执行结果

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

文件助手你好哦

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

1
2
3
4
5
6
7
8
9
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 Pig
Start auto replying.
收到一条信息: 你好

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

六、群聊

在微信网页端改版后,创建群聊、拉人进群和删除群聊这几个接口都用不了,现在利用itchat能做的有:查找群聊,往群聊发送信息,以及监控群聊信息,使用代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import itchat
import time


@itchat.msg_register(itchat.content.TEXT, isGroupChat=True)
def reply_msg(msg):
print("收到一条群信息:", msg['ActualNickName'], msg['Content'])


def after_login():
# 获得完整的群聊列表
print("完整的群聊列表如下:")
print(itchat.get_chatrooms())
# 查找特定群聊
time.sleep(10)
# 通过群聊名查找
chat_rooms = itchat.search_chatrooms(name='小猪的Python学习交流群')
if len(chat_rooms) > 0:
itchat.send_msg('测试', chat_rooms[0]['UserName'])


if __name__ == '__main__':
itchat.auto_login(loginCallback=after_login)
itchat.run()

代码执行结果如下:

1
2
3
4
5
完整的群聊列表如下:
[<Chatroom: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@@60dc5027bbbb83d532aa633b8d126szcf497a98ceea5c098d2c65f0932139b88', 'NickName': '湖北人在深圳90后', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgetheadimg?seq=625714901&username=@@60dc502769a783d532aa633b8d126190f497a98ceea5c098d2c65f0932139b88&skey=@crypt_2d4a1972_ea00536c8ac4e35fae1c2a1c48dfe40d', 'ContactFlag': 3, 'MemberCount': 82, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 0, 'Signature': '', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'HBRZSZ90H', 'PYQuanPin': 'hubeirenzaishenzhen90hou', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 0, 'Province': '', 'City': '', 'Alias': '', 'SnsFlag': 0, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': '', 'EncryChatRoomId': '', 'IsOwner': 0, 'IsAdmin': None, 'Self': <User: {'MemberList': <ContactList: []>, 'UserName': '@29b9cb6386352503319f411754e7424e383ae09e50a224feca754a4516db6a13', 'City': '', 'DisplayName': '', 'PYQuanPin': '', 'RemarkPYInitial': '', 'Province': '', 'KeyWord': '', 'RemarkName': '', 'PYInitial': '', 'EncryChatRoomId': '', 'Alias': '', 'Signature': '(´v`o)♡', 'NickName': 'Robot Pig', 'RemarkPYQuanPin': '', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=275167114&username=@29b9cb6386352503319f411754e7424e383ae09e50a224feca754a4516db6a13&skey=@crypt_2d4a1972_ea00536c8ac4e35fae1c2a1c48dfe40d', '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}>}> 内容过多省略... ]

收到一条群信息: 培杰 123
收到一条群信息: 培杰 你好

另外,群聊除了通过群名搜索外还可以通过username来查找,或者两者搭配使用;
在msg里有一个isAt字段,可用于判断是否被人@了

使用方式和群聊的非常类似,搜索公众号方法search_mps,监听公众号信息添加isMpChat=True元素,使用代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import itchat


@itchat.msg_register(itchat.content.TEXT, isMpChat=True)
def reply_msg(msg):
print("收到一条公众号信息:", msg['User']['NickName'], msg['Content'])


def login_after():
mps = itchat.search_mps(name='CoderPig')
if len(mps) > 0:
print(mps)
itchat.send_msg('人生苦短', toUserName=mps[0]['UserName'])


if __name__ == '__main__':
itchat.auto_login(loginCallback=login_after)
itchat.run()

代码执行结果如下

1
2
3
[<MassivePlatform: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@07585e92f75be7320e49627cf0c3ad43', 'NickName': 'CoderPig', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=610904174&username=@07585e92f75be7320e49627cf0c3ad43&skey=@crypt_2d4a1972_bc443bf966f94fa11f2db8f812e456cf', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 0, 'Signature': '一枚咸鱼Android开发,会点Python,分享点学习经验,总结,鸡汤,读书笔记,生活技巧', 'VerifyFlag': 8, 'OwnerUin': 0, 'PYInitial': 'CODERPIG', 'PYQuanPin': 'CoderPig', 'RemarkPYInitial': '', 'RemarkPYQuanPin': '', 'StarFriend': 0, 'AppAccountFlag': 0, 'Statues': 0, 'AttrStatus': 0, 'Province': '广东', 'City': '深圳', 'Alias': '', 'SnsFlag': 0, 'UniFriend': 0, 'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': 'gh_', 'EncryChatRoomId': '', 'IsOwner': 0}>]

收到一条公众号信息: CoderPig 我用Python

七、定时发送消息

定时发送信息这个操作在日常生活中非常实用,比如给别人发生日或者节日祝福,晚上12点准时发,如果有早睡习惯的要熬到12点就很难受了,我们可以利用itchat编写一个简单的定时发送信息脚本。这里我们用到一个apscheduler定时调度任务模块,在命令行键入pip install apscheduler即可完成安装。这里并不会详细讲解,有兴趣的可移步到官方文档自行查阅:http://apscheduler.readthedocs.io/en/latest/userguide.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import itchat
from apscheduler.schedulers.blocking import BlockingScheduler
import time


# 发送信息
def send_msg():
user_info = itchat.search_friends(name='培杰')
if len(user_info) > 0:
user_name = user_info[0]['UserName']
itchat.send_msg('生日快乐哦!', toUserName=user_name)


def after_login():
sched.add_job(send_msg, 'cron', year=2018, month=7, day=28, hour=16, minute=5, second=30)
sched.start()


def after_logout():
sched.shutdown()


if __name__ == '__main__':
sched = BlockingScheduler()
itchat.auto_login(loginCallback=after_login, exitCallback=after_login)
itchat.run()

这个可以用来撩妹最不错了,每天定时的早安晚安,绝对一秒都不会落

八、集成图灵API制作聊天机器人

图灵机器人官网:http://www.tuling123.com/member/robot/index.jhtml

注册一个账号后,点击创建机器人,由于最近刚刚整改,必须经过实名认证才可以调用

在调用前可以在postman里面测试一下图灵机器人的魔力。测试可以参考官方文档:

https://www.kancloud.cn/turing/www-tuling123-com/718227

注册一个账号后,点击创建机器人,会弹出如图所示的面板,按需配置下即可。

这里记下apikey调用接口用的秘钥。

具体代码实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import itchat
import requests

def get_response(_info):
print(_info) # 从好友发过来的消息
api_url = 'http://www.tuling123.com/openapi/api' # 图灵机器人网址
data = {
'key': '这里写apiKey', # 如果这个 apiKey 如不能用,那就注册一次
'info': _info, # 这是我们从好友接收到的消息 然后转发给图灵机器人
'userid': 'wechat-robot', # 这里你想改什么都可以
}
r = requests.post(api_url, data=data).json() # 把data数据发
print(r.get('text')) # 机器人回复给好友的消息
return r

@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
return "【我是天才^_^】" + get_response(msg["Text"])["text"]

if __name__ == '__main__':
itchat.auto_login(hotReload=True,enableCmdQR=2) # hotReload = True, 保持在线,下次运行代码可自动登录,可以添加enableCmdQR=True参数,让二维码显示到命令行上,另外部分系统可能字符宽度有出入,可以通过把enableCmdQR赋值为特定的倍数进行调整。如设置值为2
itchat.run()

九、监控接收到的数据

先是监控信息,信息又分为好友聊天和群聊,我们编写代码来监控下收到的数据是怎么样的?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import itchat
from itchat.content import *


# 好友信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True)
def handle_friend_msg(msg):
print("好友信息: ", msg)


# 群聊信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isGroupChat=True)
def information(msg):
print("群聊信息: ", msg)


if __name__ == '__main__':
itchat.auto_login()
itchat.run()

给机器人发送一条信息,还有往群聊里发送一条信息,查看打印的信息内容,先是好友信息

1
好友信息:  {'MsgId': '5500935424291030814', 'FromUserName': '@8fd8b5b2bd0862ed5d0d573bc6c08362', 'ToUserName': '@913c3124d973db6ae25924bd0598b48a0028e0c2d01e18d8095cc6fd58db116b', 'MsgType': 1, 'Content': '123', 'Status': 3, 'ImgStatus': 1, 'CreateTime': 1533010285, 'VoiceLength': 0, 'PlayLength': 0, 'FileName': '', 'FileSize': '', 'MediaId': '', 'Url': '', 'AppMsgType': 0, 'StatusNotifyCode': 0, 'StatusNotifyUserName': '', 'RecommendInfo': {'UserName': '', 'NickName': '', 'QQNum': 0, 'Province': '', 'City': '', 'Content': '', 'Signature': '', 'Alias': '', 'Scene': 0, 'VerifyFlag': 0, 'AttrStatus': 0, 'Sex': 0, 'Ticket': '', 'OpCode': 0}, 'ForwardFlag': 0, 'AppInfo': {'AppID': '', 'Type': 0}, 'HasProductId': 0, 'Ticket': '', 'ImgHeight': 0, 'ImgWidth': 0, 'SubMsgType': 0, 'NewMsgId': 5500935424291030814, 'OriContent': '', 'EncryFileName': '', 'User': <User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@8fd8b5b2bd0862ed5d0d573bc6c08362', 'NickName': 'CoderPig', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@8fd8b5b2bd0862ed5d0d573bc6c08362&skey=@crypt_2d4a1972_26dc3be99a177455b82518b3ca6e6cc5', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': '不服气,就用行动去证明,少说多做...2018.7.29', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'CODERPIG', 'PYQuanPin': 'CoderPig', '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}>, 'Type': 'Text', 'Text': '123'}

分析下要采集的数据,MsgId(微信信息的标识,用来作为键),NickName(发送者的用户名),Content(信息内容),CreateTime(创建时间), Type(信息类型)。接着是群聊信息:

1
群聊信息:  {'MsgId': '3177606925001563512', 'FromUserName': '@@16521484d35b2fe9c953282d98ec4f11456607924b3a7cc6d7fb671fe7e3081c', 'ToUserName': '@913c3124d973db6ae25924bd0598b48a0028e0c2d01e18d8095cc6fd58db116b', 'MsgType': 1, 'Content': '嘿嘿', 'Status': 3, 'ImgStatus': 1, 'CreateTime': 1533010298, 'VoiceLength': 0, 'PlayLength': 0, 'FileName': '', 'FileSize': '', 'MediaId': '', 'Url': '', 'AppMsgType': 0, 'StatusNotifyCode': 0, 'StatusNotifyUserName': '', 'RecommendInfo': {'UserName': '', 'NickName': '', 'QQNum': 0, 'Province': '', 'City': '', 'Content': '', 'Signature': '', 'Alias': '', 'Scene': 0, 'VerifyFlag': 0, 'AttrStatus': 0, 'Sex': 0, 'Ticket': '', 'OpCode': 0}, 'ForwardFlag': 0, 'AppInfo': {'AppID': '', 'Type': 0}, 'HasProductId': 0, 'Ticket': '', 'ImgHeight': 0, 'ImgWidth': 0, 'SubMsgType': 0, 'NewMsgId': 3177606925001563512, 'OriContent': '', 'EncryFileName': '', 'ActualNickName': '易♂建♂联', 'IsAt': False, 'ActualUserName': '@8fd8b5b2bd0862ed5d0d573bc6c08362', 'User':

同样分析下要采集的数据,MsgId(微信信息的标识),ActualNickName(发送者群名称),Content(信息内容),CreateTime(创建时间), Type(信息类型)。改下我们的程序,把这些都提取打印出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import itchat
from itchat.content import *


# 好友信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True)
def handle_friend_msg(msg):
msg_id = msg['MsgId']
msg_from_user = msg['User']['NickName']
msg_content = msg['Content']
msg_create_time = msg['CreateTime']
msg_type = msg['Type']
print("收到信息: ", msg_id, msg_from_user, msg_content, msg_create_time,msg_type)


# 群聊信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isGroupChat=True)
def information(msg):
msg_id = msg['MsgId']
msg_from_user = msg['ActualNickName']
msg_content = msg['Content']
msg_create_time = msg['CreateTime']
msg_type = msg['Type']
print("群聊信息: ",msg_id, msg_from_user, msg_content, msg_create_time,msg_type)


if __name__ == '__main__':
itchat.auto_login()
itchat.run()

代码执行结果如下:

1
2
3
4
群聊信息:  2254622820807367335 胡小韬 对手公司 1533023277 Text
群聊信息: 1765614482944449471 xia_ang 还有自干五 1533023285 Text
好友信息: 615083621872361432 CoderPig 哈哈 1533023293 Text
好友信息: 7292909308782687092 CoderPig 你好哦 1533023302 Text

十、验证不同信息类型和对应处理方式

嗯,信息提取成功,接下来要验证的是不同的信息类型和对应的处理方式,文字,图片(表情),音频,视频,文件五种,后面四种都需要下载到本地,itchat中提供了一个下载文件的方法msg‘Text’,调用这个方法即可完成文件下载,修改后的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import itchat
from itchat.content import *
import os
import time

# 文件临时存储页
rec_tmp_dir = os.path.join(os.getcwd(), 'tmp/')

# 存储数据的字典
rec_msg_dict = {}


# 好友信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True)
def handle_friend_msg(msg):
msg_id = msg['MsgId']
msg_from_user = msg['User']['NickName']
msg_content = ''
# 收到信息的时间
msg_time_rec = time.strftime("%Y-%m-%d %H:%M%S", time.localtime())
msg_create_time = msg['CreateTime']
msg_type = msg['Type']

if msg['Type'] == 'Text':
msg_content = msg['Content']
elif msg['Type'] == 'Picture' \
or msg['Type'] == 'Recording' \
or msg['Type'] == 'Video' \
or msg['Type'] == 'Attachment':
msg_content = r"" + msg['FileName']
msg['Text'](rec_tmp_dir + msg['FileName'])
rec_msg_dict.update({
msg_id: {
'msg_from_user': msg_from_user,
'msg_time_rec': msg_time_rec,
'msg_create_time': msg_create_time,
'msg_type': msg_type,
'msg_content': msg_content
}
})
print(msg)


# 群聊信息监听
@itchat.msg_register([TEXT, PICTURE, RECORDING, ATTACHMENT, VIDEO], isGroupChat=True)
def information(msg):
msg_id = msg['MsgId']
msg_from_user = msg['ActualNickName']
msg_content = ''
# 收到信息的时间
msg_time_rec = time.strftime("%Y-%m-%d %H:%M%S", time.localtime())
msg_create_time = msg['CreateTime']
msg_type = msg['Type']

if msg['Type'] == 'Text':
msg_content = msg['Content']
elif msg['Type'] == 'Picture' \
or msg['Type'] == 'Recording' \
or msg['Type'] == 'Video' \
or msg['Type'] == 'Attachment':
msg_content = r"" + msg['FileName']
msg['Text'](rec_tmp_dir + msg['FileName'])
rec_msg_dict.update({
msg_id: {
'msg_from_user': msg_from_user,
'msg_time_rec': msg_time_rec,
'msg_create_time': msg_create_time,
'msg_type': msg_type,
'msg_content': msg_content
}
})
print(msg)


if __name__ == '__main__':
if not os.path.exists(rec_tmp_dir):
os.mkdir(rec_tmp_dir)
itchat.auto_login()
itchat.run()

十一、监控撤回信息和数据提取

接着到撤回信息的监控,撤回的信息类型是NOTE,我们监听下看看,看看撤回的信息具体内容。

1
{'MsgId': '7399110162640182490', 'FromUserName': '@9c1a8bf4e28771a6b3ab635991dea2a1', 'ToUserName': '@49d1d90b90371099297a08da1009f3cdd042f21194239ef47b60e8f0b52e4553', 'MsgType': 10002, 'Content': '<sysmsg type="revokemsg"><revokemsg><session>zpj779878443</session><oldmsgid>1625723544</oldmsgid><msgid>3154925139554625499</msgid><replacemsg><![CDATA["CoderPig" 撤回了一条消息]]></replacemsg></revokemsg></sysmsg>', 'Status': 4, 'ImgStatus': 1, 'CreateTime': 1533103679, 'VoiceLength': 0, 'PlayLength': 0, 'FileName': '', 'FileSize': '', 'MediaId': '', 'Url': '', 'AppMsgType': 0, 'StatusNotifyCode': 0, 'StatusNotifyUserName': '', 'RecommendInfo': {'UserName': '', 'NickName': '', 'QQNum': 0, 'Province': '', 'City': '', 'Content': '', 'Signature': '', 'Alias': '', 'Scene': 0, 'VerifyFlag': 0, 'AttrStatus': 0, 'Sex': 0, 'Ticket': '', 'OpCode': 0}, 'ForwardFlag': 0, 'AppInfo': {'AppID': '', 'Type': 0}, 'HasProductId': 0, 'Ticket': '', 'ImgHeight': 0, 'ImgWidth': 0, 'SubMsgType': 0, 'NewMsgId': 7399110162640182490, 'OriContent': '', 'EncryFileName': '', 'User': <User: {'MemberList': <ContactList: []>, 'Uin': 0, 'UserName': '@9c1a8bf4e28771a6b3ab635991dea2a1', 'NickName': 'CoderPig', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=625711027&username=@9c1a8bf4e28771a6b3ab635991dea2a1&skey=@crypt_2d4a1972_e0963a9b961045c2e06293043f1c98a8', 'ContactFlag': 3, 'MemberCount': 0, 'RemarkName': '', 'HideInputBarFlag': 0, 'Sex': 1, 'Signature': '不服气,就用行动去证明,少说多做...2018.7.29', 'VerifyFlag': 0, 'OwnerUin': 0, 'PYInitial': 'CODERPIG', 'PYQuanPin': 'CoderPig', '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}>, 'Type': 'Note', 'Text': '"CoderPig" 撤回了一条消息'}

首先是判断系统信息是默认撤回了一条信息,内容是:

显示判断是否是撤回的信息,从上面可以看到这样的串字符串:<![CDATA[“CoderPig” 撤回了一条消息]]>,我们只需要写个正则判断是否有这样的内容,有说明是撤回的信息提醒,接着找撤回的信息MsgId,在上面这串信息的前面就是了:3154925139554625499,同样用正则提取。接着要做的就是拿着MsgId去查存消息的字典,根据信息类型拼接文字或文字加文件,然后发送给文件传输助手。具体代码如下:!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@itchat.msg_register([NOTE], isFriendChat=True, isGroupChat=True)
def revoke_msg(msg):
if revoke_msg_compile.search(msg['Content']) is not None:
old_msg_id = extract_msgid_compile.search(msg['Content']).group(1)
old_msg = rec_msg_dict.get(old_msg_id, {})
# 先发送一条文字信息
itchat.send_msg(str(old_msg.get('msg_from_user') + "撤回了一条信息:"
+ old_msg.get('msg_content')), toUserName="filehelper")
# 判断文msg_content是否存在,不存在说明可能是
if os.path.exists(os.path.join(rec_tmp_dir, old_msg.get('msg_content'))):
if old_msg.get('msg_type') == 'Picture':
itchat.send_image(os.path.join(rec_tmp_dir, old_msg.get('msg_content')),
toUserName="filehelper")
elif old_msg.get('msg_type') == 'Video':
itchat.send_video(os.path.join(rec_tmp_dir, old_msg.get('msg_content')),
toUserName="filehelper")
elif old_msg.get('msg_type') == 'Attachment' \
or old_msg.get('msg_type') == 'Recording':
itchat.send_file(os.path.join(rec_tmp_dir, old_msg.get('msg_content')),
toUserName="filehelper")

十二、定时清理缓存

另外,我们的信息都是用一个字典存着的,时间长了的话,数据会很多,而且图片文件这些会越攒越多,我们可以添加一个定时任务,比如每隔五分钟清理一下创建时长超过2分钟的信息和对应的文件。相关代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 每隔五种分钟执行一次清理任务
def clear_cache():
# 当前时间
cur_time = time.time()
# 遍历字典,如果有创建时间超过2分钟(120s)的记录,删除,非文本的话,连文件也删除
for key in list(rec_msg_dict.keys()):
if int(cur_time) - int(rec_msg_dict.get(key).get('msg_create_time')) > 120:
if not rec_msg_dict.get(key).get('msg_type') == 'Text':
file_path = os.path.join(rec_tmp_dir, rec_msg_dict.get(key).get('msg_content'))
print(file_path)
if os.path.exists(file_path):
os.remove(file_path)
rec_msg_dict.pop(key)

# 开始轮询任务
def start_schedule():
sched.add_job(clear_cache, 'interval', minutes=2)
sched.start()


# 退出停止所有任务并清空缓存文件夹
def after_logout():
sched.shutdown()
shutil.rmtree(rec_tmp_dir)

if __name__ == '__main__':
sched = BlockingScheduler()
if not os.path.exists(rec_tmp_dir):
os.mkdir(rec_tmp_dir)
itchat.auto_login(exitCallback=after_logout)
itchat.run(blockThread=False)
start_schedule()

感谢:

https://blog.csdn.net/fxbin123/article/details/80428216

https://www.kancloud.cn/turing/www-tuling123-com/718227

https://www.cnblogs.com/sunshine-long/p/8522175.html

https://www.shiyanlou.com/courses/684/labs/2237/document/#%E4%B8%80%E3%80%81%E8%AF%BE%E7%A8%8B%E4%BB%8B%E7%BB%8D

https://github.com/littlecodersh/ItChat

https://blog.csdn.net/coder_pig/article/details/81357810#commentsedit

十三、部署到云服务器实现24小时在线陪聊

以上都是在本地进行测试,电脑不可能24小时开着,浪费电浪费钱。故讲本脚本上云。即上云服务器。
1、百度云服务器
我购买的是百度云服务器,采用新注册的账号,有折扣活动,三个月五十几,配置1核1G,已经完全够用,系统是CentOs7,里面自带的python版本是2.7(如非特殊需要,可以暂时不用下载最新版的python,我就是因为想下载最新版本的python,结果搞来搞去,把服务器搞坏了,打电话给了百度云客服,工程师很快给我解决了,我重新安装了下系统后决定用系统自带的python版本,几步轻松搞定)。

2、服务器默认是没有安装pip的,所以先要安装pip

1
2
3
$ wget https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py
$ pip -V  #查看pip版本

接下来就可以随便pip安装东西了
按照上面的步骤安装itchat,登录的时候,可以添加enableCmdQR=True参数,让二维码显示到命令行上,另外部分系统可能字符宽度有出入,可以通过把enableCmdQR赋值为特定的倍数进行调整(我设置的是2)。

3、讲脚本保存为.py文件
下载资源:评论留“我要资源” ,即可,我会发给你
或者直接点击:下载资源
PS:资源理论上是可以直接运行的,如果有不能运行的情况欢迎咨询我。
在这里插入图片描述

十五、成果展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十六、关于我

-——-

# 本文章已同步至我的GitHub仓库:Javastudy,期待您的加入:blush:

在这里插入图片描述

# 本文章已同步至苍何的个人博客,可以直接在博客上留言哦:blush:

在这里插入图片描述

苍 何 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!