一、前言

由于在抖音上刷到微信机器人自动陪聊,心血来潮,自己利用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

pip install itchat

查看下载成功与否

python -c "import itchat"

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

五、简单示例

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

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

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()

代码执行结果

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

文件助手你好哦

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

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能做的有:查找群聊,往群聊发送信息,以及监控群聊信息,使用代码示例如下:

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()

代码执行结果如下:

完整的群聊列表如下:
[<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元素,使用代码示例如下:

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()

代码执行结果如下

[<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

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调用接口用的秘钥。

具体代码实现如下

import itchat
import requestsdef 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()

九、监控接收到的数据

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

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()

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

好友信息:  {'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(信息类型)。接着是群聊信息:

群聊信息:  {'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(信息类型)。改下我们的程序,把这些都提取打印出来。

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()

代码执行结果如下:

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

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

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

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,我们监听下看看,看看撤回的信息具体内容。

{'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去查存消息的字典,根据信息类型拼接文字或文字加文件,然后发送给文件传输助手。具体代码如下:!

@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分钟的信息和对应的文件。相关代码如下:

# 每隔五种分钟执行一次清理任务
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

$ 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,期待您的加入?

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

itchat实现微信聊天机器人,定时发送微信消息,消息防撤回,消息监控,自定义回复消息相关推荐

  1. python 微信聊天机器人_python操作微信自动发消息的实现(微信聊天机器人)

    前言 最近在学习python,发现一个微信自动发消息的小demo感觉很有意思,试了一下,不成功,因为demo中用的是itchat这个库来操作微信,而这个库是通过微信网页版来操作微信的,现在微信网页版已 ...

  2. 工作随记-Java利用企业微信群机器人定时发送消息

    hi,大家好,我是恰恰 阅读本文需要2分钟~ 最近利用企业微信群机器人做的需求主要有 1.返奖率通知与告警:抽奖箱能抽出垃圾也能抽出大货,每隔5分钟查询一下这个返奖率,如果用户频繁抽出大货,这个抽奖箱 ...

  3. 如何使用企业微信群机器人定时发送消息

    场景描述: 每天早上8点钟通过企业微信群机器人发消息提醒大家打卡.在Aboter中该如何实现呢? 步骤: 首先创建一个IPaaS流程,触发条件组件编辑区选择[定时触发]类型.编辑区进行如下设置: 拖动 ...

  4. python自动发送微信-Python自动定时发送微信消息

    如今微信已成为我们日常生活的主要交流工具,利用itchat库,我们可以发送微信消息,如果需要定时自动发送,则需要借助apscheduler库,关于apscheduler库,前一篇转载文章有专门的介绍. ...

  5. python微信聊天机器人_python实战项目,使用itchat模块制作微信聊天机器人

    前言 对于咱们热爱折腾的青年来说,经常会有很多好玩的新奇创意想法,可是,有时候就缺少一个接口,实现交互.比如说,咱们博客的 python实战项目,有些的确比较好玩,但是似乎只能在电脑上跑跑程序,怎么运 ...

  6. Itchat 微信聊天机器人

    微信聊天机器人(Itchat) 不务正业,想起干点啥有意思的事,于是想起了用聊天机器人去调戏微信好友也许会有点意思吧,于是参照别人写的东西,自己也浅尝一下.基本原理还是很简单的,就是让机器人替你去聊天 ...

  7. Windows下企业微信机器人定时发送消息

    Windows下企业微信机器人定时发送消息提醒(小白篇) - 简书 Windows terminal使用curl出现错误 - 简书 $url = "https://qyapi.weixin. ...

  8. 微信发送视频消息php,vbot微信聊天机器人微信聊天消息详解(5):视频消息

    <vbot微信聊天机器人微信聊天消息详解(5):视频消息>要点: 本文介绍了vbot微信聊天机器人微信聊天消息详解(5):视频消息,希望对您有用.如果有疑问,可以联系我们. 视频消息是资源 ...

  9. python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}

    相关文章和数据源: python自动化高效办公第二期,带你项目实战[一]{excel数据处理.批量化生成word模板.pdf和ppt等自动化操作} Python自动化办公--Pandas玩转Excel ...

最新文章

  1. 让你的javascript函数拥有记忆功能,降低全局变量的使用
  2. git工具 将源码clone到本地指定目录的三种方式
  3. awk批量修改文件名,awk用法
  4. linux shell取变量的子串26种方法实践
  5. html语言代码游戏,常用html语言代码
  6. java实例成员和类成员变量的区别_Java之实例成员与类成员
  7. 切换不同的数据状态布局,包含加载中、空数据和出错状态,可自定义状态布局
  8. 阿里云邀您参加 2020 年数据湖高峰会议
  9. 关于缓存击穿、缓存穿透、缓存雪崩及解决方案
  10. C语言实现HDB3编码与译码
  11. 社会工程学主要学习内容及书籍推荐
  12. 对比汇新云和猪八戒?
  13. 日常工作常用的几款小工具
  14. 电脑游戏计算机哪年发明的,电子计算机发明于哪一年
  15. 中山川田是一家什么样的企业
  16. 计算机控制系统陈振答案,北京理工大学自动化学院导师教师师资介绍简介-董 宁...
  17. 小甲鱼python入门_python基础笔记(非系统/自用/参考小甲鱼的零基础入门学习python)上...
  18. linux怎么生成sct文件,sct文件扩展名,sct文件怎么打开?
  19. Hive 正则表达式 判断字符串是否是数字(整数)
  20. python3 简单选课系统

热门文章

  1. Android正方形View
  2. 背景色渐变处理-linear-gradient
  3. Words Of Wisdom
  4. 如何在WooCommerce中创建智能优惠券
  5. html右侧导航栏固定,固定导航栏.html
  6. dorado Tip控件:信息提示组件
  7. mysql五中约束_大学计算机基础B答案
  8. Stata:Logit模型评介
  9. 怎么用HTML5制作万花筒,简易万花筒制作详细步骤 手工万花筒的做法图解
  10. 浪潮商用机器携手长亮科技和南大通用 打造基于GBase国产高端数据仓库方案