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

实现的功能

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

检索表情包

检索表情包的功能实现比较麻烦,至少需要两个模型: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)

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis: Redis介绍

文章目录 一、redis介绍二、通用的命令三、数据结构1、字符串类型(String)(1)介绍(2)常用命令(3)数据结构 2、列表(List)(1)介绍&…

【C语言编程之旅 6】刷题篇-for循环

第1题 解析 思路&#xff1a; 两个循环进行控制 外层循环控制打印多少行 内部循环控制每行打印多少个表达式以及表达式内容&#xff0c; 比较简单&#xff0c;具体参考代码 #include <stdio.h> int main() {int i 0;//控制行数for(i1; i<9; i){//打印每一行内容&am…

FlinkAPI开发之处理函数

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 概述 之前所介绍的流处理API&#xff0c;无论是基本的转换、聚合&#xff0c;还是更为复杂的窗口操作&#xff0c…

STL——list

1、list介绍 1. list 是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list 的底层是带头双向循环链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后…

三国游戏(寒假每日一题+贪心、枚举)

题目 小蓝正在玩一款游戏。 游戏中魏蜀吴三个国家各自拥有一定数量的士兵 X,Y,Z&#xff08;一开始可以认为都为 0&#xff09;。 游戏有 n 个可能会发生的事件&#xff0c;每个事件之间相互独立且最多只会发生一次&#xff0c;当第 i个事件发生时会分别让 X,Y,Z 增加 Ai,Bi…

谈判(贪心算法)

题目 import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner;public class Main {public static void main(String[] args) { Scanner sc new Scanner(System.in);int n sc.nextInt();sc.nextLine();List<Integ…

【GitHub项目推荐--AI杀入斗地主领域】【转载】

AlphaGo&#xff1a;第一个战胜围棋世界冠军的人工智能机器人。 我不会玩围棋&#xff0c;没办法和 AlphaGO 对局。但是我喜欢玩斗地主&#xff0c;有斗地主人工智能机器人吗&#xff1f; 有&#xff0c;而且还开源了。DouZero&#xff1a;快手团队开发的斗地主AI。别的不说&…

CSS注释

CSS注释 哇&#xff0c;最近我发现CSS里面的注释真是个好东西呢&#xff01;虽然它们不会在网页上显示出来&#xff0c;但是对于我这样的新手来说&#xff0c;真的很有助于理解代码是怎么工作的。 CSS注释的小秘密 你知道吗&#xff0c;CSS里的注释就像是小纸条&#xff0c;…

funcy,一个超酷的 Python 库

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - funcy。 Github地址&#xff1a;https://github.com/Suor/funcy 函数式编程是一种强大的编程范式&#xff0c;它强调将计算视为数学函数的评估&#x…

ELK之使用Grafana读取ES集群的Nginx日志进行分析展示

一、前提: 直通车 ------------>↓↓↓↓↓↓ 需要ES集群 https://blog.csdn.net/wdy_2099/article/details/125441436需要filebeat https://blog.csdn.net/wdy_2099/article/details/125445893需要logstash https://blog.csdn.net/wdy_2099/article/details/125464226需要…

python入门知识点:分支结构

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 1.内容导图 2.流程图介绍 绘制要求&#xff1a;不能出现程序语言的语法 3.百分制转五级计分制 分支结构&#xff1a;语句块&#xff0c;冒号缩进表示归属 单分支&…

系统架构设计师

软考系统架构设计师笔记 专用的成电路&#xff08;Application Specific Integrated Circuit&#xff0c;ASIC) PTR记录&#xff1a;Pointer Record&#xff0c;常被用于反向地址解析&#xff0c;即通过IP地址查询服务器域名。 软件工程 软件开发模型 【增量模型的优点】 …

全网最详细丨2024年AMC8真题及答案来了

目录 前言 真题回忆 真题解析 结尾 前言 相信大家都已经知道今年AMC8出事情了吧&#xff0c;但最重要的还是要从中学到新知识。 听说今年考生被提前12分钟强制交卷了&#xff0c;肯定因为试题泄露了。 最新回复&#xff1a;我们这边已经退费了 真题回忆 需要word文档的请…

年会相关的英语小知识,柯桥成人学英语推荐哪里?

“年会”用英语怎么说&#xff1f; “年会”一般在一年的末尾举办&#xff0c;中国有些地方把这个时间称为“尾牙”&#xff0c;即指商家一年活动的尾声。“年会”中的“年”的翻译最好体现出“末尾”的意思。 因此&#xff0c;可以说&#xff1a;year-end party&#xff08;年…

国科大模式识别与机器学习2015-2019、2021、2023仅考题

2015 &#xff08;8&#xff09;试描述线性判别函数的基本概念&#xff0c;并说明既然有线性判别函&#xff0c;为什么还需要非线性判别函数&#xff1f;假设有两种模式&#xff0c;每类包括6个4维不同的模式&#xff0c;且良好分布。如果他们是线性可分的。问权向量至少需要几…

音频筑基:时延、帧长选取的考量

音频筑基&#xff1a;时延、帧长选取的考量 帧长与时延的关系帧长变化的影响参考资料 音频算法中&#xff0c;时延和音频帧长的选择通常是个需要平衡的参数&#xff0c;这里分析下背后的考量因素。 帧长与时延的关系 一般来说&#xff0c;帧长是音频算法端到端时延的子集&…

Spring第七天(Spring事务)

简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同操作同成功同失败 Spring事务作用&#xff1a;在数据层或业务层保障一系列的数据库操作同成功同失败 实现 第一步、在业务层接口上添加Spring事务管理 public interface BookService{Transactionalpublic void sa…

ARMv8-AArch64 的异常处理模型详解之异常类型 Exception types

异常类型详解 Exception types 一&#xff0c; 什么是异常二&#xff0c;同步异常&#xff08;synchronous exceptions&#xff09;2.1 无效的指令和陷阱异常&#xff08;Invalid instructions and trap exceptions&#xff09;2.2 内存访问产生的异常2.3 产生异常的指令2.4 调…

Hadoop详解

Hadoop 概念 就是一个大数据解决方案。它提供了一套分布式系统基础架构。 核心内容包含 hdfs 和mapreduce。hadoop2.0 以后引入 yarn. hdfs 是提供数据存储的&#xff0c;mapreduce 是方便数据计算的。 hdfs 又对应 namenode 和 datanode. namenode 负责保存元数据的基本信息…

如何进行产品的人机交互设计?

产品的人机交互设计是指通过用户界面和用户体验设计来优化产品与用户之间的交互过程&#xff0c;从而提高产品的易用性、可用性和用户满意度。人机交互设计需要考虑用户的需求、行为模式、心理感受以及技术实现&#xff0c;下面我将介绍如何进行产品的人机交互设计。 首先&…