视频加载失败

零基础实现微信自动发消息:从 0 到发出第一条文本消息

2905 字
15 分钟
零基础实现微信自动发消息:从 0 到发出第一条文本消息

零基础实现微信自动发消息:从 0 到发出第一条文本消息#

https://github.com/ssq123123/wx-basic-bridge

这篇文章不要求你会 C,也不要求你先看懂微信内部结构。我们先把第一条消息跑通,再回头拆解它为什么能工作。

本文使用的是一个刻意做小的基础版工程,只保留四件事:

  • 发送文本消息
  • 接收微信消息
  • 用文件传递发送命令和执行结果
  • 用 SQLite 保存收到的消息

没有管理后台,没有 HTTP 接口,也没有联系人扫描。功能少,反而更适合第一次接触这类项目的人。


一、我们到底要做什么#

最终效果很简单。在 PowerShell 中执行:

Terminal window
powershell -ExecutionPolicy Bypass -File examples\send_text.ps1 `
-To filehelper `
-Content "你好,这是我的第一条程序消息"

程序返回:

{"ok":true,"seq":"1787126019363","command":"send_text","message":"send_text ok"}

然后打开微信文件传输助手,就能看到刚才那句话。

这里的 ok: true :命令已经被微信内部的发送函数成功处理。


二、先认识这条“消息传送带”#

整个工程可以理解成四个角色:

  1. PowerShell 或 Python 脚本:负责接收你输入的收件人和正文。
  2. outbox 文件夹:像小区门口的寄件柜,暂存一条待发送命令。
  3. 注入微信的 DLL:像一直值班的快递员,发现新命令后调用微信的文本发送函数。
  4. result 文件:像回执单,告诉脚本发送成功还是失败。

流程如下:

你输入消息
|
v
PowerShell / Python
|
v
bridge/outbox/next.txt
|
v
注入微信的 wx_hook_bridge.dll
|
v
微信文本发送函数
|
v
好友或文件传输助手
执行结果则沿着下面的路径返回:
bridge/control/result_<seq>.json
|
v
PowerShell / Python 显示 ok 或失败原因

这套方案没有启动 Web 服务,也不占用端口。遇到问题时,直接打开命令文件和结果文件就能检查,非常适合学习和调试。


三、环境准备#

请先核对下面四项。

项目要求
操作系统Windows 10/11 x64
微信版本微信 PC 4.1.9.23
PythonPython 3.11 或更高版本
编译环境Visual Studio 2022 C++ Build Tools

最重要的是微信版本。

这个工程中的函数偏移只适配 Weixin.dll 4.1.9.23。版本不一致时,注入器会主动停止,不会硬着头皮继续运行。

检查 Python#

打开 PowerShell,输入:

Terminal window
python --version

看到类似下面的结果即可:

Python 3.11.9

如果提示找不到 python,先安装 Python,并在安装界面勾选 Add Python to PATH

放置项目#

建议把源码解压到一个短路径,例如:

D:\wx-basic-bridge

之后在项目文件夹空白处按住 Shift,点击鼠标右键,选择“在终端中打开”。也可以手动执行:

Terminal window
cd D:\wx-basic-bridge

后面的所有命令都默认在这个项目根目录中执行。


四、第一步:登录微信并确认版本#

先正常打开微信并完成登录,同时保持微信主窗口打开。

回到 PowerShell,执行:

Terminal window
python python\tools\inject_bridge.py --list

正常情况下会看到类似结果:

pid=9112 name=Weixin.exe weixin_base=0x7ffa95a40000 version=4.1.9.23 exe=D:\Program Files\Tencent\Weixin\Weixin.exe

小白只需要盯住两个地方:

  • weixin_base 不能是 0x0
  • version 必须是 4.1.9.23

微信有时会启动多个子进程,所以列表里出现多行并不奇怪。找到那一行带有正确版本号和非零 weixin_base 的进程即可。


五、第二步:编译消息桥 DLL#

执行:

Terminal window
powershell -ExecutionPolicy Bypass -File native\wx_hook_bridge\build.ps1

编译成功后会生成:

dist\wx_hook_bridge.dll

你可以把这个 DLL 理解成“驻扎在微信内部的小工人”。外面的 Python 无法直接调用微信内部的文本发送函数,因此需要它进入微信进程,在里面接收命令并完成发送。

如果源码包已经自带编译好的 DLL,这一步仍然建议执行一次。这样可以确认你的 C++ 编译环境没有问题。


六、第三步:把消息桥启动起来#

执行:

Terminal window
python python\tools\inject_bridge.py

终端会先输出目标进程信息,例如:

Target: pid=9112 tid=1234 hwnd=0x123456 name=Weixin.exe title=微信

这个窗口不要关闭。它相当于消息桥的值班室,后面发送消息时需要它保持运行。

如果电脑上同时运行了多个微信实例,可以先用 --list 找到正确 PID,再指定目标:

Terminal window
python python\tools\inject_bridge.py --pid 9112

将示例里的 9112 换成你自己的 PID。


七、第四步:发出第一条消息#

再打开一个新的 PowerShell 窗口,进入同一个项目目录:

Terminal window
cd D:\wx-basic-bridge

先不要急着给好友发送,第一条消息建议发给文件传输助手。它的固定标识是 filehelper,不需要查找好友 ID。

执行:

Terminal window
powershell -ExecutionPolicy Bypass -File examples\send_text.ps1 `
-To filehelper `
-Content "你好,我的微信消息桥已经跑起来了"

看到下面这样的返回,就说明整个链路已经打通:

{"ok":true,"seq":"1787126019363","command":"send_text","message":"send_text ok"}

现在打开微信文件传输助手。那句话应该已经安静地躺在聊天记录里了。

同样的功能也可以直接用 Python 调用:

Terminal window
python python\tools\wx_basic_bridge.py send filehelper "这是 Python 发出的消息"

走到这里,你已经完成了最关键的一步:程序不再只是打印一行文字,而是真正把文字送进了微信。


八、如何给真实好友发消息#

给文件传输助手发送时使用 filehelper。给好友发送时,-To 后面不能写昵称,也不能写备注名,需要填写好友的 wxid

基础版没有联系人扫描功能。最简单的获取方式,是让对方先给你发一条消息,然后从接收记录中读取 peer_wxid

1. 启动消息归档器#

新开一个 PowerShell 窗口,执行:

Terminal window
powershell -ExecutionPolicy Bypass -File examples\watch_messages.ps1

这个窗口会持续观察:

bridge\inbox

每当 DLL 收到一条微信消息,就会生成一个 JSON 文件;归档器再把它写进:

bridge\messages.sqlite3

2. 让好友发一句话#

例如让对方发送:

测试一下

3. 查看最近消息#

执行:

Terminal window
python python\tools\wx_basic_bridge.py show --limit 20

找到对应消息中的:

"peer_wxid":"wxid_xxxxxxxxx"

4. 使用 wxid 回复#

Terminal window
powershell -ExecutionPolicy Bypass -File examples\send_text.ps1 `
-To wxid_xxxxxxxxx `
-Content "收到,这条回复来自程序"

wxid_xxxxxxxxx 换成刚才查到的真实值。


九、底层到底写了什么#

现在消息已经发出去了,我们再看核心代码,就不会觉得它像天书。

Python 发送端做的第一件事,是生成一个序号,然后把命令写入 outbox:

seq = str(int(time.time() * 1000))
_atomic_write(outbox, f"{seq}\t1\t{to}\t{content}")

一条真实命令看起来像这样:

1787126019363<TAB>1<TAB>filehelper<TAB>你好

四段内容分别表示:

字段含义
1787126019363本次发送的唯一序号
1消息类型,1 代表文本
filehelper接收人的 wxid
你好消息正文

DLL 中的 worker 会循环检查 bridge/outbox/next.txt。发现内容后,它会按制表符拆分字段,并且只接受类型 1

if (!str_eq(type, "1")) {
write_result(seq, 0, "unknown", "only type 1 (send_text) is supported");
} else {
ok = send_text(to, content);
write_result(seq, ok, "send_text", ok ? "send_text ok" : "send_text failed");
}

发送完成后,DLL 写入:

bridge\control\result_<seq>.json

外面的 Python 每隔一小段时间检查一次这个结果文件。收到结果就打印,超过默认 20 秒仍未收到就返回 timeout

这就是整个基础版最值得学习的地方:

复杂的进程内调用,被收拢成了一个很简单的文件协议。

外部程序不需要理解微信内存,只要会写一行文本,就能提交一条发送任务。


十、为什么第一版不用 HTTP#

很多人刚开始就想做一个 Web 面板,再配接口、端口、鉴权和前端页面。结果消息还没发出去,先被一堆配置绕晕了。

基础版选择文件桥有几个直接好处:

  • 不需要监听网络端口
  • 不需要安装 Web 框架
  • 命令和结果都能直接打开查看
  • Python、PowerShell、C#,甚至批处理都能接入
  • 出问题时容易判断卡在哪一层

等最小链路稳定后,再把文件入口包装成 HTTP、桌面界面或定时任务,会轻松很多。


十一、常见问题排查#

1. 提示 Unsupported Weixin.dll version#

当前微信版本不是 4.1.9.23。不要使用 --allow-version-mismatch 强行注入,因为不同版本的内部函数位置可能已经变化。

先执行:

Terminal window
python python\tools\inject_bridge.py --list

重新确认输出中的版本号。

2. 提示找不到 UI thread#

通常是微信主窗口没有打开。把微信主界面显示出来,再重新运行注入命令。

3. 发送结果是 timeout#

依次检查:

  1. 注入器窗口是否仍在运行。
  2. 微信是否已经登录。
  3. bridge\outbox\next.txt 是否一直残留旧命令。
  4. bridge\control 中是否生成了对应的结果文件。

如果 worker 已经停止,先重新启动注入器。确认 next.txt 是失败后遗留的旧命令,再清空它:

Terminal window
Clear-Content bridge\outbox\next.txt

4. 提示 outbox busy#

基础版一次只处理一条发送任务。上一条命令还没取走时,新命令不会覆盖它。

等待上一条完成;如果注入器已经退出,则重新启动注入器并处理遗留命令。

5. 文件传输助手能发,好友发不了#

最常见的原因是把昵称写在了 -To 后面。这里必须使用 wxid_xxx,不能填写“张三”“技术群”之类的显示名称。

6. 之前运行过完整版,基础版注入失败#

两个 DLL 不能同时占用同一个消息 Hook。完全退出微信并重新启动,然后只注入基础版。


十二、你现在已经掌握了什么#

如果前面的步骤全部跑通,你已经完成了一个清晰的最小闭环:

  • 找到正确的微信进程和版本
  • 编译并注入 DLL
  • 从 PowerShell 或 Python 提交文本命令
  • 等待微信内部完成发送
  • 获取 JSON 格式的执行回执
  • 接收消息并保存到 SQLite
  • 从接收记录中找到好友 wxid,再由程序回复

接下来无论想做关键词回复、定时提醒,还是把它接到自己的 AI 助手上,本质上都是在这个闭环外面再加一层业务逻辑。

先让一条消息稳稳地走完全程,再谈复杂功能。这比一开始堆十几个模块更快,也更容易真正学会。


十三、添加微信进群获取完整版#

如果你已经跑通了文件传输助手,说明最关键的发送链路已经成功。想继续研究图片、文件、转发、群聊管理、防撤回、朋友圈、视频号等功能,可以添加微信进入技术交流群获取完整版。

添加后可以领取:

  • 微信 PC 4.1.9.23 文本发送 DLL 源码
  • DLL 编译与注入脚本
  • PowerShell 一键发送示例
  • Python 文件桥调用代码
  • 消息接收与 SQLite 归档代码
  • 版本检查和 Hook 冲突保护
  • 基础版运行说明
  • 完整版功能介绍与交流群入口
添加微信进群获取完整版
微信扫码添加,备注“微信完整版”

微信:gzs-47

添加时请备注:微信完整版

通过好友后发送本文标题,我会邀请你进入交流群,在群里获取完整版和后续更新。建议先按本文跑通基础版,再按需要逐步增加模块,这样学习和排错都会轻松很多。

下面是完整版当前覆盖的功能模块:

微信完整版功能模块清单
微信完整版功能模块清单

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

随机文章随机推荐
Profile Image of the Author
47工作室
47工作室:记录技术实践与安全研究。
公告
欢迎来到 47工作室!微信:gzs-47
分类
标签
最新动态
站点统计
文章
41
分类
18
标签
170
总字数
125,784
运行时长
0
最后活动
0 天前