翼度科技»论坛 编程开发 python 查看内容

使用Python监听并下载微信聊天表情包

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
实现的功能

只要有人给你发了表情包,不管是群聊还是个人发的,都将它保存到本地。也许某天斗图的时候就能用到,不过即使有了表情包,还需要一个检索功能,不然这一张一张看也太费眼睛了。
检索表情包

检索表情包的功能实现比较麻烦,至少需要两个模型:ocr和图片描述生成,如果更复杂点的话还需要分词算法、数据库等。
需要ocr应该很容易理解,表情包里面包含文字信息,使用ocr将文字提取出来,这个文字基本就可以作为检索的信息了。
如果表情没有文字,那只能使用一些模型,为图片生成一个简单的描述,然后将这个描述作为检索的信息。
搜了一下目前开源的模型里面没看到比较合适的。后面如果遇到了再做一个简单的表情包检索程序。
开始实现

效果图


github代码

https://github.com/kanadeblisst00/WeChat-PyRobot
http://www.pygrower.cn:21180/kanadeblisst/WeChat-PyRobot
实现原理

使用Python来监听微信消息,如果收到表情包消息就提取里面的链接并下载,因为表情包xml消息里有一个未加密的链接。
监听消息的原理和代码可以看之前的一篇文章: 【Python微信机器人】第八篇: 实战32位和64位接收消息和消息防撤回
代码在上篇文章的基础上做了如下优化:

  • 使用队列存储监听到的消息
  • 支持加载消息插件来处理消息
  • 支持注入后就自动监听消息
待实现插件列表


  • 监听群聊中的群二维码
  • 监听并实时采集关注的公众号文章
  • 自动下载并解密聊天中的图片
  • chatgpt自动回复
  • 群消息关键词提醒
  • 消息保存到数据库,如sqlite、postgresql等
  • 自动接收转账
  • 监听收款信息对接发卡平台,目前可以用v免签+独角数卡
开始监听并下载表情包

准备工作


  • 安装支持的版本微信(目前只写了3.9.8.12和3.9.8.15的代码)
  • 安装32位或64位Python(取决于你安装的微信是32位还是64位),Python版本需大于等于3.8
  • pip install wechat_pyrobot==1.1.1
如果国内源还没有同步最新版本,可以指定-i https://pypi.org/simple/选项使用pip官方库
开始监听消息

先启动并登录微信,随便创建一个文件夹,然后创建一个文件main.py(名称随意)写入以下代码:
  1. from py_process_hooker import inject_python_and_monitor_dir
  2. from wechat_pyrobot import get_on_startup
  3. from wechat_pyrobot.msg_plugins import PrintMsg, DownLoadEmotion
  4. if __name__ == "__main__":
  5.     process_name = "WeChat.exe"
  6.     open_console = True
  7.     on_startup = get_on_startup(msg_plugins=[PrintMsg, DownLoadEmotion])
  8.    
  9.     inject_python_and_monitor_dir(process_name, __file__, open_console=open_console, on_startup=on_startup)
复制代码
使用Python运行这段代码,就会将Python注入到微信,并且开始监听微信收到的消息,然后将监听到的消息依次传递给msg_plugins指定的插件列表。
DownLoadEmotion插件就是用来下载表情包的,里面的代码很简单:
  1. class DownLoadEmotion(MsgPluginTemplate):
  2.     def __init__(self, **kwargs) -> None:
  3.         self.name = os.path.basename(__file__)[:-3]
  4.         super().__init__(**kwargs)
  5.         self.emotion_save_path = os.path.join(kwargs["pwd"], "emotion")
  6.         os.makedirs(self.emotion_save_path, exist_ok=True)
  7.     def deal_msg(self, msg_dict):
  8.         if msg_dict["msg_type"] != 0x2F:
  9.             return
  10.         xml = msg_dict["content"]
  11.         root = ET.fromstring(xml)
  12.         datas = dict(root.find('.//emoji').items())
  13.         cdnurl = datas["cdnurl"].replace('&', '&')
  14.         filename = msg_dict["file_path"]
  15.         if not filename:
  16.             filename = msg_dict["msgid"]
  17.         save_path = f"{self.emotion_save_path}{os.sep}{filename}.gif"
  18.         with open(save_path, 'wb') as f:
  19.             f.write(self.download_file(cdnurl))
  20.    
  21.     def download_file(self, url, retry=0):
  22.         if retry > 2:
  23.             return
  24.         headers = {
  25.             "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183"
  26.         }
  27.         try:
  28.             resp = requests.get(url, headers=headers, timeout=6)
  29.         except:
  30.             traceback.print_exc()
  31.             time.sleep(2)
  32.             return self.download_file(url, retry+1)
  33.         return resp.content
复制代码
先判断一下消息类型是不是0x2F,也就是表情包的消息类型,然后提取xml数据里的cdnurl,用requests下载下来保存到本地
编写自己的插件

可以先参考目前已有的插件例子,代码在wechat_pyrobot/msg_plugins, 在github或者pip本地目录都可以看到
编写一个消息保存到文件的插件

插件需要继承MsgPluginTemplate,然后实现deal_msg方法,方法只有一个参数:字典类型的消息
my_msg_plugin/save_to_file.py
  1. import os
  2. import json
  3. from wechat_pyrobot.plugin_class import MsgPluginTemplate
  4. class SaveToFile(MsgPluginTemplate):
  5.     def __init__(self, **kwargs) -> None:
  6.         self.name = os.path.basename(__file__)[:-3]
  7.         super().__init__(**kwargs)
  8.         # kwargs["pwd"]是main.py所在路径
  9.         self.msg_save_path = os.path.join(kwargs["pwd"], "msg_save_path")
  10.         os.makedirs(self.msg_save_path, exist_ok=True)
  11.    
  12.     def deal_msg(self, msg_dict):
  13.         path = os.path.join(self.msg_save_path, f'{msg_dict["msgid"]}.json')
  14.         with open(path, 'w', encoding='utf-8') as f:
  15.             f.write(json.dumps(msg_dict))
复制代码
然后在注入的代码(main.py)里加载它,需要重新启动并注入微信
  1. from py_process_hooker import inject_python_and_monitor_dir
  2. from wechat_pyrobot import get_on_startup
  3. from wechat_pyrobot.msg_plugins import PrintMsg, DownLoadEmotion
  4. from my_msg_plugin.save_to_file import SaveToFile
  5. if __name__ == "__main__":
  6.     process_name = "WeChat.exe"
  7.     open_console = True
  8.     on_startup = get_on_startup(msg_plugins=[PrintMsg, DownLoadEmotion, SaveToFile])
  9.    
  10.     inject_python_and_monitor_dir(process_name, __file__, open_console=open_console, on_startup=on_startup)
复制代码
这样收到的消息都会保存到文件,当然这个只是示例。实际应该按时间来分类文件,或者保存到数据库中。
插件列表是有顺序的,在执行时会依次执行,如果之前的插件修改了消息字典,那么之后的插件得到的消息字典就是修改后的
本文由博客一文多发平台 OpenWrite 发布!

来源:https://www.cnblogs.com/kanadeblisst/p/17974469
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具