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,一经查实,立即删除!

相关文章

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

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

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 端⼝口复⽤…

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

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

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

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

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

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

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

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

计算机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架构,面向对象编程思想进行项目开发。在引言中,作者将论述影城管理系统的当前背景以及系统开发的目的&…

正点原子Linux学习笔记(六)在 LCD 上显示 jpeg 图像

在 LCD 上显示 jpeg 图像 20.1 JPEG 简介20.2 libjpeg 简介20.3 libjpeg 移植下载源码包编译源码安装目录下的文件夹介绍移植到开发板 20.4 libjpeg 使用说明错误处理创建解码对象设置数据源读取 jpeg 文件的头信息设置解码处理参数开始解码读取数据结束解码释放/销毁解码对象 …

【动态规划】子数组、子串系列I|最大子数组和|环形子数组的最大和|乘积最大子数组|乘积为正数的最长子数组长度

一、最大子数组和 最大子数组和 算法原理: 💡细节: 1.返回值为dp表每个位置的最大值,而不是只看最后一个位置,因为可能最后一个位置都不选 2.可以直接在填dp表的时候就进行返回值的比较 3.如果初始化选择多开一个位…

2024最新版JavaScript逆向爬虫教程-------基础篇之无限debugger的原理与绕过

目录 一、无限debugger的原理与绕过1.1 案例介绍1.2 实现原理1.3 绕过debugger方法1.3.1 禁用所有断点1.3.2 禁用局部断点1.3.3 替换文件1.3.4 函数置空与hook 二、补充2.1 改写JavaScript文件2.2 浏览器开发者工具中出现的VM开头的JS文件是什么? 一、无限debugger的…

520送男士内裤给男朋友好吗?五大男士内裤测评种草

相信有很多朋友都选在520这个特殊的日子里为心爱的人挑选一份特别的礼物吧!如果送礼给男朋友或老公,一份实用的礼物肯定是最佳选择哦!很多男性朋友每条内裤都穿很久,如果给男朋友挑选合适的男士内裤,也是一种关心体贴的…

[华为OD]BFS C卷 200 智能驾驶

题目: 有一辆汽车需要从m*n的地图的左上角(起点)开往地图的右下角(终点),去往每一个地区都需 要消耗一定的油量,加油站可进行加油 请你计算汽车确保从起点到达终点时所需的最少初始油量说明: (1)智能汽车可以上下左右四个方向…

C++ 复习2 输入输出 基本数据类型

输入输出 标准输出流 ( cout ) cout 代表标准输出流&#xff0c;通常用于向屏幕输出数据。 使用操作符 << &#xff08;插入操作符&#xff09;向 cout 发送数据。 例如&#xff0c; std::cout << "Hello, world!" << std::endl; 会在屏幕上打印 …