吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7679|回复: 4
收起左侧

[Python 转载] 【转载】itchat库学习笔记 + 微信防撤回实现详解

[复制链接]
xian54966 发表于 2019-2-15 16:19
本帖最后由 xian54966 于 2019-2-15 17:02 编辑

兄弟们,热心值在哪里?!!!


    itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。当然,该api的使用远不止一个机器人,更多的功能等着你来发现,比如这些该接口与公众号接口itchatmp共享类似的操作方式,学习一次掌握两个工具。如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号、方便自己的生活。
·        文章目录
o   0.安装
o   1.首先了解注册方法
  • § 1.1两种方法注册消息
  • § 1.2消息类型
  • § 1.3注册消息的优先级
  • § 1.4动态注册消息

o   2.简单用法
o   3.高级用法
  • § 3.1信息字典的特殊用途
  • § 3.2各种信息类型的注册
  • § 3.3二维码命令语句
  • § 3.4Hot reload
  • § 3.5用户搜索
  • § 3.6下载与发送
  • § 3.7Multi instance
  • § 3.8登录和注销后设置回调

o   4. 选题背景
o   5. 发现问题
o   6. 提炼问题
o   7. 解决方案
o   8. 分析设计

  • 问题8.1 : 如何用程序登录自己的微信账号?
  • 问题8.2 : 如何用程序获取账号接收到的消息
  • 问题8.3 : 如何识别接收到的消息的不同类别,并作出不同的处理
  • 问题8.4 : 如何实时保存接收到的消息
  • 问题8.5 : 如何检测到其他用户的”撤回“指令
  • 问题8.6 : 如何根据“撤回”指令在保存下来的消息中找到被撤回的消息内容
  • 问题8.7 : 如何在微信中显示撤回的不同类型的内容

o   9. 代码实现
  • 9.-1 结构
  • 9.0 库引用
  • 9.1 全局变量设置
  • 9.2 登录
  • 9.3 处理接收到的信息
  • 9.4 分类处理
  • 9.5 更新存储变量的字典
  • 9.6 监测是否有消息撤回若有,找回消息
  • 9.7 分类处理 && 5.8 显示消息
  • 9.9 弹出该消息并run

o 10. 完整代码
------------------------------------------------------------------------------------------
0.安装
  • ·        cmd:pip install itchat
  • ·        检验是否安装成功:cmd:python -c ”import itchat“
---------------------------------------------------------------------------------------------------------------------------------------
1.首先了解注册方法
1.1两种方法注册消息
[Python] 纯文本查看 复制代码
import itchat
from itchat.content import *

# 不带具体对象注册,将注册为普通消息的回复方法
@itchat.msg_register(TEXT)
def simple_reply(msg):
    return 'I received: %s' % msg['Text']

# 带对象参数注册,对应消息对象将调用该方法
@itchat.msg_register(TEXT, isFriendChat=True, isGroupChat=True, isMpChat=True)
def text_reply(msg):
    msg.user.send('%s: %s' % (msg.type, msg.text))


1.2消息类型

[td]
参数
类型
Text键值
TEXT
文本
文本内容
MAP
地图
位置文本
CARD
名片
推荐人字典
NOTE
通知
通知文本
SHARING
分享
分享名称
PICTURE
图片/表情
下载方法
RECORDING
语音
下载方法
ATTACHMENT
附件
下载方法
VIDEO
小视频
下载方法
FRIENDS
好友邀请
添加好友所需参数
SYSTEM
系统消息
更新内容的用户或群聊的UserName组成的列表
·        例:存储发送给你的附件
[Python] 纯文本查看 复制代码
@itchat.msg_register(ATTACHMENT)
def download_files(msg):
msg['Text'](msg['FileName'])

·        群消息增加了三个键值[td]
键值
作用
isAt
判断是否@本号
ActualNickName
实际NickName
Content
实际Content
[Python] 纯文本查看 复制代码
import itchat
from itchat.content import TEXT

@itchat.msg_register(TEXT, isGroupChat=True)
def text_reply(msg):
    print(msg.isAt)
    print(msg.actualNickName)
    print(msg.text)

itchat.auto_login()
itchat.run()


1.3注册消息的优先级
·        规则:后注册消息先于先注册消息,带参数消息先于不带参数消息
[Python] 纯文本查看 复制代码
import itchat
from itchat.content import *

itchat.auto_login()

@itchat.msg_register(TEXT)
def text_reply(msg):
    return 'This is the old register'

@itchat.msg_register(TEXT)
def text_reply(msg):
    return 'This is a new one'

itchat.run()
#在私聊发送文本时将会回复This is a new one

[Python] 纯文本查看 复制代码
import itchat
from itchat.content import *

itchat.auto_login()

@itchat.msg_register
def general_reply(msg):
    return 'I received a %s' % msg.type

@itchat.msg_register(TEXT)
def text_reply(msg):
    return 'You said to me one to one: %s' % msg.text

itchat.run()
#仅在私聊发送文本时将会回复You said to me one to one,其余情况将会回复I received a ...

1.4动态注册消息
·        动态注册时可以选择将itchat.run()放入另一线程或使用configured_reply()方法处理消息。
[Python] 纯文本查看 复制代码
# 使用另一线程,但注意不要让程序运行终止
import thread

thread.start_new_thread(itchat.run, ())

# 使用configured_reply方法
while 1:
    itchat.configured_reply()
    # some other functions
    time.sleep(1)
例子:
[Python] 纯文本查看 复制代码
#coding=utf8
import thread

import itchat
from itchat.content import *

replyToGroupChat = True
functionStatus = False

def change_function():
    if replyToGroupChat != functionStatus:
        if replyToGroupChat:
            @itchat.msg_register(TEXT, isGroupChat=True)
            def group_text_reply(msg):
                if u'关闭' in msg['Text']:
                    replyToGroupChat = False
                    return u'已关闭'
                elif u'开启' in msg['Text']:
                    return u'已经在运行'
                return u'输入"关闭"或者"开启"测试功能'
        else:
            @itchat.msg_register(TEXT, isGroupChat=True)
            def group_text_reply(msg):
                if u'开启' in msg['Text']:
                    replyToGroupChat = True
                    return u'重新开启成功'
        functionStatus = replyToGroupChat

thread.start_new_thread(itchat.run, ())

while 1:
    change_function()
    time.sleep(.1)
2.简单用法
·        向文件助手发送消息
[Python] 纯文本查看 复制代码
import itchat
itchat.auto_login()
itchat.send('Hello, filehelper', toUserName='filehelper')
  回应他人文字消息
[Python] 纯文本查看 复制代码
import itchat

@itchat.msg_register(itchat.content.TEXT)
def text_reply(msg):
    return msg.text

itchat.auto_login()
itchat.run()
3.高级用法
3.1信息字典的特殊用途
·        通过将它们打印到屏幕上,您可能会发现它的所有用户和消息都是字典。·        但实际上它们是itchat创建的有用类。它们有有用的键和有用的接口。
[Python] 纯文本查看 复制代码
@itchat.msg_register(TEXT)
def _(msg):
    # equals to print(msg['FromUserName'])
    print(msg.fromUserName)
[Python] 纯文本查看 复制代码
author = itchat.search_friends(nickName='LittleCoder')[0]
author.send('greeting, littlecoder!')

3.2各种信息类型的注册
[Python] 纯文本查看 复制代码
import itchat, time
from itchat.content import *

@itchat.msg_register([TEXT, MAP, CARD, NOTE, SHARING])
def text_reply(msg):
    msg.user.send('%s: %s' % (msg.type, msg.text))

@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):
    msg.download(msg.fileName)
    typeSymbol = {
        PICTURE: 'img',
        VIDEO: 'vid', }.get(msg.type, 'fil')
    return '@%s@%s' % (typeSymbol, msg.fileName)

@itchat.msg_register(FRIENDS)
def add_friend(msg):
    msg.user.verify()
    msg.user.send('Nice to meet you!')

@itchat.msg_register(TEXT, isGroupChat=True)
def text_reply(msg):
    if msg.isAt:
        msg.user.send(u'@%s\u2005I received: %s' % (
            msg.actualNickName, msg.text))

itchat.auto_login(True)
itchat.run(True)
3.3二维码命令语句
[Python] 纯文本查看 复制代码
itchat.auto_login(enableCmdQR=True)

# for some linux system, width of block character is one instead of two, so enableCmdQR should be 2
itchat.auto_login(enableCmdQR=2)

#change background color
itchat.auto_login(enableCmdQR=-1)
3.4Hot reload
[Asm] 纯文本查看 复制代码
#By using the following command, you may reload the program without re-scan QRCode in some time.

itchat.auto_login(hotReload=True)

3.5用户搜索
1.    获得自身用户信息
2.    通过用户名获得用户信息
3.    获取备注名称或微信帐号或昵称与功能名称密钥匹配的用户信息
4.    获取其备注名称,微信帐号和昵称与给予该功能的用户信息相匹配的用户信息
[Python] 纯文本查看 复制代码
# get your own user information
itchat.search_friends()
# get user information of specific username
itchat.search_friends(userName='@abcdefg1234567')
# get user information of function 3
itchat.search_friends(name='littlecodersh')
# get user information of function 4
itchat.search_friends(wechatAccount='littlecodersh')
# combination of way 3, 4
itchat.search_friends(name='LittleCoder机器人', wechatAccount='littlecodersh')

3.6下载与发送
·        itchat的附件下载功能在msg的Text键中
·        文件名(图片的默认名称)位于msg的FileName键中
·        下载功能接受一个位置值(包括文件名)并相应地存储附件。
[Python] 纯文本查看 复制代码
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):
    msg.download(msg.fileName)
    itchat.send('@%s@%s' % (
        'img' if msg['Type'] == 'Picture' else 'fil', msg['FileName']),
        msg['FromUserName'])
    return '%s received' % msg['Type']
    
#If you don’t want a local copy of the picture, you may pass nothing to the function to get a binary string.
@itchat.msg_register([PICTURE, RECORDING, ATTACHMENT, VIDEO])
def download_files(msg):
    with open(msg.fileName, 'wb') as f:
        f.write(msg.download())

3.7Multi instance(用户多开)
·        Youmay use the following commands to open multi instance.
[Python] 纯文本查看 复制代码
import itchat

newInstance = itchat.new_instance()
newInstance.auto_login(hotReload=True, statusStorageDir='newInstance.pkl')

@newInstance.msg_register(itchat.content.TEXT)
def reply(msg):
    return msg['Text']

newInstance.run()
3.8登录和注销后设置回调
·        通过loginCallback和exitCallback设置登录和注销的回调。
[Python] 纯文本查看 复制代码
import time

import itchat

def lc():
    print('finish login')
def ec():
    print('exit')

itchat.auto_login(loginCallback=lc, exitCallback=ec)
time.sleep(3)
itchat.logout()
·    如果未设置loginCallback,将删除qr图片并清除cmd。
  ·     如果您通过手机退出,也会调用exitCallback。

4. 选题背景
·        随着聊天软件的逐渐进步,不知什么时候开始,微信以及QQ都已经提供了消息撤回的功能,提供撤回功能的目的呢,无非就是以下几点:打错字了;发完消息后悔了;调皮了一下却不想让更多的人(或某个人)看到(更多的出现在群组里)。
5. 发现问题
·        但是人类的好奇心是无法满足的,越是撤回的消息,就越是想要看到,尤其是以下情况:你的朋友(说不定是心上人哦~)撤回了发来的消息,然而你错过了、你的群组里有人撤回了消息,后面是一群人的惊呼,然而你错过了。·        怎么可以这样!!!这时候,你(我)就需要一款能够查看撤回消息的神兵利器了!怎么办?当然是求助python了!
6. 提炼问题
·        要解决WeChat防撤回的功能,主要有以下几个问题有待解决。
1.    如何用程序登录自己的微信账号
2.    如何用程序获取账号接收到的消息
3.    如何识别接收到的消息的不同类别,并作出不同的处理
4.    如何实时保存接收到的消息
5.    如何检测到其他用户的“撤回”指令
6.    如何根据“撤回”指令在保存下来的消息中检索到被撤回的消息内容
7.    如何在微信中显示撤回的不同类型的内容
7. 解决方案
·        通过查询了解到,python有一个名为itchat的第三方库,专门为WeChat所写
·        ++itchatis an open source api for WeChat, a commonly-used Chinese social networkingapp.
      Accessing your personal wechat account through itchat in python has never beeneasier.
++
     ++itchat
是微信的开源API,微信是一种常用的中文社交网络应用程序。通过python中的itchat访问您的个人微信帐户变得前 所未有的如此简单
·        上面的一段话是PyPI对itchat库的介绍,而我们微信防撤回系统的实现也是基于itchat库的。
·        方法:通过itchat库实现个人微信的登录、消息获取以及分类处理、撤回消息指令的识别以及撤回消息的寻找、撤回内容在wechat上的显示。
8. 分析设计
8.0 准备
·        本部分是对各个问题关键点进行的分析设计,主要是各个问题需要用什么样的知识点、什么样的函数来完成,具体步骤以及完整代码请见下面“5. 代码实现”部分·        在对WeChat开始“骚”操作之前,首先我们要有一定的知识储备,我首先对itchat库进行了初步的学习,学习笔记参见附件。
问题8.1 : 如何用程序登录自己的微信账号?
[Python] 纯文本查看 复制代码
#通过此函数实现账号登录
itchat.login()

问题8.2 : 如何用程序获取账号接收到的消息
问题8.3 : 如何识别接收到的消息的不同类别,并作出不同的处理
[Python] 纯文本查看 复制代码
# 对消息进行注册使用下面的语句

@itchat.msg_register([a,b,c])

# 以下实现了对不同类别a,b,c的分类以及处理处理

def handleRMsg(msg):
    # balabala
问题8.4 : 如何实时保存接收到的消息
[Python] 纯文本查看 复制代码
# 创建一个全局变量字典,用来保存消息相关信息
msg_info = {}

# 在对消息处理之后将信息储存到msg_info中
msg_info.update(
        {
            msg_id: {
                "":
                "":
                "":
                "":
            }
        }
    )
问题8.5 : 如何检测到其他用户的”撤回“指令
[Python] 纯文本查看 复制代码
if '撤回了一条消息' in msg['Content']:
问题8.6 : 如何根据“撤回”指令在保存下来的消息中找到被撤回的消息内容
[Python] 纯文本查看 复制代码
# 用正则表达式查找message id
recall_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1)
# 在存储的信息中根据message id查找消息
recall_msg = msg_info.get(recall_msg_id)
问题8.7 : 如何在微信中显示撤回的不同类型的内容
[Python] 纯文本查看 复制代码
# 将消息发送到文件传输助手以便查看
itchat.send_msg(msg_prime, toUserName='filehelper')
9. 代码实现
9.-1 结构
·        我们首先清晰一下程序的大致结构
  1.    库引用
  2.    全局变量设置
  3.    登录
  4.    处理接收到的信息
  5.    分类处理
  6.    更新存储变量的字典
  7.    监测是否有消息撤回若有,找回消息
  8.    分类处理
  9.    显示消息
  10. 弹出该消息并run
9.0 库引用
·        本次将会用到以下几个函数库,其中,itchat.content以此方式引用更利于代码的美观以及简洁。
[Python] 纯文本查看 复制代码
import re
import time
import itchat
import platform
from itchat.contentimport *

9.1 全局变量设置
·        说是全局变量设置,但事实上用到的全局变量就只有一个存储消息相关信息的字典~(@^_^@)~
[Python] 纯文本查看 复制代码
# 用来存储消息相关信息的字典
msg_info = {}
9.2 登录
[Python] 纯文本查看 复制代码
# 调用platform库判断操作系统,以便接下来的登录操作
# 登录函数如下,该函数执行过后用户可通过扫描二维码登录网页版微信
ifplatform.platform()[:7] == 'Windows':
        itchat.login(enableCmdQR=False)
else:
        itchat.login(enableCmdQR=True)

9.3 处理接收到的信息
[Python] 纯文本查看 复制代码
# 注册,分别对应文本,图片,好友申请,名片,地图信息,分享,语音,附件,视频
# isFriendChat对应朋友会话,isMpChat对应公众号会话,另isGroupChat对应群组会话
@itchat.msg_register([TEXT,PICTURE, FRIENDS, CARD, MAP, SHARING, RECORDING, ATTACHMENT, VIDEO],isFriendChat=True, isMpChat=True)
def handleRMsg(msg):
        # 获取接收消息的时间并将时间字符串格式化
        msg_time_receive = time.strftime("%Y-%m-%d%H:%M:%S", time.localtime())
        # 获取发信人信息
        try:
            # 通过'FromUserName'寻找到一个字典并取其'NickName'赋值给msg_from
               msg_from =itchat.search_friends(userName=msg['FromUserName'])['NickName']
        except:
            # 如果非正常,则是WeChat官方声明
               msg_from = 'WeChat Official Accounts'
        # 获取发信时间
        msg_time_send = msg['CreateTime']
        # 获取信息ID
        msg_id = msg['MsgId']
        # 消息内容置空
        msg_content = None
        # link置空
        msg_link = None
9.4 分类处理
[Python] 纯文本查看 复制代码
# 文本或者好友推荐
        if msg['Type'] == 'Text' or msg['Type'] == 'Friends':
               msg_content = msg['Text']
               print('[Text/Friends]: %s' % 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('[Attachment/Video/Picture/Recording]: %s' %msg_content)
        # 推荐名片
        elif msg['Type'] == 'Card':
               msg_content = msg['RecommendInfo']['NickName'] + '的推荐名片,'
               if msg['RecommendInfo']['Sex'] == 1:
                       msg_content += '性别男。'
               else:
                       msg_content += '性别女。'
               print('[Card]: %s' % msg_content)
        # 位置信息
        elif msg['Type'] == 'Map':
               x, y, location = re.search("<locationx=\"(.*?)\" y=\"(.*?)\".*label=\"(.*?)\".*",msg['OriContent']).group(1, 2, 3)
               if location is None:
                       msg_content = r"纬度:" + x.__str__() + ", 经度:" + y.__str__()
               else:
                       msg_content = r"" + location
               print('[Map]: %s' % msg_content)
        # 分享的音乐/文章
        elif msg['Type'] == 'Sharing':
               msg_content = msg['Text']
               msg_link = msg['Url']
               print('[Sharing]: %s' % msg_content)

9.5 更新存储变量的字典
[Python] 纯文本查看 复制代码
# 更新
    msg_info.update(
                    {
                            msg_id: {
                                    "msg_from": msg_from,
                                    "msg_time_send": msg_time_send,
                                    "msg_time_receive": msg_time_receive,
                                    "msg_type": msg["Type"],
                                    "msg_content": msg_content,
                                    "msg_link": msg_link
                            }
                    }
            )
9.6 监测是否有消息撤回若有,找回消息
[Python] 纯文本查看 复制代码
# 再次注册NOTE即通知类型
@itchat.msg_register(NOTE,isFriendChat=True, isGroupChat=True, isMpChat=True)
def monitor(msg):
        if '撤回了一条消息' in msg['Content']:
            # 此处\<msgid\>(.*?)\<\/msgid\>的原因是,如果将msg['Content']打印出来,会在其中得到含有\<msgid\> \<\/msgid\>的一段信息
            # 而(.*?)则是正则表达式,用于匹配其中的任意字符串
            # 同时,group(1)表示从第一个左括号处开始匹配
               recall_msg_id =re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1)
               recall_msg = msg_info.get(recall_msg_id)
               print('[Recall]: %s' % recall_msg)

9.7 分类处理 && 9.8 显示消息
[Python] 纯文本查看 复制代码
# 分类并处理
        msg_prime = '---' +recall_msg.get('msg_from') + '撤回了一条消息---\n' \
                                       '消息类型:' + recall_msg.get('msg_type') + '\n' \
                                       '时间:' + recall_msg.get('msg_time_receive') + '\n' \
                                       '内容:' + recall_msg.get('msg_content')
        if recall_msg['msg_type'] == 'Sharing':
            msg_prime += '\n链接:' + recall_msg.get('msg_link')
        # 向文件助手发送消息
        itchat.send_msg(msg_prime,toUserName='filehelper')        if recall_msg['msg_type'] =='Attachment' or recall_msg['msg_type'] == "Video" orrecall_msg['msg_type'] == 'Picture' or recall_msg['msg_type'] == 'Recording':            file = '@fil@%s' %(recall_msg['msg_content'])            itchat.send(msg=file,toUserName='filehelper')

9.9 弹出该消息并run
[Python] 纯文本查看 复制代码
# 弹出并run
        msg_info.pop(recall_msg_id)
itchat.run()

10. 完整代码
[Asm] 纯文本查看 复制代码
import re
import time
import itchat
import platform
from itchat.content import *
# 用来存储消息相关信息的字典
msg_info = {}
# 调用platform库判断操作系统,以便接下来的登录操作
# 登录函数如下,该函数执行过后用户可通过扫描二维码登录网页版微信
if platform.platform()[:7] == 'Windows':
	itchat.login(enableCmdQR=False)
else:
	itchat.login(enableCmdQR=True)
# 注册,分别对应文本,图片,好友申请,名片,地图信息,分享,语音,附件,视频
# isFriendChat对应朋友会话,isMpChat对应公众号会话,另isGroupChat对应群组会话
@itchat.msg_register([TEXT, PICTURE, FRIENDS, CARD, MAP, SHARING, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True, isMpChat=True)
def handleRMsg(msg):
	# 获取接收消息的时间并将时间字符串格式化
	msg_time_receive = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
	# 获取发信人信息
	try:
		# 通过'FromUserName'寻找到一个字典并取其'NickName'赋值给msg_from
		msg_from = itchat.search_friends(userName=msg['FromUserName'])['NickName']
	except:
		# 如果非正常,则是WeChat官方声明
		msg_from = 'WeChat Official Accounts'
	# 获取发信时间
	msg_time_send = msg['CreateTime']
	# 获取信息ID
	msg_id = msg['MsgId']
	# 消息内容置空
	msg_content = None
	# link置空
	msg_link = None
# 文本或者好友推荐
	if msg['Type'] == 'Text' or msg['Type'] == 'Friends':
		msg_content = msg['Text']
		print('[Text/Friends]: %s' % 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('[Attachment/Video/Picture/Recording]: %s' % msg_content)
	# 推荐名片
	elif msg['Type'] == 'Card':
		msg_content = msg['RecommendInfo']['NickName'] + '的推荐名片,'
		if msg['RecommendInfo']['Sex'] == 1:
			msg_content += '性别男。'
		else:
			msg_content += '性别女。'
		print('[Card]: %s' % msg_content)
	# 位置信息
	elif msg['Type'] == 'Map':
		x, y, location = re.search("<location x=\"(.*?)\" y=\"(.*?)\".*label=\"(.*?)\".*", msg['OriContent']).group(1, 2, 3)
		if location is None:
			msg_content = r"纬度:" + x.__str__() + ", 经度:" + y.__str__()
		else:
			msg_content = r"" + location
		print('[Map]: %s' % msg_content)
	# 分享的音乐/文章
	elif msg['Type'] == 'Sharing':
		msg_content = msg['Text']
		msg_link = msg['Url']
		print('[Sharing]: %s' % msg_content)
	msg_info.update(
		{
			msg_id: {
				"msg_from": msg_from,
				"msg_time_send": msg_time_send,
				"msg_time_receive": msg_time_receive,
				"msg_type": msg["Type"],
				"msg_content": msg_content,
				"msg_link": msg_link
			}
		}
	)
# 再次注册NOTE即通知类型
@itchat.msg_register(NOTE, isFriendChat=True, isGroupChat=True, isMpChat=True)
def monitor(msg):
	if '撤回了一条消息' in msg['Content']:
		# 此处\<msgid\>(.*?)\<\/msgid\>的原因是,如果将msg['Content']打印出来,会在其中得到含有\<msgid\> \<\/msgid\>的一段信息
	    # 而(.*?)则是正则表达式,用于匹配其中的任意字符串
	    # 同时,group(1)表示从第一个左括号处开始匹配
		recall_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1)
		recall_msg = msg_info.get(recall_msg_id)
		print('[Recall]: %s' % recall_msg)
		msg_prime = '---' + recall_msg.get('msg_from') + '撤回了一条消息---\n' \
														 '消息类型:' + recall_msg.get('msg_type') + '\n' \
																								'时间:' + recall_msg.get(
			'msg_time_receive') + '\n' \
								  '内容:' + recall_msg.get('msg_content')
		if recall_msg['msg_type'] == 'Sharing':
			msg_prime += '\n链接:' + recall_msg.get('msg_link')
		# 向文件助手发送消息
		itchat.send_msg(msg_prime, toUserName='filehelper')
		if recall_msg['msg_type'] == 'Attachment' or recall_msg['msg_type'] == "Video" or recall_msg[
			'msg_type'] == 'Picture' or recall_msg['msg_type'] == 'Recording':
			file = '@fil@%s' % (recall_msg['msg_content'])
			itchat.send(msg=file, toUserName='filehelper')
		msg_info.pop(recall_msg_id)
itchat.run()

免费评分

参与人数 5吾爱币 +5 热心值 +5 收起 理由
dayangda163 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
langzixdjun + 1 热心回复!
dreamluck + 1 + 1 我很赞同!
msylgj + 1 + 1 用心讨论,共获提升!
wushaominkk + 2 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Norton 发表于 2019-2-15 22:04
楼主给力
dayangda163 发表于 2019-3-5 15:21
changjiang 发表于 2019-3-5 15:56
首先,itchat走的是网页版协议,稳不稳定暂且放在一边,一些高级的操作(比如抢红包)这玩意是做不了的
其次,itchat多开并不好,虽然可以通过某些手段节省内存达到批量多开的一个目的,但是目前微信对网页版检测机制并不低,多开模拟器成本又比较高,实在是有点鸡肋了
52pojiewang52 发表于 2020-10-6 10:21
可惜了这个帖子
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 23:19

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表