deca_wechat.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. # -*- coding: utf-8 -*-
  2. # Author : Charley
  3. # Python : 3.12.10
  4. # Date : 2026/08/02
  5. """通过 PC 版微信(wxauto4)把文件/图片发送给指定好友或群。
  6. 前置条件:
  7. 1. 已装 wxauto4:pip install wxauto4
  8. (原 wxauto 已从 PyPI 下架;wxauto4 对应微信 4.0 PC 客户端,免费,支持 Python 3.9~3.13)
  9. 2. Windows PC 版微信(4.0+) 已登录,窗口未最小化(wxauto4 靠 UI 自动化操作微信窗口,
  10. 运行期间尽量别抢占鼠标/键盘)。
  11. 3. 目标好友/群的备注名或昵称须与传入的 who 完全一致(测试用 "backup")。
  12. 用法:
  13. - 作为模块:from deca_wechat import send_files; send_files("xx.png", who="backup")
  14. - 命令行: python deca_wechat.py <文件路径> [好友名(默认backup)]
  15. """
  16. import sys
  17. from loguru import logger
  18. # 目标匹配是否精确:True=按 who 精确匹配备注/昵称(推荐,避免误发给名字相近的人)
  19. EXACT_MATCH = True
  20. def send_files(paths, who: str = "backup") -> bool:
  21. """发送一个或多个文件给微信好友/群。
  22. Args:
  23. paths (str | list[str]): 单个文件路径或路径列表。
  24. who (str, optional): 目标好友备注名/昵称或群名。Defaults to "backup"。
  25. Returns:
  26. bool: 全部发送成功返回 True;库缺失、连不上微信或发送异常返回 False。
  27. """
  28. try:
  29. from wxauto4 import WeChat
  30. except ImportError:
  31. logger.error("未安装 wxauto4,请执行: pip install wxauto4")
  32. return False
  33. if isinstance(paths, str):
  34. paths = [paths]
  35. try:
  36. wx = WeChat() # 绑定当前已登录的 PC 微信(未登录/窗口不可见会失败)
  37. except Exception as e:
  38. logger.error(f"连接 PC 微信失败(确认微信4.0已登录且窗口可见): {e}")
  39. return False
  40. ok = True
  41. for p in paths:
  42. try:
  43. resp = wx.SendFiles(str(p), who=who, exact=EXACT_MATCH)
  44. logger.info(f"微信已发送: {p} -> {who} | 返回: {resp}")
  45. except Exception as e:
  46. ok = False
  47. logger.error(f"微信发送失败 {p} -> {who}: {e}")
  48. return ok
  49. if __name__ == "__main__":
  50. logger.remove()
  51. logger.add(sys.stderr, level="INFO")
  52. if len(sys.argv) < 2:
  53. print("用法: python deca_wechat.py <文件路径> [好友名(默认backup)]")
  54. sys.exit(1)
  55. target = sys.argv[2] if len(sys.argv) > 2 else "backup"
  56. send_files(sys.argv[1], target)