今天看啥  ›  专栏  ›  TitusWong

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

TitusWong  · 掘金  ·  · 2019-12-31 06:18
阅读 21

【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
复制代码

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

  1. 首先需要初始化一个全局的消息日志字典——log。字典的每一个键都是发来信息的好友的昵称,它的值也是一个字典。这个字典则是以接收到消息那一刻的时间戳为键,以该时间戳对应的信息内容为值。这样设计便于后面找到撤回的消息。
  2. 有的消息可能没有NickName键的,为了增加程序的鲁棒性,要提前对msg['User']进行判断。
  3. 判断是否是文件传输助手(filehelper),如果不判断,会报下面的错:

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

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

然后撤回:

同时,控制台输出:

下期预告

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

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

后记

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

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

https://github.com/TitusWongCN/
复制代码

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

第一期: 【Python写微信防撤回脚本】01 熟悉ItChat库

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




原文地址:访问原文地址
快照地址: 访问文章快照