python接收微信消息_【Python写微信防撤回脚本】02 接收记录聊天信息

上一期我们安装好了ItChat,并且学会用它登录微信。想知道它还能做什么?往下滑吧~

接收好友信息

利用ItChat登录微信之后,我们就可以自动记录好友发来的信息。

话不多说,直接上代码:

import itchat

from itchat.content import TEXT

@itchat.msg_register([TEXT])

def text_reply(msg):

# 谁, 发了什么消息

sender_name = msg['User']['NickName']

content = str(msg['Text'])

print('{} 发给你一条消息: {}'.format(sender_name, content))

运行之后,如果有好友发送信息,控制台会输出类似下面的信息:

想要自动记录好友发来的信息,就必须先注册一个方法,并用itchat.msg_register()装饰它。注意,要接收文本信息,必须给这个装饰器传入[TEXT]这样的参数。

当好友发来消息会自动进入text_reply方法,这条消息的所有信息都在msg对象里。如代码所示,发送者的昵称、发送的内容都可以从这个对象中取出。最后程序会在命令提示符中打印出格式为“谁给你发了一条什么样的信息”的信息。

但是当好友发来的消息不是纯文本,上面的代码是无法捕获的。好在强大的ItChat不只是支持接收文本信息,还能接收图片、分享的链接、位置等各种消息类型。只需要像下面一样声明,就可以自动接收其他种类的信息:

@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])

def text_reply(msg):

pass

当然,如果要支持其他类型的消息,还要提前把这些消息类型引入:

from itchat.content import TEXT, MAP, CARD, NOTE, SHARING

或者想偷懒也可以像我这样不管三七二十一,一股脑儿全部导入:

from itchat.content import *

这样,好友发的大多数种类的消息都能进入我们的代码。进入代码之后,我们能做的就多了。比如这时好友分享给我一篇文章,代码就能捕获并在控制台输出:

当然,msg对象里面还有对应的网址信息,有兴趣的同学可以自己去探索。

缓存好友信息

由于我们的需求只是缓存近几分钟好友发过来的信息,没有必要用到那些专业的数据库,甚至没必要存储到本地文件中,反而一个简单的字典就能满足要求。

有时候我们会利用“文件传输助手”传输信息,这部分信息我们是不关心的,代码要能处理这种例外。代码如下:

import itchat

from itchat.content import *

import time

log = {}

@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])

def text_reply(msg):

timestamp = time.time()

formatted_timestamp = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(timestamp))

# 为了程序的鲁棒性,避免因msg['User']没有'NickName'键而出错

if 'NickName' in msg['User']:

sender_name = msg['User']['NickName']

if sender_name != 'filehelper':

content = str(msg['Text'])

print('{}, {} 发来消息: {}'.format(formatted_timestamp, sender_name, content))

if sender_name not in log:

log[sender_name] = {}

log[sender_name][timestamp] = content

简单的讲解一下上面的代码。

首先需要初始化一个全局的消息日志字典——log。字典的每一个键都是发来信息的好友的昵称,它的值也是一个字典。这个字典则是以接收到消息那一刻的时间戳为键,以该时间戳对应的信息内容为值。这样设计便于后面找到撤回的消息。

有的消息可能没有NickName键的,为了增加程序的鲁棒性,要提前对msg['User']进行判断。

判断是否是文件传输助手(filehelper),如果不判断,会报下面的错:

如果某个好友第一次发信息过来,日志字典里面是没有这个键的。直接插入字典会出错,所以要先判断键是否已存在。

这时我们来测试一下。先用一个账号给自己发一条消息:

然后撤回:

同时,控制台输出:

下期预告

在上面举的例子中,我们很容易就能知道被撤回的消息的内容是什么。但是这样需要我们一条一条的看,这也太累了吧。

作为一名程序员,怎么能允许自己活的那么累呢!所以下期我们就来看看如何自动判断是否是撤回的消息,并将撤回的消息自动发送给“文件传输助手”上。

后记

不管写什么,希望能跟更多人沟通,有问题或者需求随时欢迎交流。

我所有的项目源码都会放在下面的github仓库里面,有需要可以参考,有问题欢迎指正,谢谢!

https://github.com/TitusWongCN/

【Python写微信防撤回脚本】往期推荐:

下面是我的公众号,有兴趣可以扫一下:

你可能感兴趣的:(python接收微信消息)