1. 程式人生 > >用Python教你微信防撤回(文字、圖片、語音、視訊、名片等...)

用Python教你微信防撤回(文字、圖片、語音、視訊、名片等...)

大家在使用微信過程中,有時候訊息還沒看到,就被撤回了。畢竟好奇心大家都有,明知到訊息被撤回了,就更想去看一下是什麼內容
心裡想著萬一是女神給我表白了呢.. 今天就用Python來做個微信防撤回的小功能。支援文字、圖片、語音、視訊、名片的防撤回。

思路:
利用itchat庫將每次接收到的訊息進行快取。監聽撤回事件,當有消失被撤回時,通過msgId去快取中取到資訊再發送給檔案傳輸助手。這樣就實現了一個簡單的防撤回功能。

效果圖

在這裡插入圖片描述在這裡插入圖片描述

將接收的訊息快取

import itchat
from itchat.content import *
import datetime
import re
import os


# 微信接受的資訊儲存路徑
FILE_PATH = '/home/wechat/'
# 存放微信訊息的快取字典
MSG_DICT = {}

# 微信訊息型別字典
MSG_MESSAGE = {'Text': '文字', 'Map': '位置分享', 'Sharing': '分享連結',
               'Picture': '圖片', 'Video': '視訊', 'Card': '名片',
               'Attachment': '附件', 'Recording': '語音'}

"""
 監聽訊息
"""
# 監聽的訊息型別 為TEXT, MAP, SHARING, PICTURE, VIDEO, CARD, RECORDING, ATTACHMENT

@itchat.msg_register([TEXT, MAP, SHARING, PICTURE, VIDEO, CARD, RECORDING, ATTACHMENT])
def wechat_msg(msg):
    # 獲取訊息id
    msg_id = msg['MsgId']
    # 當前時間
    msg_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    # 傳送人
    msg_from = itchat.search_friends(userName=msg['FromUserName'])['RemarkName']
    # 備註為空 獲取暱稱
    if not msg_from:
        msg_from = itchat.search_friends(userName=msg['FromUserName'])['NickName']
    # 內容
    msg_text = msg['Text']
    # 訊息型別
    msg_type = msg['Type']

    msg_url = None

    # 訊息為視訊、照片、語音、附件的時候需要進行儲存
    save_type = [VIDEO, PICTURE, RECORDING, ATTACHMENT]
    if msg_type in save_type:
        # 儲存檔案
        msg['Text'](FILE_PATH + msg['FileName'])
        msg_text = msg['FileName']

    # 訊息型別為地圖、分享連結時 記錄url
    url_type = [MAP, SHARING]
    if msg_type in url_type:
        msg_url = msg['msg_url']
    # 名片
    if msg_type == CARD:
        sex = msg['RecommendInfo']['Sex']
        if sex == 1:
            sex = '小哥哥'
        elif sex == 2:
            sex = '小姐姐'
        else:
            sex = 'ladyBoy'
        msg_text = f'來自{msg["RecommendInfo"]["Province"]} { msg["RecommendInfo"]["City"]}的 {msg["RecommendInfo"]["NickName"]} {sex} 的名片.'
    # 訊息放入字典中
    MSG_DICT[msg_id] = {'msg_from': msg_from, 'msg_time': msg_time, 'msg_text': msg_text, 'msg_url': msg_url, 'msg_type': MSG_MESSAGE[msg_type]}
    print({'msg_from': msg_from, 'msg_time': msg_time, 'msg_text': msg_text, 'msg_url': msg_url, 'msg_type': MSG_MESSAGE[msg_type]})

我們將微信接收到的文字、視訊、語音、影象、附件等訊息型別都快取到了MSG_DICT這個字典當中。下面我們就可以對 撤回 事件進行監聽

監聽撤回、傳送撤回內容

# 監聽微信事件,
@itchat.msg_register([NOTE])
def get_withdraw_message(msg):
    # 文字訊息
    content = msg['Content']
    print('監聽事件...')
    # result = re.search(r"\<\!\[CDATA\[.*撤回了一條訊息\]\]\>", msg['Content'])
    # 判斷是否是撤回訊息
    pattern = re.compile(r"\<\!\[CDATA\[.*撤回了一條訊息\]\]\>")
    match = pattern.findall(content)
    """
    msg 內容
    '<sysmsg type="revokemsg">
        <revokemsg>
            <session>wxid_ajl8ccgq8ehf22</session>
            <oldmsgid>1671792812</oldmsgid>
            <msgid>3341430144853335059</msgid>
            <replacemsg><![CDATA["初一丶" 撤回了一條訊息]]></replacemsg>
        </revokemsg>
    </sysmsg>'
    """
    # 有撤回的訊息
    if match:
        # 獲取撤回訊息的msg_id
        withdraw_msg_id = re.search(r"\<msgid>(.*?)\<\/msgid", content).group(1)
        if MSG_DICT:
            # 獲取撤回訊息的內容
            withdraw_msg = MSG_DICT.get(withdraw_msg_id)
            # 構建訊息文字
            semd_msg = withdraw_msg.get('msg_from') + '撤回了他在' + withdraw_msg.get('msg_time') + \
            '傳送的' + withdraw_msg.get('msg_type') + '訊息。' + '內容為:' + withdraw_msg.get('msg_text')

            print(semd_msg)

            # 撤回資訊的訊息型別
            type = withdraw_msg['msg_type']

            # 如果是地圖、或者分享資訊的時候 拼接url
            if type in [MAP, SHARING]:
                semd_msg += "資訊連結為:" + withdraw_msg.get('msg_url')

            # 將文字資訊傳送至檔案傳輸助手
            result = itchat.send(semd_msg,  toUserName='filehelper')

            # 如果是['視屏', '圖片', '語音', '附件'] 傳送相應檔案
            file = FILE_PATH + withdraw_msg['msg_text']
            if type in ['視訊', '圖片', '語音', '附件']:
                # 傳送檔案至傳輸助手
                result = itchat.send_file(file, toUserName='filehelper')
                # 傳送圖片也可以
                # result = itchat.send_image(file, toUserName='filehelper')
                # 傳送視訊
                # result = itchat.send_video(file, toUserName='filehelper')
                # 將已傳送的檔案 從硬碟上刪除
                os.remove(file)
        # 從字典中刪除已傳送的檔案
        del MSG_DICT[withdraw_msg_id]



if __name__ == '__main__':
    # 微信熱登入
    itchat.auto_login(True)
    # 啟動
    itchat.run()

後來我發現、防撤回功能並沒有什麼卵用,因為女神給我發的不是去洗澡就是去睡覺、根本沒給我表白

在這裡插入圖片描述在這裡插入圖片描述

文章首發自公眾號:「程式設計師共成長」。一個專門面向程式設計師群體的圈子,專注分享日常學習總結、業內資訊、優質學習視訊資源, 這裡不光有技術、還有詩和遠方…給新加入的小夥伴準備了見面禮,包括但不限於Java、Python、Linux、資料庫、大資料、架構以及各方向電子書。公眾號內回覆[禮包]即可領取。