Python 使用 WeChatFerry 搭建部署微信机器人详细教程(更新中)

下载安装 wcferry 库

通过 pip 快速安装 wcferry

pip install wcferry

免责声明:仅供学习和技术研究使用,不得用于任何商业或非法行为,否则后果自负。

基本原理

当微信收到消息时,抢在微信处理(显示到页面)前,先让工具处理,处理完之后再交还给原来的处理模块。需要发送消息时,模拟微信发送消息,组装好消息体,调用微信发送消息的模块。获取联系人,则是遍历一块特定的内存空间。通过好友验证,则是组装好验证信息,调用微信的验证模块。数据库相关功能,则是通过获取到数据库句柄,基于 sqlite3 的接口来执行。

在这里插入图片描述
博客地址:微信机器人 DIY 从 0 到 1

Wcf 函数说明

WeChatFerry:一个玩微信的工具(函数说明)

函数名称描述返回类型
cleanup关闭连接 回收资源None
keep_running阻塞进程(让 RPC 一直维持连接)
is_receiving_msg是否已启动接收消息功能bool
get_qrcode获取登录二维码(已经登录则返回空字符串)str
is_login检查登录状态bool
get_self_wxid获取登录账号的 wxidstr
get_msg_types获取所有消息类型Dict
get_contacts获取所有联系人List[Dict]
get_friends获取所有好友List[Dict]
get_dbs获取数据库List[str]
get_tables获取某数据库下的表List[Dict]
get_user_info获取登录账号个人信息Dict
get_audio_msg取语音消息并转成 MP3str
send_text发送文本消息(可 @)int
_download_file下载文件str
_process_path处理路径(如果是网络路径则下载文件)str
send_image发送图片(非线程安全)int
send_file发送文件(非线程安全)int
send_xml发送 XMLint
send_emotion发送表情int
send_rich_text发送富文本消息int
send_pat_msg拍一拍群友int
forward_msg转发消息int
get_msg从消息队列中获取消息WxMsg
enable_receiving_msg允许接收消息bool
enable_recv_msg允许接收消息(旧接口)bool
disable_recv_msg停止接收消息bool
query_sql执行 SQL 查询List[Dict]
accept_new_friend接受好友申请int
refresh_pyq刷新朋友圈int
download_attach下载附件int
get_info_by_wxid通过 wxid 查询微信号昵称等信息dict
revoke_msg撤回消息int
decrypt_image解密图片str
get_ocr_result获取 OCR 结果str
download_image下载图片str
add_chatroom_members添加群成员int
del_chatroom_members删除群成员int
invite_chatroom_members邀请群成员int
get_chatroom_members获取群成员Dict
get_alias_in_chatroom获取群名片str
receive_transfer接收转账int

电脑端检测登录微信

from wcferry import Wcfwcf = Wcf()

检测微信登陆状态

检查当前 PC 端微信登陆状态?

from wcferry import Wcfwcf = Wcf()
print(wcf.is_login())

获取登录账号信息

获取当前 PC 端微信账号信息?

from wcferry import Wcfwcf = Wcf()
print(wcf.get_user_info())

运行结果

{'wxid': 'wxid_***', 'name': '字里行间', 'mobile': '195********', 'home': 'C:\\Users\\Administrator\\Documents\\WeChat Files\\'}

开辟线程监听群消息

开启线程监听消息:判断是否是群消息?

from queue import Empty
from threading import Threadfrom wcferry import Wcf, WxMsgwcf = Wcf()def processMsg(msg: WxMsg):if msg.from_group():print(msg.content)def enableReceivingMsg():def innerWcFerryProcessMsg():while wcf.is_receiving_msg():try:msg = wcf.get_msg()processMsg(msg)except Empty:continueexcept Exception as e:print(f"ERROR: {e}")wcf.enable_receiving_msg()Thread(target=innerWcFerryProcessMsg, name="ListenMessageThread", daemon=True).start()enableReceivingMsg()wcf.keep_running()

微信消息属性说明

class WxMsg() 微信消息属性说明

属性说明

字段名类型描述
typeint消息类型 可通过 get_msg_types 获取
idstr消息 id
xmlstr消息 xml 部分
senderstr消息发送人
roomidstr(仅群消息有)群 id
contentstr消息内容
thumbstr视频或图片消息的缩略图路径
extrastr视频或图片消息的路径

消息类型

from wcferry import Wcfwcf = Wcf()
print(wcf.get_msg_types())
消息类型编号消息类型描述属性
0朋友圈消息int
1文字int
3图片int
34语音int
37好友确认int
40POSSIBLEFRIEND_MSGint
42名片int
43视频int
47石头剪刀布表情图片
48位置int
49共享实时位置、文件、转账、链接int
50VOIPMSGint
51微信初始化int
52VOIPNOTIFYint
53VOIPINVITEint
62小视频int
66微信红包int
9999SYSNOTICEint
10000红包、系统消息int
10002撤回消息int
1048625搜狗表情int
16777265链接int
436207665微信红包int
536936497红包封面int
754974769视频号视频int
771751985视频号名片int
822083633引用消息int
922746929拍一拍int
973078577视频号直播int
974127153商品链接int
975175729视频号直播int
1040187441音乐链接int
1090519089文件int

根据群名称查询群 wxid

特别注意:Wcf 没有提供根据群名称查询群 wxid 功能。我们可以先获取全部联系人数据(微信好友、微信群等等),基于 wxid 进行区分,因为微信群 wxid 后缀都是 “chatroom” 结尾。

from wcferry import Wcf, WxMsgwcf = Wcf()wcf_rooms = []for contact in wcf.get_contacts():if contact['wxid'].endswith("chatroom"):wcf_rooms.append(contact)def get_chatroom_roomid(wcf_rooms: list, room_name: str):for room in wcf_rooms:if room['name'] == room_name:return room['wxid']return Noneroom_id = get_chatroom_roomid(wcf_rooms=wcf_rooms, room_name="测试群")

定时发送群文件

如何进行定时发送群文件?通过 aspschedule 第三方库实现定时任务,然后调用 wcf.send_file 函数执行发送文件的消息。

from apscheduler.schedulers.background import BackgroundScheduler
from datetime import datetimefrom wcferry import Wcfwcf = Wcf()wcf_rooms = []for contact in wcf.get_contacts():if contact['wxid'].endswith("chatroom"):wcf_rooms.append(contact)def get_chatroom_roomid(wcf_rooms: list, room_name: str):for room in wcf_rooms:if room['name'] == room_name:return room['wxid']return Nonedef schedule_task_job(room_id: str, wcf: Wcf):wcf.send_file(path="test.txt", receiver=room_id)customize_time = "2024-05-09 09:10:10"
customize_room = "唤醒手腕测试群"
run_date = datetime.strptime(customize_time, "%Y-%m-%d %H:%M:%S")
room_id = get_chatroom_roomid(wcf_rooms, customize_room)scheduler = BackgroundScheduler()
scheduler.add_job(schedule_task_job, args=(room_id, wcf), run_date=run_date)
scheduler.start()wcf.keep_running()

运行结果

在这里插入图片描述

监听保存语音消息

from queue import Empty
from threading import Threadfrom wcferry import Wcf, WxMsgwcf = Wcf()def processMsg(msg: WxMsg):if msg.from_group():response = wcf.get_audio_msg(id=msg.id, dir=f"audio")print("语音地址:" + response)def enableReceivingMsg():def innerWcFerryProcessMsg():while wcf.is_receiving_msg():try:msg = wcf.get_msg()processMsg(msg)except Empty:continueexcept Exception as e:print(f"ERROR: {e}")wcf.enable_receiving_msg()Thread(target=innerWcFerryProcessMsg, name="ListenMessageThread", daemon=True).start()enableReceivingMsg()wcf.keep_running()

更新中······

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

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

相关文章

【Linux的文件篇章 - 管道文件】

Linux学习笔记---013 Linux的管道文件1、进程间通信1.1、进程为什么要通信?1.2、进程如何通信?1.3、进程通信的方式? 2、匿名管道2.1、理解一种现象2.2、基本概念和管道原理 3、管道的使用3.1、代码样例3.2、如何使用管道通信呢?3…

C++与java回调函数用法区别实例(二百七十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

【MyBatisPlus 分页插件解析】

文章目录 一、MyBatis Plus 和分页插件简介1.1 MyBatis Plus 简介CRUD操作简化动态SQL分页功能 1.2 分页插件的重要性提升用户体验提高数据处理效率 二、分页插件的使用2.1 引入分页插件2.2 配置分页插件2.3 使用分页查询 三、分页插件的原理3.1 内部工作机制3.2 物理分页与逻辑…

Netty 实现dubbo rpc

一、RPC 的基本介绍 RPC (Remote Procedure Call) 远程过程调用,是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外的为这个交互编程。也就是说可以达到两个或者多个应用程序部署在不同的服务器上&…

HOOPS Visualize:工业级3D可视化SDK,打造移动端和PC端工程应用程序

HOOPS Visualize是一种高性能的软件开发工具包(SDK),旨在帮助开发人员轻松构建和集成高质量的3D可视化功能。这是一种全功能的,以工程为重点的场景图技术,我们称为Core Graphics。Core Graphics可集成到一个框架中&…

webpack从零到1 构建 vue3

为什么要手写webpack 不用cli (无的放矢)并不是 其实是为了加深我们对webpack 的了解方便以后灵活运用webpack 的技术 初始化项目结构(跟cli 结构保持一致) 新建 public src 等文件夹npm init -y 创建package.json文件tsc --init…

opencv基础篇 ——(十一)常用照片处理函数

改善图像的亮度(illuminationChange) 用于改善光照条件不佳导致的图像对比度低下或局部过暗/过亮的问题。该函数通过模拟全局和局部光照变化,旨在提高图像的整体视觉质量,特别是在低光照条件下,使得图像中的重要细节更加清晰可见。 函数原型…

IDEA Maven项目,控制台出现乱码的问题

前言 使用idea进行maven项目的编译时,控制台输出中文的时候出现乱码的情况。 通常出现这样的问题,都是因为编码格式不一样导致的。既然是maven出的问题,我们在idea中查找下看可以如何设置文件编码。 第一种方式 在pom.xml文件中&#xff…

nginx--系统参数优化telenct

系统参数 在生产环境中,根据自己的需求在/etc/sysctl.conf来更改内核参数 net.ipv4.ip_nonlocal_bind 1 允许非本地IP地址socket监听 net.ipv4.ip_forward 1 开启IPv4转发 net.ipv4.tcp_timestamps 0 是否开启数据包时间戳 net.ipv4.tcp_tw_reuse 0 端⼝口复⽤…

代码随想录-算法训练营day34【贪心算法04:柠檬水找零、根据身高重建队列、用最少数量的箭引爆气球】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第八章 贪心算法 part04● 860.柠檬水找零 ● 406.根据身高重建队列 ● 452. 用最少数量的箭引爆气球 详细布置 860.柠檬水找零 本题看上好像挺难,其实挺简单的,大家先尝试自己做一做。 https…

企业外贸邮箱有哪些?国内五大外贸邮箱排行榜

外贸公司在进行跨国业务的时候,需要一个稳定安全的企业邮箱。国内的企业外贸邮箱提供商有很多,目前排行在前五的有Zoho Mail企业邮箱、阿里企业邮箱、网易企业邮箱、腾讯企业邮箱、新浪企业邮箱,今天我们就来详细了解下这些邮箱产品。 一、Z…

【yolov8 项目打包】pyinstaller 打包pyQt5 界面为exe

创建一篇博客文章,介绍如何使用PyInstaller将PyQt5界面打包为exe文件,并且处理与YOLOv8模型相关的文件,可以按照以下结构进行: 标题:使用PyInstaller将PyQt5界面与YOLOv8模型打包为Windows可执行文件 引言 在机器学习…

MySQL以其他表作为条件更新指定表

在MySQL数据库管理中,经常需要根据另一个表的数据来更新指定表中的记录。这种操作涉及到多表联合查询和更新语句的结合,是数据库操作中较为复杂且实用的技能之一。本文将深入介绍如何利用MySQL的​​UPDATE​​​语句结合​​INNER JOIN​​​、​​LEFT JOIN​​等联接类型,…

Unity Material(材质)、Texture(纹理)、Shader(着色器)简介

文章目录 一、概念二、Rendering Mode三、Main Maps三、参考文章 一、概念 Material(材质):物体的“色彩”、“纹理”、“光滑度”、“透明度”、“反射率”、“折射率”、“发光度”等,材质的本质是shader的实例(载体)Texture(贴图):附件到…

Python通过定义类实现增删改查(期末考试)

python高级编程期末测试 别看我挣的少,但是我省的多,昨天法拉利又省下两百多万。 一、通过创建自己类来实现增删改查 我们已经利用模型实现单表的增删改查了 现在 我们不想使用模型来操作数据库 我们可以自己定义模型 那么 如何通过自己创建的类实现增…

一对多的数据查找与更新

需求 SQLserver数据库生产的mes的代码和erp系统的代码是一对多的关系,需要根据创建时间、更新时间、erp代码排序,每个mes取第一条但是使用子查询的话,子查询中是不允许使用排序的 解决思路 可以使用SQL的窗口函数(如ROW_NUMBER()&…

计算机SCI期刊,IF=9.657,1区TOP,2周内出版!

一、期刊名称 Neural Networks 二、期刊简介概况 期刊类型:SCI 学科领域:计算机科学 影响因子:7.8 中科院分区:1区TOP 出版方式:订阅模式/开放出版 版面费:选择开放出版需支付$3350 三、期刊简介 神…

美国原装二手keysight86122c安捷伦86122C波长计

是德KEYSIGHT 86122C 波长计 主要功能和规格 特征: 增强型,稳定的HeNe参考激光器,使用寿命更长 包括五年保修,涵盖整个仪器,所有零件 绝对波长精度:0.2 ppm 差分波长精度:0.15 ppm 不到0.…

Springboot+vue项目影城管理系统

摘 要 本论文主要论述了如何使用JAVA语言开发一个影城管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述影城管理系统的当前背景以及系统开发的目的&…

lucene中Collector类、CollectorManager类区分和用法

我的lucene版本是9.10.0,请说明Collector类、CollectorManager类区分和用法,尽量详细点 在 Lucene 9.10.0 中,Collector 类和 CollectorManager 类都是用于搜索结果的收集和处理 Collector 类 Collector 类是一个接口,用于收集…