feat: 微信自动化客服(wechatauto-replica) 干净历史导入 - AI 自动回复/语音收发/朋友圈发布

This commit is contained in:
2026-09-16 10:12:49 +08:00
commit c3b98f4c4e
69 changed files with 19828 additions and 0 deletions
+100
View File
@@ -0,0 +1,100 @@
# -*- coding: utf-8 -*-
"""表情包截图示例 —— 遇到「动画表情」消息时截取其图片
背景:微信 4.x 表情消息在本地数据库中的 content 为加密数据,无法直接
提取原图。因此采用「打开会话 → 滚动到底 → 对最后一条消息区域截图」的
屏幕截图方案(EmojiMessage.capture()),返回 PNG 路径。
用法:
python demo_emoji_capture.py # 默认会话:文件传输助手
python demo_emoji_capture.py 某个群 # 指定会话
python demo_emoji_capture.py --listen 某个群 # 监听模式:收到表情自动截图
"""
from __future__ import annotations
import os
import sys
import time
try:
os.system("chcp 65001 >nul 2>&1")
except Exception:
pass
try:
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
except AttributeError:
pass
from wechatauto import WeChat
SAVE_DIR = os.path.join(os.path.expanduser("~"), "emoji_capture")
def capture_emoji(msg) -> str | None:
"""对一条表情消息截图,返回 PNG 路径;失败返回 None。
截图位置根据消息方向自动判断:
- msg.attr == 'self' → 右对齐(自己发的)
- 否则 → 左对齐(对方发的)
"""
path = msg.capture(save_dir=SAVE_DIR)
return path
def capture_latest_emoji(wx: WeChat, who: str) -> None:
"""打开会话,截取最新一条表情消息的气泡图片。
说明:capture() 截图的是屏幕上「最新一条消息」的位置,因此表情
必须是该会话的最新一条消息才能截到它;否则请用 --listen 模式,
收到表情时它即为最新一条,可自动截图。
"""
wx.ChatWith(who)
time.sleep(0.5)
msgs = wx.GetAllMessage() # 新→旧排列,msgs[0] 是会话最新一条
if not msgs:
print(f"会话「{who}」没有消息")
return
if getattr(msgs[0], "type", None) != "emotion":
print(f"会话「{who}」最新一条不是表情(是 {msgs[0].type}")
print("提示:capture() 只截取最新一条消息,请用 --listen 模式在收到表情时自动截图")
return
msg = msgs[0]
path = capture_emoji(msg)
if path:
print(f"[表情截图] 方向={msg.attr} 路径={path}")
else:
print("[表情截图] 截图失败(微信窗口是否可见?会话是否在最前?)")
def listen_emoji(wx: WeChat, who: str) -> None:
"""监听模式:实时收到表情消息时自动截图。"""
def callback(msg, chat):
if getattr(msg, "type", None) == "emotion":
path = capture_emoji(msg)
if path:
print(f"[收到表情 {msg.attr}] 截图成功 -> {path}")
else:
print("[收到表情] 截图失败")
wx.AddListenChat(who, callback=callback)
print(f"监听中,Ctrl+C 退出:{who}")
wx.KeepRunning()
def main():
args = [a for a in sys.argv[1:]]
listen = "--listen" in args
names = [a for a in args if not a.startswith("--")]
who = names[0] if names else "送你挖银子"
wx = WeChat()
print(f"当前登录:{wx.nickname}")
if listen:
listen_emoji(wx, who)
else:
capture_latest_emoji(wx, who)
if __name__ == "__main__":
main()