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

news2024/9/20 9:45:47

实现的功能

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

检索表情包

检索表情包的功能实现比较麻烦,至少需要两个模型:ocr和图片描述生成,如果更复杂点的话还需要分词算法、数据库等。

需要ocr应该很容易理解,表情包里面包含文字信息,使用ocr将文字提取出来,这个文字基本就可以作为检索的信息了。

如果表情没有文字,那只能使用一些模型,为图片生成一个简单的描述,然后将这个描述作为检索的信息。

搜了一下目前开源的模型里面没看到比较合适的。后面如果遇到了再做一个简单的表情包检索程序。

开始实现

效果图

github代码

https://github.com/kanadeblisst00/WeChat-PyRobot

http://www.pygrower.cn:21180/kanadeblisst/WeChat-PyRobot

实现原理

使用Python来监听微信消息,如果收到表情包消息就提取里面的链接并下载,因为表情包xml消息里有一个未加密的链接。

监听消息的原理和代码可以看之前的一篇文章: 【Python微信机器人】第八篇: 实战32位和64位接收消息和消息防撤回

代码在上篇文章的基础上做了如下优化:

  1. 使用队列存储监听到的消息
  2. 支持加载消息插件来处理消息
  3. 支持注入后就自动监听消息
待实现插件列表
  • 监听群聊中的群二维码
  • 监听并实时采集关注的公众号文章
  • 自动下载并解密聊天中的图片
  • chatgpt自动回复
  • 群消息关键词提醒
  • 消息保存到数据库,如sqlite、postgresql等
  • 自动接收转账
  • 监听收款信息对接发卡平台,目前可以用v免签+独角数卡

开始监听并下载表情包

准备工作
  1. 安装支持的版本微信(目前只写了3.9.8.123.9.8.15的代码)
  2. 安装32位或64位Python(取决于你安装的微信是32位还是64位),Python版本需大于等于3.8
  3. pip install wechat_pyrobot==1.1.1

如果国内源还没有同步最新版本,可以指定-i https://pypi.org/simple/选项使用pip官方库

开始监听消息

先启动并登录微信,随便创建一个文件夹,然后创建一个文件main.py(名称随意)写入以下代码:

from py_process_hooker import inject_python_and_monitor_dir
from wechat_pyrobot import get_on_startup
from wechat_pyrobot.msg_plugins import PrintMsg, DownLoadEmotion


if __name__ == "__main__":
    process_name = "WeChat.exe"
    open_console = True
    on_startup = get_on_startup(msg_plugins=[PrintMsg, DownLoadEmotion])

    inject_python_and_monitor_dir(process_name, __file__, open_console=open_console, on_startup=on_startup)

使用Python运行这段代码,就会将Python注入到微信,并且开始监听微信收到的消息,然后将监听到的消息依次传递给msg_plugins指定的插件列表。

DownLoadEmotion插件就是用来下载表情包的,里面的代码很简单:

class DownLoadEmotion(MsgPluginTemplate):
    def __init__(self, **kwargs) -> None:
        self.name = os.path.basename(__file__)[:-3]
        super().__init__(**kwargs)
        self.emotion_save_path = os.path.join(kwargs["pwd"], "emotion")
        os.makedirs(self.emotion_save_path, exist_ok=True)

    def deal_msg(self, msg_dict):
        if msg_dict["msg_type"] != 0x2F:
            return
        xml = msg_dict["content"]
        root = ET.fromstring(xml) 
        datas = dict(root.find('.//emoji').items())
        cdnurl = datas["cdnurl"].replace('&', '&')
        filename = msg_dict["file_path"]
        if not filename:
            filename = msg_dict["msgid"]
        save_path = f"{self.emotion_save_path}{os.sep}{filename}.gif"
        with open(save_path, 'wb') as f:
            f.write(self.download_file(cdnurl))

    def download_file(self, url, retry=0):
        if retry > 2:
            return
        headers = {
            "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"
        }
        try:
            resp = requests.get(url, headers=headers, timeout=6)
        except:
            traceback.print_exc()
            time.sleep(2)
            return self.download_file(url, retry+1)
        return resp.content

先判断一下消息类型是不是0x2F,也就是表情包的消息类型,然后提取xml数据里的cdnurl,用requests下载下来保存到本地

编写自己的插件

可以先参考目前已有的插件例子,代码在wechat_pyrobot/msg_plugins, 在github或者pip本地目录都可以看到

编写一个消息保存到文件的插件

插件需要继承MsgPluginTemplate,然后实现deal_msg方法,方法只有一个参数:字典类型的消息

my_msg_plugin/save_to_file.py

import os
import json
from wechat_pyrobot.plugin_class import MsgPluginTemplate


class SaveToFile(MsgPluginTemplate):
    def __init__(self, **kwargs) -> None:
        self.name = os.path.basename(__file__)[:-3]
        super().__init__(**kwargs)
        # kwargs["pwd"]是main.py所在路径
        self.msg_save_path = os.path.join(kwargs["pwd"], "msg_save_path")
        os.makedirs(self.msg_save_path, exist_ok=True)

    def deal_msg(self, msg_dict):
        path = os.path.join(self.msg_save_path, f'{msg_dict["msgid"]}.json')
        with open(path, 'w', encoding='utf-8') as f:
            f.write(json.dumps(msg_dict)) 

然后在注入的代码(main.py)里加载它,需要重新启动并注入微信

from py_process_hooker import inject_python_and_monitor_dir
from wechat_pyrobot import get_on_startup
from wechat_pyrobot.msg_plugins import PrintMsg, DownLoadEmotion
from my_msg_plugin.save_to_file import SaveToFile

if __name__ == "__main__":
    process_name = "WeChat.exe"
    open_console = True
    on_startup = get_on_startup(msg_plugins=[PrintMsg, DownLoadEmotion, SaveToFile])

    inject_python_and_monitor_dir(process_name, __file__, open_console=open_console, on_startup=on_startup)

这样收到的消息都会保存到文件,当然这个只是示例。实际应该按时间来分类文件,或者保存到数据库中。

插件列表是有顺序的,在执行时会依次执行,如果之前的插件修改了消息字典,那么之后的插件得到的消息字典就是修改后的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1398981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mariadb数据库从入门到精通

mariadb数据库的安装以及安全初始化 mariadb数据库的安装以及安全初始化 mariadb数据库的安装以及安全初始化一、实验前提二、mariadb数据库的安装三、mariadb数据库安全初始化3.1 设定数据库基本的安全初始化3.2关闭对外开放端口 系列文章目录一、查看数据库二、进入库并且查看…

Python网络爬虫步骤是什么?新手小白必看 !

python网络爬虫步骤:首先准备所需库,编写爬虫调度程序;然后编写url管理器,并编写网页下载器;接着编写网页解析器;最后编写网页输出器即可。 本教程操作环境:windows7系统、python3.9版&#xff…

2024Java高频面试题之MQ消息中间件,面试都问些什么?(附详细答案)

最近很多同学问我有没有java学习资料,我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我公众号:“ Tom聊架构 ”, 回复暗号:“ 578”即…

游戏开发中的噪声算法

一、噪声 噪声是游戏编程的常见技术,广泛应用于地形生成,图形学等多方面。 那么为什么要引入噪声这个概念呢?在程序中,我们经常使用直接使用最简单的rand()生成随机值,但它的问题在于生成的随机值太“随机”了&#xf…

轻松一刻 浅休息下哈

yum -y install epel-release yum install -y linux_logo cal 此命令以日历表的方式显示日期 curl http://wttr.in 此网站进行在屏幕上面显示天气情况 vim /etc/motd 修改这个文件可以让你刚登录linux 系统显示图形效果 \ ------------ / …

SQL Server Management Studio创建数据表

文章目录 一、建表注意事项1.1 数据类型1.2 建立数据表的基本SQL语法 二、实例说明2.1 创建数据表2.2 实例2 三、标识列和主键示例: 一、建表注意事项 1.1 数据类型 可以看这个去了解数据类型: 1.2 建立数据表的基本SQL语法 建立数据表的基本 SQL 语…

LabVIEW振动数据采集与分析系统

在这个项目中, LabVIEW软件配合精确的硬件组件,以实现高效的振动数据采集和复杂信号分析。硬件方面,系统采用了PCB振动加速度传感器的高灵敏度传感器,以及NI9234型号的数据采集卡,确保了数据采集的高精度和可靠性。软件…

单表查询 -- MySQL(3)

目录 题目: 创建表: 问题(17个): 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号,不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工资和最低工资。 5、列出职工…

等离子环制作

免责声明 在您参考该博客制作等离子环前,请仔细阅读以下重要安全警告和免责说明。使用本文档即表示您已充分了解并同意以下条款: 等离子环的危险性:等离子环在运行时玻璃瓶身会产生高温,存在低温烧伤风险。任何时候都不建议用手…

浅谈安科瑞Acrel-2000MG微电网能量管理系统的设计与应用-安科瑞 蒋静

Acrel-2000MG是安科瑞结合当前新型电力系统下微电网的发展与需求研发的一款微电网能量管理系统。通过采集微电网内部源、网、荷、储的实时状态并根据天气预报信息对新能源发电与用电负荷进行预测,利用可控资源和分布式资源分析计算最优调度运行策略,在条…

操作教程|JumpServer堡垒机结合Ansible进行批量系统初始化

运维人员常常需要对资产进行系统初始化的操作,而初始化服务器又是一项繁琐的工作,需要花费运维人员大量的时间和精力。为了提高效率,许多组织会使用自动化工具和脚本来简化这些任务。自动化工具的运用可以大幅降低运维人员的工作量&#xff0…

一次TCP TIME_WAIT连接数过多告警处理

一次TCP TIME_WAIT连接数过多告警处理 1、前言2、问题回顾3、解决方案 更多技术文章,快来关注微信公众号“运维之美”,不定期更新领取IT学习资料 1、前言 客户环境上在业务高峰期的时候,突然收到主机的TCP time_wait连接数告警过多的告警。运…

Spring第六天(注解开发第三方Bean)

注解开发管理第三方Bean 显然,我们无法在第三方Bean中写入诸如service这样的注解,所以,Spring为我们提供了Bean这一注解来让我们通过注解管理第三方Bean 第二种导入方式由于可读性太低,故只介绍第一种导入方式,这里我…

项目过程管理(禅道)

文章目录 1、禅道的简介2、禅道的安装3、禅道的使用3.1、超级管理员使用操作3.2、产品经理使用操作3.3、项目经理使用操作3.4、测试主管使用操作3.5、项目经理(新建一个项目)3.6、测试主管(对项目发布的第一个版本进行一个测试)3.…

Java 面向对象基础 (二)

Java 面向对象基础 (二) 文章目录 Java 面向对象基础 (二)面向对象三大特征封装继承多态 接口和抽象类有什么共同点和区别?深拷贝和浅拷贝区别了解吗?什么是引用拷贝?浅拷贝深拷贝 文章来自Java Guide 用于学习如有侵权,立即删除 …

(2)(2.1) Andruav Android Cellular(一)

文章目录 前言 1 Andruav 是什么? 2 Andruav入门 3 Andruav FPV 4 Andruav GCS App​​​​​​​ 前言 Andruav 是一个基于安卓的互联系统,它将安卓手机作为公司计算机,为你的无人机和遥控车增添先进功能。 1 Andruav 是什么&#xff…

【Linux】相关背景及环境搭建

前言: 认识 Linux, 了解 Linux 的相关背景,学会如何使用云服务器,掌握使用远程终端工具 xshell 登陆 Linux 服务器 文章目录 一、Linux介绍1.1 关于UNIX1.2 Linux的诞生及发展历程1.3 Linux开源1.4 Linux在各个行业的现状1.5 发行版本 二、Li…

黑色金属厂房3d数据可视化综合平台进一步保障生产效率

在当今的数字化时代,钢铁厂面临着降本增效、绿色环保、安全第一等发展问题,亟需寻找更有效的解决方案,数字孪生公司深圳华锐视点利用先进的数字孪生可视化、web3D开发和VR虚拟仿真技术制作数字孪生钢铁厂可视化管控平台,实现对钢铁…

SCI 2区论文:医疗保健中心训练有素的脑膜瘤分割模型的性能测试-基于四个回顾性多中心数据集的二次分析

基本信息 标题:Performance Test of a Well-Trained Model for Meningioma Segmentation in Health Care Centers: Secondary Analysis Based on Four Retrospective Multicenter Data Sets中文标题:医疗保健中心训练有素的脑膜瘤分割模型的性能测试&am…

Prompt高级技巧:Few-Shots、COT、SC、TOT、Step-Back

CRISPE框架 如图所示。所谓CRISPE框架,指的是: CR:Capacity and Role(能力与角色)。你希望 ChatGPT 扮演怎样的角色。I:Insight(洞察),背景信息和上下文。S:&#xff08…