本文来源吾爱破解论坛
本帖最后由 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实际NickNameContent实际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()[size=13.3333px]· 如果未设置loginCallback,将删除qr图片并清除cmd。 [size=13.3333px]· 如果您通过手机退出,也会调用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. 弹出该消息并run9.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 = None9.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()
版权声明:
本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。
- 上一篇: python爬取免费优质IP归属地查询接口
- 下一篇: 【原创】Python爬取12306登录