WeChatFerry学习使用

news2025/1/11 17:06:19

准备

在这里插入图片描述
下载软件安装微信
在这里插入图片描述
在这里插入图片描述

安装python环境

conda create --prefix=D:\PythonEnvs\wechatrobotstu python=3.10
conda activate D:\PythonEnvs\wechatrobotstu

使用

新建python项目
在这里插入图片描述
安装依赖包

pip install --upgrade wcferry -i https://pypi.doubanio.com/simple

在这里插入图片描述
解压dll到一个目录下面,

创建监听

import ctypes
if __name__ == "__main__":
    # 加载 sdk.dll (需要绝对路径)
    sdk = ctypes.cdll.LoadLibrary("G:/Python/wechatfrerrystu/wechatfrerrystu/dll/sdk.dll")
    # 初始化
    sdk.WxInitSDK(False, 10086)
    print("初始化完毕...")
    # 退出 SDK
    print("退出SDK")
    sdk.WxDestroySDK()
    # 注意关闭 Python 进程

创建客户端

from wcferry import Wcf, WxMsg
wcf = Wcf()

判断是否登录

# 检测当前PC端微信登录状态
is_login = wcf.is_login()

获取登录的微信信息

# 获取当前PC端微信账号信息
print(wcf.get_user_info())
# {'wxid': 'wxid_xxxxx', 'name': '昵称', 'mobile': '手机号', 'home': ''}

获取全部的联系人

# 获取全部的联系人包括公众号和好友、群聊等
contacts = wcf.get_contacts()
# 遍历所有联系人,
# gh_开头公众号 wxid_是微信好友或者好友自定义的
# @chatroom结尾是群聊 @openim是企业微信好友
for contact in contacts:
     print(contact)

查询群成员

# 查找群成员
group_members = wcf.get_chatroom_members('xxxxx@chatroom')
print(group_members)
# 直接通过SQL查询查找群成员,name为空,重试了几次可以了
crs = wcf.query_sql("MicroMsg.db", f"SELECT RoomData FROM ChatRoom WHERE ChatRoomName = 'xxxx@chatroom';")
print(crs)
# 根据微信id获取微信号昵称,查询出来name为空,重试了几次可以了
user_info = wcf.get_info_by_wxid('wxid_xxxxx')
print(user_info)

发送消息

# receiver的值是filehelper则是文件传输助手
# 发送群聊并@某人
wcf.send_text("@昵称1@博昵称2\n\n机器人发送消息","xxxxx@chatroom","wxid_xxxx,wxid_xxxxx")
# 发送消息
wcf.send_text('机器人发送消息',"xxxxx@chatroom")
# print("发送消息成功")

监听消息

def processMsg(msg: WxMsg, wcf: Wcf):
    # print(msg)
    print(msg.type)
    print(msg.id)
    print(msg.xml)
    print(msg.sender)
    print(msg.roomid)
    print(msg.content)
    print(msg.thumb)
    print(msg.extra)
    if msg.is_at(wcf.get_self_wxid()):
        print("我被@啦")
        # 后续可以接入大模型
        if msg.roomid:
            group_members = wcf.get_chatroom_members(msg.roomid)
            nickName = group_members[msg.sender]
            wcf.send_text(f"@{nickName}机器人收到啦",msg.roomid, msg.sender)
        else :
            wcf.send_text("机器人收到啦", msg.sender)

    # 加入群聊 msg.type=10000
    # if msg.from_group():
    #     print(msg.content)


def enableReceivingMsg(wcf: Wcf):
    def innerWcFerryProcessMsg():
        while wcf.is_receiving_msg():
            try:
                msg = wcf.get_msg()
                processMsg(msg, wcf)
            except Empty:
                continue
            except Exception as e:
                print(f"ERROR: {e}")

    wcf.enable_receiving_msg()
    Thread(target=innerWcFerryProcessMsg, name="ListenMessageThread", daemon=True).start()

代码如下

import ctypes
from queue import Empty
from threading import Thread
from wcferry import Wcf, WxMsg

def processMsg(msg: WxMsg, wcf: Wcf):
    # print(msg)
    print(msg.type)
    print(msg.id)
    print(msg.xml)
    print(msg.sender)
    print(msg.roomid)
    print(msg.content)
    print(msg.thumb)
    print(msg.extra)
    if msg.is_at(wcf.get_self_wxid()):
        print("我被@啦")
        # 后续可以接入大模型
        if msg.roomid:
            group_members = wcf.get_chatroom_members(msg.roomid)
            nickName = group_members[msg.sender]
            wcf.send_text(f"@{nickName}机器人收到啦",msg.roomid, msg.sender)
        else :
            wcf.send_text("机器人收到啦", msg.sender)

    # 加入群聊 msg.type=10000
    # if msg.from_group():
    #     print(msg.content)


def enableReceivingMsg(wcf: Wcf):
    def innerWcFerryProcessMsg():
        while wcf.is_receiving_msg():
            try:
                msg = wcf.get_msg()
                processMsg(msg, wcf)
            except Empty:
                continue
            except Exception as e:
                print(f"ERROR: {e}")

    wcf.enable_receiving_msg()
    Thread(target=innerWcFerryProcessMsg, name="ListenMessageThread", daemon=True).start()


def find_name_by_wxid(wxid, contact_list):
    """
    根据wxid查询name

    参数:
    wxid (str): 要查询的wxid
    contact_list (list): 包含朋友信息的列表

    返回:
    str: 如果找到,返回对应的name;如果未找到,返回None
    """
    for friend in contact_list:
        if friend['wxid'] == wxid:
            return friend['name']
    return ""


if __name__ == "__main__":
    # 加载 sdk.dll (需要绝对路径)
    sdk = ctypes.cdll.LoadLibrary("G:/Python/wechatfrerrystu/wechatfrerrystu/dll/sdk.dll")
    # 初始化
    sdk.WxInitSDK(False, 10086)
    print("初始化完毕...")
    wcf = Wcf()
    # 检测当前PC端微信登录状态
    is_login = wcf.is_login()
    if is_login is True:
        print("微信登录了")
        # 获取当前PC端微信账号信息
        # print(wcf.get_user_info())
        # {'wxid': 'wxid_xxxxx', 'name': '昵称', 'mobile': '手机号', 'home': ''}
        enableReceivingMsg(wcf)
        wcf.keep_running()
        # 获取全部的联系人包括公众号和好友、群聊等
        # contacts = wcf.get_contacts()
        # 遍历所有联系人,
        # gh_开头公众号 wxid_是微信好友或者好友自定义的
        # @chatroom结尾是群聊 @openim是企业微信好友
        # for contact in contacts:
        #     print(contact)
        # 查找群成员
        # group_members = wcf.get_chatroom_members('xxxxx@chatroom')
        # print(group_members)
        # 直接通过SQL查询查找群成员,name为空,重试了几次可以了
        # crs = wcf.query_sql("MicroMsg.db", f"SELECT RoomData FROM ChatRoom WHERE ChatRoomName = 'xxxx@chatroom';")
        # print(crs)
        # 根据微信id获取微信号昵称,查询出来name为空,重试了几次可以了
        # user_info = wcf.get_info_by_wxid('wxid_xxxxx')
        # print(user_info)
        # 可以根据这个实现wxid查询用户信息,不过需要加好友
        # print(find_name_by_wxid("wxid_xxxxx",contacts))
        # sdk.WxDestroySDK()
        # nickname = wcf.query_sql("MicroMsg.db", f"SELECT NickName FROM Contact WHERE UserName = '{wxid}';")
        # receiver的值是filehelper则是文件传输助手
        # wcf.send_text("@昵称1@博昵称2\n\n机器人发送消息","xxxxx@chatroom","wxid_xxxx,wxid_xxxxx")
        # wcf.send_text('机器人发送消息',"xxxxx@chatroom")
        # print("发送消息成功")

    else:
        # 退出 SDK
        print("退出SDK")
        sdk.WxDestroySDK()
        # 注意关闭 Python 进程

参考

https://github.com/lich0821/WeChatFerry
https://blog.csdn.net/qq_47452807/article/details/138536720
https://gitcode.com/gh_mirrors/we/WeChatFerry/overview
https://space.bilibili.com/479305033/video
https://blog.huangque888.com/archives/258.html
https://blog.csdn.net/gitblog_00872/article/details/141015773
公众号文章
获取群聊人员
https://pi3yyy.love/archives/d604709c.html

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

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

相关文章

安卓开发板_联发科MTK开发板使用ADB开发

1. ADB 使用 1.1. 前言 ADB,全称 Android Debug Bridge,是 Android 的命令行调试工具,可以完成多种功能,如跟踪系统日志,上传下载文件,安装应用等。 1.2. 准备连接 使用 adb时,你需要&#x…

转到大模型方向来得及吗?

最近不少同学问想搞大模型来得及吗?咨询的同学分成两类,一类是在公司的同学,一类是在校的同学。 第一,对于在校的同学。 一句话,能转到这个方向尽快转。今年校招包括招聘实习生,很多方向比如搜索推荐广告…

敏捷与企业架构:战略联盟

介绍 企业架构的三大支柱是对齐、洞察力和质量。 对齐:企业架构(Enterprise Architecture)使战略与运营、业务需求与IT供应保持一致,并确保这些变化符合企业战略和目标。 洞察力:企业架构提供对组织、信息系统和技术…

基于JavaWeb开发的Java+jquery+SpringMVC校园网站平台设计和实现

基于JavaWeb开发的JavajquerySpringMVC校园网站平台设计和实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种…

shutil模块详解

shutil模块提供了一系列高级文件操作功能,包括复制、移动、删除和搜索文件或目录。shutil 模块对压缩包的处理是调用 ZipFile 和 TarFile这两个模块来进行的。 下面详细介绍并给出示例代码: 1. shutil.copy(src, dst) 复制文件,但不保留权限…

【程序员必读】如何用AI修复代码Bug,让你节省宝贵的调试时间!

在编程的旅程中,bug就像是我们前行路上的小石子,时不时地绊倒我们。无论你是刚入门的编程新手,还是经验丰富的开发者,调试代码时总会遇到各种各样的挑战。😩 有时候,错误的信息可能模糊不清,令…

SAP PP模块后台配置全流程配置2

1.1.定义工艺路线 定义物料类型分配T-Code:OP50 为物料类型指定工艺路线类型 为物料类型HALF2、FERT2分配类型“路径N” 定义工艺路线CA01 1.1.2.1.定义HAL2类型:物料2000000000工艺路线 输入“物料编码”、“工厂”等信息 工艺路线:抬头信…

国家标准和行业标准有什么区别?如何办理国家标准?

在当今复杂多样的标准体系中,国家标准和行业标准犹如两颗璀璨的明珠,各自闪耀着独特的光芒,它们共同为经济社会的发展提供了坚实的技术支撑。然而,你是否真正了解这两者之间的区别呢? 一、制定主体 • 国家标准&#x…

0基础?没问题!吴恩达教授的《开发者的LLM入门完全指南》来了!

项目:面向开发者的 LLM 入门课程 这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 ## 项目简介 本项目是一个面向开发者的 LLM 入门教程,基于吴恩达老师大模型系列课…

问题:vite首次加载慢

概述: 不是说vite项目的启动很快很快吗? vite项目的启动确实是快(注意这里的启动是指命令行启动完毕,不是指启动完之后首页加载完毕) 如果某个界面是首次进入,且依赖比较多/比较复杂的话,那…

温习mysql函数 连接查询

字符串 1、CONCAT(S1,S2,...Sn) :字符串拼接,将S1 , S2 , ... Sn 拼接成一个字符串】 2、LOWER(str) :将字符串str全部转为小写 3、UPPER(str) :将字符串str全部转为大写 4、LPAD(str,n,pad): …

基于SpringBoot+Vue+MySQL的教学资源共享平台

系统展示 用户前台界面 管理员后台界面 系统背景 随着信息技术的迅猛发展,教育领域对高效、便捷的教学资源需求日益增长。传统教学模式已难以满足当前教育的多样化需求,特别是在资源共享与利用方面存在明显不足。因此,构建一个基于SpringBoot…

关于大模型在产品开发中所面临的问题,利用大模型技术解决很简单!

“ 具体问题具体分析,大模型技术没有统一的解决方案 ” 有人说2024年是大模型应用的元年,而大模型在未来的发展潜力毋庸置疑,这也就意味着人工智能技术是下一个风口,因此各种各样基于大模型技术的创业公司如雨后春笋般涌现。 从…

Linux云计算 |【第二阶段】SHELL-DAY5

主要内容: awk命令、内置变量(FS、$0、$1、$2、NF、NR)、过滤时机(BEGIN{}、{}、END{})、处理条件(正则、&&、||、~\!~、等)、awk数组、监控脚本、安全检测脚本 一、awk介绍 awk 是一…

【主机入侵检测】Wazuh解码器详解

前言 Wazuh 是一个开源的安全平台,它使用解码器(decoders)来从接收到的日志消息中提取信息。解码器将日志信息分割成字段,以便进行分析。Wazuh解码器使用XML语法,允许用户指定日志数据应该如何被解析和规范化。解码器的…

TP发邮件的功能如何实现?tp框架发送邮件?

tp发邮件系统如何设置发信?tp配置邮箱发送邮件方法? TP发邮件的功能,作为企业级应用中的一个关键模块,其稳定性和高效性直接影响到企业的日常运营。AokSend将深入探讨TP发邮件的功能如何实现,从基础配置到高级应用&am…

监控易监测对象及指标之:全面监控Oracle数据库

随着企业业务的不断增长和复杂化,Oracle数据库作为关键的业务数据管理系统,其性能和稳定性对于保障业务连续性至关重要。为了确保Oracle数据库的高效运行和稳定性能,对其进行全面监控成为了一项必要的工作。本文将基于监控易工具,…

搭建大模型知识库流程,以及基于langchain实现大模型知识库案例

“ RAG检索增强生成是为了解决大模型知识不足的问题 ” 大模型主要面临三个问题: 垂直领域内的知识不足 大模型知识有时间限制 大模型幻觉问题 第一个问题产生的原因是因为,没有经过垂直领域数据训练的大模型普遍表现不好;其次是目前的大…

新160个crackme - 054-vcrkme01

运行分析 需破解Name和Code PE分析 C程序,32位,无壳 静态分析&动态调试 ida找到关键字符串,双击进入函数 主函数静态分析,注释如上,还需要了解sub_401000函数 对sub_401000函数进行分析,注释如上&#…

半导体设备系列(2) 半导体设备与工厂控制仿真器Demo编写

可以用CS架构编写这两个仿真器,将设备写成服务器,接收来自工厂控制程序的命令。后续加上半导体设备通信协议。 半导体设备服务器 1)工程文件 QT core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You ca…