2024-05-04 22:19:15 +08:00
|
|
|
|
# WxHook
|
|
|
|
|
|
|
|
|
|
## 简介
|
|
|
|
|
|
|
|
|
|
WxHook是一个基于dll注入实现的python微信机器人框架,支持多种接口、高扩展性、多线程事件高并发,让你轻松应对海量消息,为你的需求实现提供便捷灵活的支持。
|
|
|
|
|
|
|
|
|
|
支持的接口
|
|
|
|
|
1. hook同步消息
|
|
|
|
|
2. 取消hook同步消息
|
|
|
|
|
3. hook日志
|
|
|
|
|
4. 取消hook日志
|
|
|
|
|
5. 检查登录状态
|
|
|
|
|
6. 获取用户信息
|
|
|
|
|
7. 发送文本消息
|
|
|
|
|
8. 发送图片消息
|
|
|
|
|
9. 发送文件消息
|
|
|
|
|
10. 发送表情消息
|
|
|
|
|
11. 发送小程序消息
|
|
|
|
|
12. 发送群@消息
|
|
|
|
|
13. 发送拍一拍消息
|
|
|
|
|
14. 获取联系人列表
|
|
|
|
|
15. 获取联系人详情
|
|
|
|
|
16. 创建群聊
|
|
|
|
|
17. 退出群聊
|
|
|
|
|
18. 获取群详情
|
|
|
|
|
19. 获取群成员列表
|
|
|
|
|
20. 添加群成员
|
|
|
|
|
21. 删除群成员
|
|
|
|
|
22. 邀请群成员
|
|
|
|
|
23. 修改群成员昵称
|
|
|
|
|
24. 设置群置顶消息
|
|
|
|
|
25. 移除群置顶消息
|
|
|
|
|
26. 转发消息
|
|
|
|
|
27. 获取朋友圈首页
|
|
|
|
|
28. 获取朋友圈下一页
|
|
|
|
|
29. 收藏消息
|
|
|
|
|
30. 收藏图片
|
|
|
|
|
31. 下载附件
|
|
|
|
|
32. 转发公众号消息
|
|
|
|
|
33. 转发公众号消息通过消息ID
|
|
|
|
|
34. 解码图片
|
|
|
|
|
35. 获取语音通过消息ID
|
|
|
|
|
36. 图片文本识别
|
|
|
|
|
37. 获取数据库句柄
|
|
|
|
|
38. 执行SQL命令
|
|
|
|
|
39. 测试
|
|
|
|
|
|
|
|
|
|
## 微信版本下载
|
|
|
|
|
- [WeChatSetup3.9.5.81.exe](https://github.com/tom-snow/wechat-windows-versions/releases/download/v3.9.5.81/WeChatSetup-3.9.5.81.exe)
|
|
|
|
|
|
|
|
|
|
## 安装
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
pip install wxhook
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 使用示例
|
|
|
|
|
|
|
|
|
|
消息事件处理例子
|
|
|
|
|
```python
|
|
|
|
|
# import os
|
|
|
|
|
# os.environ["WXHOOK_LOG_LEVEL"] = "INFO" # 修改日志输出级别
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
|
|
from wxhook import Bot
|
|
|
|
|
from wxhook import events
|
|
|
|
|
from wxhook.model import Event
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_login(bot: Bot):
|
|
|
|
|
bot.send_text("filehelper", "登录成功之后会触发这个函数")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_start(bot: Bot):
|
|
|
|
|
print("微信客户端打开之后会触发这个函数")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def on_stop(bot: Bot):
|
|
|
|
|
bot.send_text("filehelper", "关闭微信客户端之前会触发这个函数")
|
|
|
|
|
time.sleep(1) # 防止客户端关闭太快导致消息发送失败
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bot = Bot(
|
|
|
|
|
on_login=on_login,
|
|
|
|
|
on_start=on_start,
|
|
|
|
|
on_stop=on_stop
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 消息回调地址
|
|
|
|
|
# bot.set_webhook_url("http://127.0.0.1:8000")
|
|
|
|
|
|
|
|
|
|
@bot.handle(events.TEXT_MESSAGE, once=True)
|
|
|
|
|
def on_message(bot: Bot, event: Event):
|
|
|
|
|
bot.send_text("filehelper", "这条消息只会发送一次哦")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@bot.handle(events.TEXT_MESSAGE)
|
|
|
|
|
def on_message(bot: Bot, event: Event):
|
|
|
|
|
if event.fromUser != bot.info.wxid:
|
|
|
|
|
bot.send_text(event.fromUser, event.content)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@bot.handle([events.IMAGE_MESSAGE, events.EMOJI_MESSAGE, events.VIDEO_MESSAGE])
|
|
|
|
|
def on_message(bot: Bot, event: Event):
|
|
|
|
|
if event.fromUser != bot.info.wxid:
|
|
|
|
|
if event.type == events.IMAGE_MESSAGE:
|
|
|
|
|
bot.send_text(event.fromUser, "图片消息")
|
|
|
|
|
elif event.type == events.EMOJI_MESSAGE:
|
|
|
|
|
bot.send_text(event.fromUser, "表情消息")
|
|
|
|
|
elif event.type == events.VIDEO_MESSAGE:
|
|
|
|
|
bot.send_text(event.fromUser, "视频消息")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bot.run()
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
接口使用例子
|
|
|
|
|
```python
|
|
|
|
|
import os
|
|
|
|
|
import json
|
|
|
|
|
|
|
|
|
|
from wxhook import Bot
|
|
|
|
|
from wxhook import events
|
|
|
|
|
from wxhook.model import Event
|
|
|
|
|
|
|
|
|
|
# faked_version="3.9.10.19"解除微信低版本登录限制
|
|
|
|
|
bot = Bot()
|
|
|
|
|
|
|
|
|
|
msgid_list = []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@bot.handle(events.TEXT_MESSAGE)
|
|
|
|
|
def on_text_message(bot: Bot, event: Event):
|
|
|
|
|
self_id = bot.info.wxid
|
|
|
|
|
content = event.content
|
|
|
|
|
sender = event.fromUser
|
|
|
|
|
msg_id = event.msgId
|
|
|
|
|
if sender != self_id:
|
|
|
|
|
if content.find("发送文本") != -1:
|
|
|
|
|
bot.send_text(sender, "这是一条文本消息")
|
|
|
|
|
elif content.find("发送图片") != -1:
|
|
|
|
|
bot.send_image(sender, os.path.abspath("test.png"))
|
|
|
|
|
elif content.find("发送表情") != -1:
|
|
|
|
|
bot.send_emotion(sender, os.path.abspath("test.png"))
|
|
|
|
|
elif content.find("发送文件") != -1:
|
|
|
|
|
print(print(bot.send_file(sender, os.path.abspath("test.xlsx"))))
|
|
|
|
|
elif content.find("发送音频") != -1:
|
|
|
|
|
bot.send_file(sender, os.path.abspath("test.mp3"))
|
|
|
|
|
elif content.find("发送视频") != -1:
|
|
|
|
|
print(bot.send_file(sender, os.path.abspath("test.mp4")))
|
|
|
|
|
elif content.find("创建群聊") != -1:
|
|
|
|
|
bot.create_room(["wxid1", "wxid2"])
|
|
|
|
|
elif content.find("获取群成员列表") != -1:
|
|
|
|
|
print(bot.get_room_members("<chatroomid>"))
|
|
|
|
|
elif content.find("删除群成员") != -1:
|
|
|
|
|
bot.delete_room_member("<chatroomid>", ["<wxid>"])
|
|
|
|
|
elif content.find("添加群成员") != -1:
|
|
|
|
|
bot.add_room_member("<chatroomid>", ["<wxid>"])
|
|
|
|
|
elif content.find("邀请群成员") != -1:
|
|
|
|
|
bot.invite_room_member("<chatroomid>", ["<wxid>"])
|
|
|
|
|
elif content.find("修改在群聊中的昵称") != -1:
|
|
|
|
|
print(bot.modify_member_nickname(sender, "<self-wxid>", "测试机器人"))
|
|
|
|
|
elif content.find("退出群聊") != -1:
|
|
|
|
|
bot.quit_room("<chatroomid>")
|
|
|
|
|
elif content.find("at全体成员") != -1:
|
|
|
|
|
bot.send_room_at(sender, ["notify@all", "<wxid>"], "这是一条at全体成员的消息")
|
|
|
|
|
elif content.find("发送群at") != -1:
|
|
|
|
|
bot.send_room_at(sender, ["<wxid1>", "<wxid2>"], "这是一条at群成员的消息")
|
|
|
|
|
elif content.find("发送群聊拍一拍") != -1:
|
|
|
|
|
bot.send_pat(sender, "wxid_vqj81fdula0x22")
|
|
|
|
|
elif content.find("发送私聊拍一拍") != -1:
|
|
|
|
|
bot.send_pat(sender, sender)
|
|
|
|
|
elif content.find("置顶消息") != -1:
|
|
|
|
|
bot.top_msg(msg_id)
|
|
|
|
|
msgid_list.append(msg_id)
|
|
|
|
|
elif content.find("取消置顶的消息") != -1:
|
|
|
|
|
bot.remove_top_msg(sender, msgid_list.pop())
|
|
|
|
|
elif content.find("获取联系人列表") != -1:
|
|
|
|
|
bot.send_text(sender, json.dumps(bot.get_contacts()))
|
|
|
|
|
elif content.find("获取联系人详情") != -1:
|
|
|
|
|
bot.send_text(sender, json.dumps(bot.get_contact("<wxid>")))
|
|
|
|
|
elif content.find("获取群详情") != -1:
|
|
|
|
|
print(bot.get_room("<chatroomid>"))
|
|
|
|
|
elif content.find("收藏消息") != -1:
|
|
|
|
|
bot.collect_msg(msg_id)
|
|
|
|
|
elif content.find("收藏图片") != -1:
|
|
|
|
|
bot.collect_image(sender, os.path.abspath("test.png"))
|
|
|
|
|
elif content.find("ocr") != -1:
|
|
|
|
|
print(bot.ocr(os.path.abspath("test.png")))
|
|
|
|
|
|
|
|
|
|
bot.run()
|
|
|
|
|
```
|
|
|
|
|
|
2024-05-04 22:37:44 +08:00
|
|
|
|
QQ交流群:625920216
|