python使用wxpy輕松實(shí)現(xiàn)微信防撤回的方法
最近比較閑就隨便瞎看,看到了微信防撤回就順便跟著學(xué)著實(shí)現(xiàn)一下
使用的是wxpy,安裝方法pip install wxpy(我使用的是python2.7),這樣實(shí)現(xiàn)起來(lái)比較快,反正也只是練手
首現(xiàn)看了兩個(gè)別人實(shí)現(xiàn)的代碼,然后看了看wxpy的文檔:http://wxpy.readthedocs.io/zh/latest/utils.html(萌新,順便鍛煉下看文檔)
我實(shí)現(xiàn)的代碼:
import wxpy import re # 實(shí)例化微信對(duì)象 bot = wxpy.Bot(cache_path=True) # 啟用puid 并指定puid所需映射數(shù)據(jù)保存的路徑 bot.enable_puid(path='wxpy_puid.pkl') # 用于存放每個(gè)用戶最近發(fā)送的消息 msgs = dict() # 信息的類型 msg_types = { 'Text': '文本', 'Map': '位置', 'Picture': '圖片', 'Video': '視頻', 'Attachment': '文件', 'Sharing': '分享', 'Card': '名片', 'Recording': '語(yǔ)音', } @bot.register() def handle_receive_msg(msg): """ 監(jiān)聽消息 :param msg: 接收到的消息 :return: """ # 原信息數(shù)據(jù) raw = msg.raw # 如果消息的狀態(tài)碼是4 即撤回消息 if raw.get('Status') == 4: # 如果是群消息 if isinstance(msg.chat, wxpy.api.chats.group.Group): # 獲取群成員的puid puid = msg.member.puid # 獲取發(fā)送者的昵稱 name = msg.member.nick_name # 如果是好友消息 elif isinstance(msg.chat, wxpy.api.chats.friend.Friend): # 獲取好友的puid puid = msg.chat.puid # 獲取好友的昵稱 name = msg.chat.nick_name else: puid = None name = None if puid: # 被撤回消息的msgid的匹配規(guī)則 msg_id_regex = re.compile('<msgid>(\d+)</msgid>') # 獲取被撤回消息的msgid old_msg_id = msg_id_regex.findall(raw.get('Content'))[0] # 獲取該發(fā)送者的最后5次的消息記錄 chat_msgs = msgs.get(puid) # 遍歷消息記錄 for chat_msg in chat_msgs[::-1]: # 跳過(guò)不是被撤回的信息 if str(chat_msg.id) != old_msg_id: continue chat = chat_msg.chat # 如果被撤回的信息是文本信息 if chat_msg.type == "Text": # 如果消息長(zhǎng)度過(guò)長(zhǎng) 則不予處理 if len(chat_msg.text) >= 150: warning = "【您撤回的消息過(guò)長(zhǎng),有炸群嫌疑,不予處理!??!】" bot.file_helper.send('%s撤回了一條文本消息--【%s】'.decode('utf-8') % (name, warning)) break # 將此消息轉(zhuǎn)發(fā)出來(lái) chat_msg.forward(chat, prefix='%s撤回了一條文本消息,消息內(nèi)容為:'.decode('utf-8') % name) # 如果被撤回的是位置信息 elif chat_msg.type == "Map": # 位置信息的匹配規(guī)則 map_regex = re.compile(r'label="(.+?)"') # 獲取位置信息中的位置 map = map_regex.findall(chat_msg.raw.get("OriContent"))[0] # 將位置信息發(fā)出來(lái) msg.reply('%s撤回了一條位置消息,位置信息為:【%s】'.decode('utf-8') % (name, map)) else: # 獲取信息的類型 msg_type = msg_types.get(chat_msg.type).decode('utf-8') # 將信息轉(zhuǎn)發(fā)出來(lái) chat_msg.forward(chat, prefix='%s撤回了一條%s消息, 消息內(nèi)容為:'.decode('utf-8') % (name, msg_type)) break else: # 如果是群消息 if isinstance(msg.chat, wxpy.api.chats.group.Group): # 獲取群成員的puid puid = msg.member.puid # 如果是好友消息 elif isinstance(msg.chat, wxpy.api.chats.friend.Friend): # 獲取好友的puid puid = msg.chat.puid else: puid = None if puid: # 記錄消息 msgs.setdefault(puid, []).append(msg) # 截取消息 保留最大5條記錄 msgs[puid] = msg[puid][-5:] # 使機(jī)器人后臺(tái)運(yùn)行,并進(jìn)入交互模式 wxpy.embed()
也未做過(guò)多的測(cè)試和優(yōu)化,測(cè)試了文本、圖片、語(yǔ)音、位置信息,視頻、名片、分享、文件消息未做測(cè)試
ps:這里語(yǔ)音消息撤回后發(fā)出來(lái)的是語(yǔ)音文件,位置信息發(fā)出來(lái)的是地址的文本
======================割======================
如果想要添加聊天機(jī)器人 可以加入:
# 指定一個(gè)好友 friend = bot.friends().search('您對(duì)朋友的備注') # 指定一個(gè)群 group = bot.groups().search('群名') # 實(shí)例化圖靈機(jī)器人 免費(fèi)申請(qǐng)圖靈機(jī)器人: http://www.tuling123.com/ tu_ling = wxpy.Tuling(api_key="自行注冊(cè)") # chats指定對(duì)哪些用戶起作用, 如果chats=None(默認(rèn)值)對(duì)所有用戶起作用 @bot.register(chats=[friend, group]) def reply_msg(msg): """ 自動(dòng)回復(fù)消息 :param msg: 接收到的信息數(shù)據(jù) :return: 回復(fù)文本 """ # do_reply會(huì)自動(dòng)回復(fù)消息并返回消息文本 tu_ling.do_reply(msg)
以上這篇python使用wxpy輕松實(shí)現(xiàn)微信防撤回的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中scipy.stats產(chǎn)生隨機(jī)數(shù)實(shí)例講解
在本篇文章里小編給大家分享的是一篇關(guān)于python中scipy.stats產(chǎn)生隨機(jī)數(shù)實(shí)例講解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2021-02-02使用wxPython實(shí)現(xiàn)Windows11任務(wù)欄通知功能
這篇文章主要為大家詳細(xì)介紹了如何使用 wxPython 模塊,在 Windows 11 中實(shí)現(xiàn)任務(wù)欄通知功能,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10pandas中關(guān)于apply+lambda的應(yīng)用
本文主要介紹了pandas中關(guān)于apply+lambda的應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02詳解利用python識(shí)別圖片中的條碼(pyzbar)及條碼圖片矯正和增強(qiáng)
這篇文章主要介紹了詳解利用python識(shí)別圖片中的條碼(pyzbar)及條碼圖片矯正和增強(qiáng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11