原理很簡單,每一條消息都是有 id 的,我們把所有消息都存儲在 dict 字典裡,就存儲 id 和對應的消息内容。 itchat.content.TEXT itchat.content.NOTE
:消息
:通知
撤回消息就屬于通知了,每次有通知,我們都檢測一下,如果是撤回消息,就把撤回的消息發送出去。
return 就是在哪個聊天框裡檢測到,發送到那裡。
# -*- coding: UTF8 -*-
import itchat
import requests
import re
data = {} # 用于存儲所有消息的dict字典
# 當接收到消息會觸發
@itchat.msg_register(itchat.content.TEXT,isFriendChat=True,isGroupChat=True)
def record(msg):
content = msg['Content']
id = msg['MsgId']
data[id] = content
# 當收到通知會觸發
@itchat.msg_register(itchat.content.NOTE,isFriendChat=True,isGroupChat=True)
def reply(msg):
if '撤回了一條消息' in msg['Content']:
old_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1) # 用正規表達式比對出最近一次撤回消息的id
old_msg = data.get(old_msg_id) # 讀取存儲在字典中對應id的消息
if old_msg != None:
return "你撤回了消息:" + str(old_msg)
當然我們有點不足之處就是如果消息存儲過多的話,會占用我們的很多的記憶體。
當然我們有改進方法:
方法1: 就是把消息存儲到本地用的時候讀取,當然這樣存儲的檔案也會越來越大。
方法2: 每個消息都有對應的發送時間,我們擷取到并且和目前時間對比,當時間超過 2 分鐘就把消息删除,正好消息本身超過2分鐘也不能撤回了。
程式運作效果圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yMhJWM4YjM1MjNmBTYyYmYhdDM0Y2N4YzM3kTMyAjN58CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
喜歡的點個贊❤吧!