使用Python做一个微信机器人

部署运行你感兴趣的模型镜像

介绍

实现代码和pip安装: https://blog.youkuaiyun.com/Qwertyuiop2016/article/details/135076957

简介

该程序将微信的内部功能提取出来,然后在程序里加载Python,接着将这些功能导出成库函数,就可以在Python里使用这些函数

程序启动的时候会执行py_code目录下的main.py,类似于你在命令行使用python main.py

现在会以插件的形式加载py脚本,将脚本放到plugins目录下,忽略掉以_开头的脚本,然后加载所有其他的py脚本

插件脚本分为两类,以msg开头的py文件会在deal_msg.py【处理消息】里加载,其他脚本在main.py里加载。如果需要收到消息做什么事的话就以msg开头命名,不然就随便命名

main.py加载的所有脚本都在同一个线程内运行,如果需要多线程,请在脚本里继承一下threading.Thread, 参考check_friend.py

程序导出了一个函数库可以在Python里使用,库名是wxfunction,具体函数看下面的功能介绍。该库为其他语言编写,只是导出接口给Python使用

已有插件
  • 检测所有好友状态(拉黑、删除等): check_friend.py
  • 监控群消息,触发关键词预警(后续增加关键词规则): msg_monitor_keyword.py
  • 每隔一段时间发一次消息: _send_msg_timing.py
  • 给指定好友自动回复消息: msg_auto_reply.py
  • 保存聊天记录到postgre数据库: msg_postgre.py
  • 自动收款
  • 自动接收好友请求
  • 自动保存聊天文件、图片等
  • 更多插件待开发
    在这里插入图片描述
内置功能
  • 保存所有文件、图片、视频、语音和表情包
  • 如果想修改保存路径,可以参考保存的代码文件
    在这里插入图片描述

在这里插入图片描述

发消息例子

举个例子,如果想每隔五分钟发一次消息,Python代码如下(修改完Python代码,需要关闭软件重新打开才能生效,微信不需要重新登录)

from threading import Timer

def sendmsg(interval):
    '''每隔interval秒给文件传输助手发一次消息, filehelper是文件传输助手的wxid'''
    wxfunction.SendTextMsg("filehelper", "测试消息!")
    timer = Timer(interval, sendmsg, args=(interval,))
    timer.start()

sendmsg(5*60)

SendTextMsg就是程序导出的发送文本消息的函数,第一个参数是wxid,这是微信内部使用的唯一id,每个微信号都有对应的wxid,可以通过获取好友列表来获取,第二个参数是发送的消息内容

接收消息例子

收到的消息处理,比如你想收到某人的回复,然后给他发一个消息,就像对接机器人一样的操作方式, 代码主要看deal_msg.py,其中的启动函数如下

def run(self):
    while self.event.is_set():
        msg = self.wxfunction.popFromMsgQueue()
        if not msg:
            time.sleep(0.5)
            continue
        msg_data = json.loads(msg)
        msg_struct = ChatMsgStruct(**msg_data)
        self._deal_msg(msg_struct)

代码很简单,从程序的消息队列里弹出一条json格式的消息,然后转成类,在_deal_msg方法里处理它。转成类的好处是我在类里定义了消息的相应字段, 在写代码时可以使用msg_struct.content来获取,编辑器会自动补全

你只需要在_deal_msg方法里判断发送人的wxid是不是你要回复的那个人,然后调用wxfunction.SendTextMsg给他发消息即可

所有功能

接收消息
  • 好友消息
  • 群消息
  • 通知类消息(成员进群通知等)
  • 公众号推送(可以用来监控公众号的发文)
  • 公众号消息(公众号发送的消息)
  • 好友请求
  • 撤回提示消息
  • 群公告
  • 转账消息
  • 收款消息(可以写一个自动发卡的)
  • 关注的公众号直播提醒
  • 大文件上传完成提示(别人发文件时)
  • 更多消息自己发现
  • 有遗漏的消息类型也可以提出来
发消息
  • 发送文本
  • 发送图片
  • 发送文件
  • 发送表情
  • 发送名片
  • 发送xml消息
  • 发送拍一拍
  • 发送小程序
  • 转发消息
防撤回
  • 已内置(打开软件,默认开启,无法关闭)
群相关
  • 获取群成员
  • 获取群成员昵称
  • 删除群成员
  • 设置群公告
  • 修改群名称
  • 修改自己的群昵称
  • 邀请好友进群
加好友
  • 同意好友请求(案例Python代码可配置自动同意)
  • 检测好友状态(该功能用法参考插件check_friend.py)
  • 搜索好友(可通过手机号或微信号搜索)
  • 添加好友
转账收款
  • 接收转账和退还转账(案例Python代码可配置自动接收)
其他
  • 修改好友备注
  • 获取好友详细信息
  • 获取好友列表
  • 获取wxid的相关信息
CDN下载
  • 下载图片
  • 下载视频
  • 下载文件
  • 下载语音
  • 下载表情包
待更新
  • 发送引用消息
  • 发送@消息
  • 语音转文字
  • 获取朋友圈
  • 消息标记已读

操作步骤

准备工作
  1. 安装给定版本(3.9.6.32)的微信到任意目录
  2. 安装给定的python-3.8.10.exe到任意目录, 不懂的话,安装选项可以一直默认
  3. 编辑配置文件,主要修改微信安装目录和Python安装目录
  4. 打开wxrobot.exe软件,点击软件界面的-》帮助-》启动微信,登录即可(如果出现监听不到消息的情况,需要以管理员权限运行微信,在运行软件)

提示1: Python版本并不需要是给定的3.8.10,更新的版本应该都能用,但必须是32位的Python
提示2: 不一定要使用软件启动微信,也可以自己点击快捷方式启动,但是软件和微信都需要以管理员方式运行,如果不是的话,软件是控制不了其他用户的程序的

所有功能介绍

getSelfWxid

函数原型: def getSelfWxid() -> str: ...
功能: 获取自己登录的微信的wxid

getWeChatFilePath

函数原型: def getWeChatFilePath() -> str: ...
功能: 获取微信文件的保存路径(微信设置文件管理里的微信文件的默认保存路径)

GetUsers

函数原型: def GetUsers() -> List[dict]: ...
功能: 获取当前已登录的wxid、微信号和昵称

GetContactList

函数原型: def GetContactList() -> List[list]: ...
功能: 获取好友和群列表

popFromMsgQueue

函数原型: def popFromMsgQueue() -> Union[str, None]: ...
功能: 从已接收到的消息队列里弹出一条消息,消息类型为json字符串

SendTextMsg

函数原型: def SendTextMsg(wxid:str, text:str) -> int: ...
功能: 发送文本消息
参数:

  1. wxid: 对方的wxid
  2. text: 发送的文本内容
SendXmlMsg

函数原型: def SendXmlMsg(wxid:str, xml:str, dtype:int) -> int: ...
功能: 发送xml消息,接受消息类型为49,应该都可以把xml拿下来重新发出去。只测试了发送公众号文章
参数:

  1. wxid: 对方的wxid
  2. xml: 发送的xml内容
  3. dtype: xml里面的类型,可以从xml里解析出来
SendEmotionMsg

函数原型: def SendEmotionMsg(wxid:str, path:str) -> int: ...
功能: 发送表情包
参数:

  1. wxid: 对方的wxid
  2. path: 表情包的绝对路径,可以是未加密的表情包、也可以是 FileStorage\CustomEmotion下的加密表情
SendCardMsg

函数原型: def SendCardMsg(wxid:str, xml:str) -> int: ...
功能: 发送某个好友的名片, 也可以使用下面那个函数,可以直接通过好友wxid发送
参数:

  1. wxid: 对方的wxid
  2. xml: 名片的xml数据,可以先发送一个出去,然后在接受消息里打印出来就能看到
SendCardMsgByWxid

函数原型: def SendCardMsg(wxid:str, cardWxid:str) -> int: ...
功能: 发送某个好友的名片
参数:

  1. wxid: 对方的wxid
  2. cardWxid: 需要发送的好友wxid
SendPatMsg

函数原型: def SendPatMsg(roomid:str, wxid:str) -> int: ...
功能: 发送拍一拍消息
参数:

  1. roomid: 群id
  2. wxid: 拍的人的wxid
SendImageMsg

函数原型: def SendImageMsg(wxid:str, path:str) -> int: ...
功能: 发送图片
参数:

  1. wxid: …
  2. path: 发送的图片绝对路径
SendFileMsg

函数原型: def SendFileMsg(wxid:str, path:str) -> int: ...
功能: 发送文件
参数:

  1. wxid: …
  2. path: 发送的文件绝对路径
SendAppMsg

函数原型: def SendAppMsg(wxid:str, gappid:str) -> int: ...
功能: 发送小程序消息
参数:

  1. wxid: …
  2. gappid: 类似gh_xxxxxxxx@app这样的id, 可以转发一个小程序,里面的xml就有
ForwardMessage

函数原型: def ForwardMessage(wxid:str, localid:int) -> int: ...
功能: 转发消息
参数:

  1. wxid: …
  2. localid: 消息里面的localid字段
EditRemark

函数原型: def EditRemark(wxid:str, remark:str) -> int: ...
功能: 编辑好友备注
参数:

  1. wxid: …
  2. remark: 备注内容
RecvTransfer

函数原型: def RecvTransfer(wxid:str, transferid:str, transcationid:str) -> int: ...
功能: 接收转账
参数:

  1. wxid: …
  2. transferid: 转账消息的xml里可以提取到
  3. transcationid: 转账消息的xml里可以提取到
RefundTransfer

函数原型: def RefundTransfer(wxid:str, transferid:str, transcationid:str) -> int: ...
功能: 退还转账
参数:

  1. wxid: …
  2. transferid: 转账消息的xml里可以提取到
  3. transcationid: 转账消息的xml里可以提取到
GetChatRoomMembers

函数原型: def GetChatRoomMembers(roomid:str) -> str: ...
功能: 获取某个群的所有群成员
参数:

  1. roomid: 群id
GetChatRoomMemberNickname

函数原型: def GetChatRoomMemberNickname(roomid:str, wxid:str) -> str: ...
功能: 获取群成员昵称
参数:

  1. roomid: 群id
  2. wxid: 要获取昵称的wxid
GetUserInfoJsonByCache

函数原型: def GetUserInfoJsonByCache(wxid:str) -> str: ...
功能: 获取某个用户的昵称, 可以是好友或者群成员
参数:

  1. wxid: 要获取昵称的wxid
DelChatRoomMembers

函数原型: def DelChatRoomMembers(roomid:str, wxid:str) -> int: ...
功能: 删除群成员
参数:

  1. roomid: 群id
  2. wxid: 要删除的那个人的wxid
SetChatRoomAnnouncement

函数原型: def SetChatRoomAnnouncement(roomid:str, content:str) -> int: ...
功能: 设置群公告
参数:

  1. roomid: 群id
  2. content: 公告内容,仅支持文本内容
SetChatRoomName

函数原型: def SetChatRoomName(roomid:str, name:str) -> int: ...
功能: 修改群名称
参数:

  1. roomid: 群id
  2. name: 名称
SetChatRoomMyNickname

函数原型: def SetChatRoomMyNickname(roomid:str, name:str) -> int: ...
功能: 修改自己的群昵称
参数:

  1. roomid: 群id
  2. name: 名称
AddChatRoomMembers

函数原型: def AddChatRoomMembers(roomid:str, wxid:str) -> int: ...
功能: 邀请好友进程,该接口仅支持40人以下的群
参数:

  1. roomid: 群id
  2. wxid: 好友的wxid
DownloadImageFromCdnByLocalid

函数原型: def DownloadImageFromCdnByLocalid(localid:int, file_path:str) -> int: ...
功能: 下载某个图片消息的图片到指定路径下
参数:

  1. localid: 消息的localid
  2. file_path: 路径一般是微信的目录,然后解密拷贝出来。具体见Python示例
DownloadFileFromCdnByLocalid

函数原型: def DownloadFileFromCdnByLocalid(localid:int, file_path:str) -> int: ...
功能: 下载某个文件消息到指定路径下
参数:

  1. localid: 消息的localid
  2. file_path: 路径一般是微信的目录,然后拷贝出来。具体见Python示例
DownloadVideoFromCdnByLocalid

函数原型: def DownloadVideoFromCdnByLocalid(localid:int, file_path:str) -> int: ...
功能: 下载某个视频消息到指定路径下
参数:

  1. localid: 消息的localid
  2. file_path: 路径一般是微信的目录,然后拷贝出来。具体见Python示例
AddFriendByWxidOrV3

函数原型: def AddFriendByV3V4(v3:str, v4:str, addType:int) -> int: ...
功能: 同意还有请求,v3、v4和addType都在好友请求的消息xml里,具体字段见Python示例
参数:

  1. v3: …
  2. v4: …
  3. addType: 添加的类型,比如通过wxid添加就是6,通过名片添加的就是17,
getVoiceByMsgid

函数原型: def getVoiceByMsgid(msgid:str) -> str: ...
功能: 通过msgid获取语音文件,获取的格式是slik,需要转常见的音频格式比如mp3才能播放
参数:

  1. msgid: 音频消息中的msgid
CheckFriendStatus

函数原型: def CheckFriendStatus(wxid:str) -> dict: ...
功能: 检测好友状态,拉黑、删除等,可以用来做僵尸粉检测,建议调用增加间隔时间。可能会出现添加好友的提示,属于正常现象,对方看不到
参数:

  1. wxid: …
SearchFriend

函数原型: def SearchFriend(phone:str) -> dict: ...
功能: 通过微信号或者手机号搜索用户
参数:

  1. phone: 要搜索的微信号或手机号

获取我的wxid

函数原型: def GetMyWxid() -> dict: ...
功能: 获取开发者的wxid
返回值:kanadeblisst

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户了解如何使用Python开发一个微信机器人,并实现自定义消息推送功能。首先,我得回顾一下用户提供的引用内容,看看有哪些相关的信息可以利用。 用户给出的引用[1]到[5]主要涉及微信机器人的开发,特别是使用Python实现的例子。比如引用[1]提到了安装特定版本的微信客户端,引用[2]和[3]展示了发送消息和处理消息的代码片段,引用[4]和[5]则讨论了通过企业微信机器人API进行消息推送的方法。这些信息都是关键点,需要整合到回答中。 首先,用户的问题分为两部分:开发微信机器人和实现自定义消息推送。根据引用内容,有两种主要方法:使用微信客户端API(如itchat或wxauto)或者企业微信机器人API。这两种方法的步骤和代码示例在引用中有提及,需要详细说明。 接下来,我需要确定步骤的逻辑顺序。对于个人微信机器人,可能需要安装第三方库,登录微信,处理消息,并发送回复。而企业微信机器人则更简单,只需要创建机器人并调用Webhook。引用中的代码示例可以作为参考,但要确保代码的正确性和安全性,比如隐藏API密钥。 需要注意的是,微信官方对个人账号的自动化操作可能有限制,所以需要提醒用户遵守规定,避免账号风险。同时,企业微信的方法更稳定,适合正式使用,这一点也需要强调。 然后,根据用户提供的示例,回答需要结构清晰,分步骤讲解,并包含代码示例。同时,按照系统指令,行内数学表达式要用$...$,但这个问题可能不涉及数学公式,所以可能不需要处理。但需要检查是否有其他格式要求,如代码块的使用和引用标注。 最后,生成相关问题,帮助用户进一步了解相关主题。比如如何防止微信封号、处理复杂消息类型、实现定时任务等,这些都是用户可能感兴趣的扩展问题。 总结一下,回答的结构应该是: 1. 两种实现方式的概述 2. 方法一的详细步骤(个人微信使用itchat/wxauto) 3. 方法二的详细步骤(企业微信机器人) 4. 对比和注意事项 5. 相关问题 需要确保每个步骤都有代码示例,并正确引用提供的资料。同时,检查代码是否存在错误,比如引用中的代码是否有拼写错误或需要调整的地方,比如企业微信的API密钥需要替换为用户自己的。 另外,用户可能对消息处理的具体逻辑感兴趣,比如如何根据接收的消息内容进行自定义回复,这部分在引用[3]中有涉及,可以展开说明。同时,定时推送功能在引用[4]和[5]中通过循环和sleep实现,可以建议使用更稳定的任务调度库如APScheduler。 最后,确保回答符合中文要求,语言通顺,结构清晰,并正确添加引用标识。</think>以下是使用Python开发微信机器人并实现自定义消息推送的完整教程: ### 一、实现方案对比 1. 个人微信方案:基于`itchat`或`wxauto`库模拟客户端操作[^1][^3] 2. 企业微信方案:通过Webhook API直接调用机器人服务[^4][^5] ### 二、个人微信机器人实现(客户端模拟) #### 步骤1:环境准备 ```python # 安装必要库 pip install itchat # 或使用wxauto库 ``` #### 步骤2:基础登录与消息监听 ```python import itchat @itchat.msg_register(itchat.content.TEXT) def text_reply(msg): if msg['FromUserName'] != msg['ToUserName']: return f"已收到:{msg['Text']}" if __name__ == '__main__': itchat.auto_login(hotReload=True) # 扫码登录 itchat.run() ``` #### 步骤3:自定义消息推送 ```python # 向文件助手发送消息 itchat.send("自定义推送内容", toUserName="filehelper") # 向指定好友推送 friend = itchat.search_friends(name='张三')[0] friend.send("今日天气预报:晴转多云") ``` ### 三、企业微信机器人实现(推荐方案) #### 步骤1:创建企业微信机器人 1. 企业微信客户端右键群聊 > 添加机器人 > 获取Webhook地址 #### 步骤2:消息推送实现 ```python import requests import json def send_wechatbot(content): webhook_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的密钥" headers = {'Content-Type': 'application/json'} data = { "msgtype": "text", "text": { "content": content, "mentioned_list": ["@all"] # @指定人员 } } response = requests.post(webhook_url, headers=headers, data=json.dumps(data)) return response.json() # 示例调用 print(send_wechatbot("系统提醒:数据库备份已完成")) ``` ### 四、高级功能实现 1. **定时推送**(结合APScheduler): ```python from apscheduler.schedulers.blocking import BlockingScheduler sched = BlockingScheduler() @sched.scheduled_job('cron', hour=9) def morning_reminder(): send_wechatbot("每日提醒:请提交工作日报") sched.start() ``` 2. **消息处理架构**(引用自[^3]): ```python class MessageHandler: def __init__(self): self.msg_queue = [] def push_to_queue(self, msg): self.msg_queue.append(msg) def process_message(self): while True: if self.msg_queue: msg = self.msg_queue.pop(0) # 添加自定义处理逻辑 if "状态" in msg: send_wechatbot("系统运行正常") ``` ### 五、注意事项 1. 个人微信方案存在账号风险,建议使用企业微信方案[^1] 2. 企业微信消息频率限制:20条/分钟 3. 敏感词过滤机制需自行实现 4. 建议使用HTTPS加密传输敏感信息
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值