利用python3实现微信防撤回功能

利用python3实现微信防撤回功能,原理就是利用爬虫登陆网页版的微信,每次的接收到的消息都缓存2分钟,一旦检测到撤回消息,则把缓存的消息发送出来,实现防撤回功能


# coding:utf-8

import itchat

from itchat.contentimport TEXT

from itchat.contentimport *

import sys

import time

import re

#reload(sys)

#sys.setdefaultencoding('utf8')

import importlib

importlib.reload(sys)

import os

msg_information = {}

face_bug =None  # 针对表情包的内容

@itchat.msg_register([TEXT, PICTURE, FRIENDS, CARD, MAP, SHARING, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True,

                    isMpChat=True)

def handle_receive_msg(msg):

global face_bug

msg_time_rec = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())# 接受消息的时间

    msg_from = itchat.search_friends(userName=msg['FromUserName'])['NickName']# 在好友列表中查询发送信息的好友昵称

    msg_time = msg['CreateTime']# 信息发送的时间

    msg_id = msg['MsgId']# 每条信息的id

    msg_content =None  # 储存信息的内容

    msg_share_url =None  # 储存分享的链接,比如分享的文章和音乐

    print(msg['Type'])

print(msg['MsgId'])

if msg['Type'] =='Text' or msg['Type'] =='Friends':# 如果发送的消息是文本或者好友推荐

        msg_content = msg['Text']

print(msg_content)

# 如果发送的消息是附件、视屏、图片、语音

    elif msg['Type'] =="Attachment" or msg['Type'] =="Video" \

or msg['Type'] =='Picture' \

or msg['Type'] =='Recording':

msg_content = msg['FileName']# 内容就是他们的文件名

        msg['Text'](str(msg_content))# 下载文件

# print msg_content

    elif msg['Type'] =='Card':# 如果消息是推荐的名片

        msg_content = msg['RecommendInfo']['NickName'] +'的名片'  # 内容就是推荐人的昵称和性别

        if msg['RecommendInfo']['Sex'] ==1:

msg_content +='性别为男'

        else:

msg_content +='性别为女'

        print(msg_content)

elif msg['Type'] =='Map':# 如果消息为分享的位置信息

        x, y, location = re.search(

"<location x=\"(.*?)\" y=\"(.*?)\".*label=\"(.*?)\".*", msg['OriContent']).group(1, 2, 3)

if locationis None:

msg_content =r"纬度->" + x.__str__() +" 经度->" + y.__str__()# 内容为详细的地址

        else:

msg_content =r"" + location

elif msg['Type'] =='Sharing':# 如果消息为分享的音乐或者文章,详细的内容为文章的标题或者是分享的名字

        msg_content = msg['Text']

msg_share_url = msg['Url']# 记录分享的url

        print(msg_share_url)

face_bug = msg_content

##将信息存储在字典中,每一个msg_id对应一条信息

    msg_information.update(

{

msg_id: {

"msg_from": msg_from, "msg_time": msg_time, "msg_time_rec": msg_time_rec,

                "msg_type": msg["Type"],

                "msg_content": msg_content, "msg_share_url": msg_share_url

}

}

)

##这个是用于监听是否有friend消息撤回

@itchat.msg_register(NOTE, isFriendChat=True, isGroupChat=True, isMpChat=True)

def information(msg):

# 这里如果这里的msg['Content']中包含消息撤回和id,就执行下面的语句

    if '撤回了一条消息' in msg['Content']:

old_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1)# 在返回的content查找撤回的消息的id

        old_msg = msg_information.get(old_msg_id)# 得到消息

        print(old_msg)

if len(old_msg_id) <11:# 如果发送的是表情包

            itchat.send_file(face_bug, toUserName=msg['FromUserName'])

else:# 发送撤回的提示给文件助手

            msg_body ="【" \

+ old_msg.get('msg_from') +" 撤回了 】\n" \

+ old_msg.get("msg_type") +" 消息:" +"\n" \

+ old_msg.get('msg_time_rec') +"\n" \

+r"" + old_msg.get('msg_content')

# 如果是分享的文件被撤回了,那么就将分享的url加在msg_body中发送给文件助手

            if old_msg['msg_type'] =="Sharing":

msg_body +="\n就是这个链接➣ " + old_msg.get('msg_share_url')

# 将撤回消息发送到文件助手

            itchat.send_msg(msg_body, toUserName=msg['FromUserName'])

# 有文件的话也要将文件发送回去

            if old_msg["msg_type"] =="Picture" \

or old_msg["msg_type"] =="Recording" \

or old_msg["msg_type"] =="Video" \

or old_msg["msg_type"] =="Attachment":

file ='@fil@%s' % (old_msg['msg_content'])

itchat.send(msg=file, toUserName=msg['FromUserName'])

os.remove(old_msg['msg_content'])

# 删除字典旧消息

            msg_information.pop(old_msg_id)

@itchat.msg_register([TEXT, PICTURE, FRIENDS, CARD, MAP, SHARING, RECORDING, ATTACHMENT, VIDEO], isGroupChat=True)

def handle_receive_msg(msg):

global face_bug

msg_time_rec = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())# 接受消息的时间

# groupid = msg['FromUserName']

# chatroom = itchat.search_chatrooms(userName=groupid)

    msg_Actual_from = msg['ActualNickName']

# msg_Actual_from = msg['User']

# msg_from = msg_Actual_from['Self']['NickName']

    msg_from = msg_Actual_from

msg_time = msg['CreateTime']# 信息发送的时间

    msg_id = msg['MsgId']# 每条信息的id

    msg_content =None  # 储存信息的内容

    msg_share_url =None  # 储存分享的链接,比如分享的文章和音乐

    print(msg['Type'])

print(msg['MsgId'])

if msg['Type'] =='Text' or msg['Type'] =='Friends':# 如果发送的消息是文本或者好友推荐

        msg_content = msg['Text']

print(msg_content)

# 如果发送的消息是附件、视屏、图片、语音

    elif msg['Type'] =="Attachment" or msg['Type'] =="Video" \

or msg['Type'] =='Picture' \

or msg['Type'] =='Recording':

msg_content = msg['FileName']# 内容就是他们的文件名

        msg['Text'](str(msg_content))# 下载文件

# print msg_content

    elif msg['Type'] =='Card':# 如果消息是推荐的名片

        msg_content = msg['RecommendInfo']['NickName'] +'的名片'  # 内容就是推荐人的昵称和性别

        if msg['RecommendInfo']['Sex'] ==1:

msg_content +='性别为男'

        else:

msg_content +='性别为女'

        print(msg_content)

elif msg['Type'] =='Map':# 如果消息为分享的位置信息

        x, y, location = re.search(

"<location x=\"(.*?)\" y=\"(.*?)\".*label=\"(.*?)\".*", msg['OriContent']).group(1, 2, 3)

if locationis None:

msg_content =r"纬度->" + x.__str__() +" 经度->" + y.__str__()# 内容为详细的地址

        else:

msg_content =r"" + location

elif msg['Type'] =='Sharing':# 如果消息为分享的音乐或者文章,详细的内容为文章的标题或者是分享的名字

        msg_content = msg['Text']

msg_share_url = msg['Url']# 记录分享的url

        print(msg_share_url)

face_bug = msg_content

##将信息存储在字典中,每一个msg_id对应一条信息

    msg_information.update(

{

msg_id: {

"msg_from": msg_from, "msg_time": msg_time, "msg_time_rec": msg_time_rec,

                "msg_type": msg["Type"],

                "msg_content": msg_content, "msg_share_url": msg_share_url

}

}

)

##这个是用于监听是否有Group消息撤回

@itchat.msg_register(NOTE, isGroupChat=True, isMpChat=True)

def information(msg):

# 这里如果这里的msg['Content']中包含消息撤回和id,就执行下面的语句

    if '撤回了一条消息' in msg['Content']:

old_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1)# 在返回的content查找撤回的消息的id

        old_msg = msg_information.get(old_msg_id)# 得到消息

        print(old_msg)

if len(old_msg_id) <11:# 如果发送的是表情包

            itchat.send_file(face_bug, toUserName=msg['FromUserName'])

else:# 发送撤回的提示给文件助手

            msg_body ="【" \

+ old_msg.get('msg_from') +" 群消息撤回提醒】\n" \

+" 撤回了 " + old_msg.get("msg_type") +" 消息:" +"\n" \

+ old_msg.get('msg_time_rec') +"\n" \

+r"" + old_msg.get('msg_content')

# 如果是分享的文件被撤回了,那么就将分享的url加在msg_body中发送给文件助手

            if old_msg['msg_type'] =="Sharing":

msg_body +="\n就是这个链接➣ " + old_msg.get('msg_share_url')

# 将撤回消息发送到文件助手

            itchat.send_msg(msg_body, toUserName=msg['FromUserName'])

# 有文件的话也要将文件发送回去

            if old_msg["msg_type"] =="Picture" \

or old_msg["msg_type"] =="Recording" \

or old_msg["msg_type"] =="Video" \

or old_msg["msg_type"] =="Attachment":

file ='@fil@%s' % (old_msg['msg_content'])

itchat.send(msg=file, toUserName=msg['FromUserName'])

os.remove(old_msg['msg_content'])

# 删除字典旧消息

            msg_information.pop(old_msg_id)

# Main (enableCmdQr = True 时,将会生成二维码图片,如 =2 时二维码乱码的话 改为1 即可

itchat.auto_login(enableCmdQR=2, hotReload=True)

itchat.run()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容