欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

撤回我也能看到!教你用Python制作微信防撤回腳本

 更新時間:2021年06月11日 14:59:41   作者:克金森沐沐  
如果好友短時間發(fā)送多條消息然后撤回會難以判斷究竟撤回的是哪條信息,只能靠猜.后來我覺得“猜”這個事情特別不Pythonic,研究一段時間后找到了解決方案,不得不驚嘆ItChat真的好強大,需要的朋友可以參考下

一、之前解決方案

大概是這樣:短時間內(nèi)同一位好友發(fā)送了多條消息,當(dāng)他隨便撤回一條消息時,我們不能確定他到底撤回的到底是哪一條消息。只能猜他可能是撤回了最近的一條消息,然后將其他消息貼出來作為備選。代碼如下:

target_msg_pattern = '"{}" 撤回了一條消息'.format(sender_name)
if content == target_msg_pattern:
    return_msg = '【{}】撤回了一條消息:\n'.format(sender_name)
    if len(log[sender_name].items()) == 0:
        return_msg = '緩存信息列表為空!'
    else:
        return_msg += log[sender_name].items()[-1][-1] + '\n'
        if len(log[sender_name].items()) > 1:
            msgs = [msg for timestamp, msg in log[sender_name].items()[:-1]]
            return_msg += '也有可能是下列信息中的某一條:\n' + '\n'.join(msgs)

實際效果是這樣:


在這里插入圖片描述 

我這個強迫癥簡直受不了這么不確定的說法。

二、分析msg信息

要想確定撤回了哪一條信息,就必須先熟悉普通msg和撤回的msg里面都有哪些信息,他們的相同點和不同點。下面就來看看這兩種情況下msg都是怎么樣的,不需要仔細(xì)的看每一行,后面會作具體分析。

先是用機器人“小幫幫”發(fā)送過來的信息得到的msg信息:

{
	'MsgId': '2018511155698964390',
	'FromUserName': '@**********f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3',
	'ToUserName': '@**********c2e61fdb47b5c241553a2f',
	'MsgType': 1,
	'Content': 'msg里面到底有什么?',
	'Status': 3,
	'ImgStatus': 1,
	'CreateTime': 1578069291,
	'VoiceLength': 0,
	'PlayLength': 0,
	'FileName': '',
	'FileSize': '',
	'MediaId': '',
	'Url': '',
	'AppMsgType': 0,
	'StatusNotifyCode': 0,
	'StatusNotifyUserName': '',
	'RecommendInfo': {
		'UserName': '',
		'NickName': '',
		'QQNum': 0,
		'Province': '',
		'City': '',
		'Content': '',
		'Signature': '',
		'Alias': '',
		'Scene': 0,
		'VerifyFlag': 0,
		'AttrStatus': 0,
		'Sex': 0,
		'Ticket': '',
		'OpCode': 0
	},
	'ForwardFlag': 0,
	'AppInfo': {
		'AppID': '',
		'Type': 0
	},
	'HasProductId': 0,
	'Ticket': '',
	'ImgHeight': 0,
	'ImgWidth': 0,
	'SubMsgType': 0,
	'NewMsgId': 2018511155698964390,
	'OriContent': '',
	'EncryFileName': '',
	'User': < User: {
		'MemberList': < ContactList: [] > ,
		'Uin': 0,
		'UserName': '@**********f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3',
		'NickName': '小幫幫',
		'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=699837854&username=@**********f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3&skey=@crypt_****c00c_92668c8ba7d285c221a85e**********',
		'ContactFlag': 2049,
		'MemberCount': 0,
		'RemarkName': '小幫幫',
		'HideInputBarFlag': 0,
		'Sex': 2,
		'Signature': '',
		'VerifyFlag': 0,
		'OwnerUin': 0,
		'PYInitial': 'XBB',
		'PYQuanPin': 'xiaobangbang',
		'RemarkPYInitial': 'XBB',
		'RemarkPYQuanPin': 'xiaobangbang',
		'StarFriend': 0,
		'AppAccountFlag': 0,
		'Statues': 0,
		'AttrStatus': 33658937,
		'Province': '浙江',
		'City': '臺州',
		'Alias': '',
		'SnsFlag': 17,
		'UniFriend': 0,
		'DisplayName': '',
		'ChatRoomId': 0,
		'KeyWord': '',
		'EncryChatRoomId': '',
		'IsOwner': 0
	} > ,
	'Type': 'Text',
	'Text': 'msg里面到底有什么?'
}

下面是機器人撤回剛才的信息得到的msg信息:

{
	'MsgId': '4056955577161654067',
	'FromUserName': '@**********f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3',
	'ToUserName': '@**********c2e61fdb47b5c241553a2f',
	'MsgType': 10002,
	'Content': '<sysmsg type="revokemsg"><revokemsg><session>wxid_4gngrr04aqjn21</session><oldmsgid>1123721956</oldmsgid><msgid>2018511155698964390</msgid><replacemsg><![CDATA["小幫幫" 撤回了一條消息]]></replacemsg></revokemsg></sysmsg>',
	'Status': 4,
	'ImgStatus': 1,
	'CreateTime': 1578069381,
	'VoiceLength': 0,
	'PlayLength': 0,
	'FileName': '',
	'FileSize': '',
	'MediaId': '',
	'Url': '',
	'AppMsgType': 0,
	'StatusNotifyCode': 0,
	'StatusNotifyUserName': '',
	'RecommendInfo': {
		'UserName': '',
		'NickName': '',
		'QQNum': 0,
		'Province': '',
		'City': '',
		'Content': '',
		'Signature': '',
		'Alias': '',
		'Scene': 0,
		'VerifyFlag': 0,
		'AttrStatus': 0,
		'Sex': 0,
		'Ticket': '',
		'OpCode': 0
	},
	'ForwardFlag': 0,
	'AppInfo': {
		'AppID': '',
		'Type': 0
	},
	'HasProductId': 0,
	'Ticket': '',
	'ImgHeight': 0,
	'ImgWidth': 0,
	'SubMsgType': 0,
	'NewMsgId': 4056955577161654067,
	'OriContent': '',
	'EncryFileName': '',
	'User': < User: {
		'MemberList': < ContactList: [] > ,
		'Uin': 0,
		'UserName': '@**********f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3',
		'NickName': '小幫幫',
		'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=699837854&username=@**********f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3&skey=@crypt_****c00c_92668c8ba7d285c221a85e**********',
		'ContactFlag': 2049,
		'MemberCount': 0,
		'RemarkName': '小幫幫',
		'HideInputBarFlag': 0,
		'Sex': 2,
		'Signature': '',
		'VerifyFlag': 0,
		'OwnerUin': 0,
		'PYInitial': 'XBB',
		'PYQuanPin': 'xiaobangbang',
		'RemarkPYInitial': 'XBB',
		'RemarkPYQuanPin': 'xiaobangbang',
		'StarFriend': 0,
		'AppAccountFlag': 0,
		'Statues': 0,
		'AttrStatus': 33658937,
		'Province': '浙江',
		'City': '臺州',
		'Alias': '',
		'SnsFlag': 17,
		'UniFriend': 0,
		'DisplayName': '',
		'ChatRoomId': 0,
		'KeyWord': '',
		'EncryChatRoomId': '',
		'IsOwner': 0
	} > ,
	'Type': 'Note',
	'Text': '"小幫幫" 撤回了一條消息'
}

得到了兩種類型的msg,下面是對比(高亮的部分是不同處,省略了部分相同內(nèi)容??梢渣c擊放大查看大圖

在這里插入圖片描述

現(xiàn)在來分析幾條關(guān)鍵信息:

  • MsgId(與下面的NewMsgId同)
  • 消息編號。這個很好理解,每條消息都是通過一個獨一無二的編號來與其他消息區(qū)分,所以這兩條消息的編號不同很正常。如果我們能拿到好友撤回消息的編號,也就能鎖定這條消息了。
  • MsgType(與下面的Type同)
  • 消息類型。如下圖,左邊是普通的對話消息,右邊類似于系統(tǒng)提示消息。是不是可以根據(jù)這條信息來判斷是不是有好友撤回了消息?

在這里插入圖片描述

Content

消息內(nèi)容,注意與下面的Text區(qū)分,這兩種消息類型在內(nèi)容上最大的區(qū)別可能就在這里了。

來看一下撤回消息的Content是怎么樣的(為了便于查看,已經(jīng)經(jīng)過格式化)

<sysmsg type="revokemsg">
    <revokemsg>
        <session>wxid_4gngrr04aqjn21</session>
        <oldmsgid>1123721956</oldmsgid>
        <msgid>2018511155698964390</msgid>
        <replacemsg><![CDATA["小幫幫" 撤回了一條消息]]></replacemsg>
    </revokemsg>
</sysmsg>

一眼就能發(fā)現(xiàn)關(guān)鍵點:撤回的那條消息屬于系統(tǒng)消息(sysmsg),類型是撤回消息(revokemsg),對應(yīng)的消息編號是2018511155698964390。

細(xì)心的讀者已經(jīng)發(fā)現(xiàn),這個消息編號正好就是左邊那條消息的編號。

通過這個推理,猜測Content字段是系統(tǒng)內(nèi)部傳輸?shù)膬?nèi)容,而Text字段則是用戶看到的內(nèi)容。

三、確定消息類型

根據(jù)上述分析,有三個地方幫助確定收到的某條信息是否是撤回的消息:

1.MsgType

1就是普通消息,是10002則可能為撤回消息。

2.Content

如果Content里有包含type="revokemsg"則可能為撤回消息,否則不是撤回消息。

3.Type

是Text就是普通消息,是Note則可能為撤回消息。

精確起見,消息還要同時滿足上面三種情況才可認(rèn)定為撤回消息。

四、鎖定撤回的消息

由于要鎖定撤回消息必須要MsgId才能確定,所以在存儲臨時消息時需要加上這一字段。

log[sender_name][cur_timestamp] = msg['MsgId'] + '|||' + content

為了簡化數(shù)據(jù)復(fù)雜度,我通過分隔符|||直接把MsgId加在前面。

于是,鎖定并發(fā)送撤回消息的代碼就時這樣:

content = str(msg['Text'])
revoke_info = msg['Content']
print('{}, {} 發(fā)來消息: {}'.format(formatted_timestamp, sender_name, content))
target_msg_pattern = '"{}" 撤回了一條消息'.format(sender_name)
if target_msg_pattern == content and msg['Type'] == 'Note' and str(msg['MsgType']) == '10002' and 'type="revokemsg"' in revoke_info:
    return_msg = ''
    return_msg_head = '{},【{}】撤回了一條消息:\n'.format(formatted_timestamp, sender_name)
    revoke_msg_id = revoke_info.split('<msgid>')[-1].split('</msgid>')[0]
    for _, value in log[sender_name].items():
        if value.split('|||')[0] == revoke_msg_id:
            return_msg = value.split('|||')[1]
    if return_msg == '':
        return_msg = '緩存信息列表為空!'
    return_msg = return_msg_head + return_msg
    print(return_msg)
    itchat.send_msg(return_msg, 'filehelper')

測試一下,為便于查看,將撤回提醒直接發(fā)給機器人“小幫幫”

在這里插入圖片描述 

一個完美的微信防撤回腳本大功告成!

五、結(jié)語

Python有很多好用好玩的庫,可以慢慢發(fā)掘。本期我們利用ItChat庫編寫了一個微信防撤回腳本。其實ItChat功能遠(yuǎn)遠(yuǎn)不止這些,它還可以處理微信群消息以及各種其他類型的消息,我們講到的只是九牛一毛,更多的還要大家自己去探索。

到此這篇關(guān)于撤回我也能看到!教你用Python制作微信防撤回腳本的文章就介紹到這了,更多相關(guān)Python微信防撤回腳本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Anaconda下Python中h5py與netCDF4模塊下載與安裝的教程詳解

    Anaconda下Python中h5py與netCDF4模塊下載與安裝的教程詳解

    這篇文章主要為大家詳細(xì)介紹了基于Anaconda,下載并安裝Python中h5py與netCDF4這兩個模塊的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • 淺析PEP572: 海象運算符

    淺析PEP572: 海象運算符

    PEP572的標(biāo)題是「Assignment Expressions」,也就是「賦值表達式」,也叫做「命名表達式」,不過它現(xiàn)在被廣泛的別名是「海象運算符」(The Walrus Operator)
    2019-10-10
  • OpenCV半小時掌握基本操作之圓圈檢測

    OpenCV半小時掌握基本操作之圓圈檢測

    這篇文章主要介紹了OpenCV基本操作之圓圈檢測,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Python檢查端口是否打開的七種方法總結(jié)

    Python檢查端口是否打開的七種方法總結(jié)

    在信息安全領(lǐng)域,端口掃描是一項常見的技術(shù),用于逐個檢測目標(biāo)主機上的端口是否開放,這篇文章主要給大家介紹了關(guān)于Python檢查端口是否打開的七種方法總結(jié),需要的朋友可以參考下
    2023-12-12
  • Python繪制地理圖表可視化神器pyecharts

    Python繪制地理圖表可視化神器pyecharts

    這篇文章主要介紹了Python繪制地理圖表可視化神器pyecharts,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • 詳解Python如何檢查一個數(shù)字是否是三態(tài)數(shù)

    詳解Python如何檢查一個數(shù)字是否是三態(tài)數(shù)

    在數(shù)學(xué)中,三態(tài)數(shù)(Triangular?Number)是一種特殊的數(shù)列,它是由自然數(shù)按照一定規(guī)律排列而成的,本文主要介紹了如何使用Python檢查判斷一個數(shù)字是否是三態(tài)數(shù),需要的可以參考下
    2024-03-03
  • Python語言實現(xiàn)機器學(xué)習(xí)的K-近鄰算法

    Python語言實現(xiàn)機器學(xué)習(xí)的K-近鄰算法

    今天學(xué)習(xí)的算法是KNN近鄰算法。KNN算法是一個監(jiān)督學(xué)習(xí)分類器類別的算法。下面我們來詳細(xì)的探討下
    2015-06-06
  • Python編程進階代碼邏輯分離指南

    Python編程進階代碼邏輯分離指南

    在?Python?編程中,適當(dāng)?shù)拇a邏輯分離可以幫助降低復(fù)雜度、提高可讀性,減少大量的?if-else?結(jié)構(gòu),本文將深入探討如何使用不同方法來改進代碼結(jié)構(gòu),降低對?if-else?結(jié)構(gòu)的依賴
    2023-12-12
  • Python字符串str和json格式相互轉(zhuǎn)換

    Python字符串str和json格式相互轉(zhuǎn)換

    這篇文章主要介紹了Python字符串str和json格式相互轉(zhuǎn)換,str轉(zhuǎn)換為json格式,前提一定需要保證這個str的格式和json是一致的。下文小編向大家介紹更多相關(guān)內(nèi)容,需要的朋友可以參考一下
    2022-03-03
  • 詳細(xì)介紹Python語言中的按位運算符

    詳細(xì)介紹Python語言中的按位運算符

    這篇文章主要介紹了Python語言中的按位運算符,有需要的朋友可以參考一下
    2013-11-11

最新評論