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

零基础实现微信自动发消息:从 0 到发出第一条文本消息
https://github.com/ssq123123/wx-basic-bridge
这篇文章不要求你会 C,也不要求你先看懂微信内部结构。我们先把第一条消息跑通,再回头拆解它为什么能工作。
本文使用的是一个刻意做小的基础版工程,只保留四件事:
- 发送文本消息
- 接收微信消息
- 用文件传递发送命令和执行结果
- 用 SQLite 保存收到的消息
没有管理后台,没有 HTTP 接口,也没有联系人扫描。功能少,反而更适合第一次接触这类项目的人。
一、我们到底要做什么
最终效果很简单。在 PowerShell 中执行:
powershell -ExecutionPolicy Bypass -File examples\send_text.ps1 ` -To filehelper ` -Content "你好,这是我的第一条程序消息"程序返回:
{"ok":true,"seq":"1787126019363","command":"send_text","message":"send_text ok"}然后打开微信文件传输助手,就能看到刚才那句话。
这里的 ok: true :命令已经被微信内部的发送函数成功处理。
二、先认识这条“消息传送带”
整个工程可以理解成四个角色:
- PowerShell 或 Python 脚本:负责接收你输入的收件人和正文。
- outbox 文件夹:像小区门口的寄件柜,暂存一条待发送命令。
- 注入微信的 DLL:像一直值班的快递员,发现新命令后调用微信的文本发送函数。
- result 文件:像回执单,告诉脚本发送成功还是失败。
流程如下:
你输入消息 | vPowerShell / Python | vbridge/outbox/next.txt | v注入微信的 wx_hook_bridge.dll | v微信文本发送函数 | v好友或文件传输助手
执行结果则沿着下面的路径返回:
bridge/control/result_<seq>.json | vPowerShell / Python 显示 ok 或失败原因这套方案没有启动 Web 服务,也不占用端口。遇到问题时,直接打开命令文件和结果文件就能检查,非常适合学习和调试。
三、环境准备
请先核对下面四项。
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10/11 x64 |
| 微信版本 | 微信 PC 4.1.9.23 |
| Python | Python 3.11 或更高版本 |
| 编译环境 | Visual Studio 2022 C++ Build Tools |
最重要的是微信版本。
这个工程中的函数偏移只适配 Weixin.dll 4.1.9.23。版本不一致时,注入器会主动停止,不会硬着头皮继续运行。
检查 Python
打开 PowerShell,输入:
python --version看到类似下面的结果即可:
Python 3.11.9如果提示找不到 python,先安装 Python,并在安装界面勾选 Add Python to PATH。
放置项目
建议把源码解压到一个短路径,例如:
D:\wx-basic-bridge之后在项目文件夹空白处按住 Shift,点击鼠标右键,选择“在终端中打开”。也可以手动执行:
cd D:\wx-basic-bridge后面的所有命令都默认在这个项目根目录中执行。
四、第一步:登录微信并确认版本
先正常打开微信并完成登录,同时保持微信主窗口打开。
回到 PowerShell,执行:
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不能是0x0version必须是4.1.9.23
微信有时会启动多个子进程,所以列表里出现多行并不奇怪。找到那一行带有正确版本号和非零 weixin_base 的进程即可。
五、第二步:编译消息桥 DLL
执行:
powershell -ExecutionPolicy Bypass -File native\wx_hook_bridge\build.ps1编译成功后会生成:
dist\wx_hook_bridge.dll你可以把这个 DLL 理解成“驻扎在微信内部的小工人”。外面的 Python 无法直接调用微信内部的文本发送函数,因此需要它进入微信进程,在里面接收命令并完成发送。
如果源码包已经自带编译好的 DLL,这一步仍然建议执行一次。这样可以确认你的 C++ 编译环境没有问题。
六、第三步:把消息桥启动起来
执行:
python python\tools\inject_bridge.py终端会先输出目标进程信息,例如:
Target: pid=9112 tid=1234 hwnd=0x123456 name=Weixin.exe title=微信这个窗口不要关闭。它相当于消息桥的值班室,后面发送消息时需要它保持运行。
如果电脑上同时运行了多个微信实例,可以先用 --list 找到正确 PID,再指定目标:
python python\tools\inject_bridge.py --pid 9112将示例里的 9112 换成你自己的 PID。
七、第四步:发出第一条消息
再打开一个新的 PowerShell 窗口,进入同一个项目目录:
cd D:\wx-basic-bridge先不要急着给好友发送,第一条消息建议发给文件传输助手。它的固定标识是 filehelper,不需要查找好友 ID。
执行:
powershell -ExecutionPolicy Bypass -File examples\send_text.ps1 ` -To filehelper ` -Content "你好,我的微信消息桥已经跑起来了"看到下面这样的返回,就说明整个链路已经打通:
{"ok":true,"seq":"1787126019363","command":"send_text","message":"send_text ok"}现在打开微信文件传输助手。那句话应该已经安静地躺在聊天记录里了。
同样的功能也可以直接用 Python 调用:
python python\tools\wx_basic_bridge.py send filehelper "这是 Python 发出的消息"走到这里,你已经完成了最关键的一步:程序不再只是打印一行文字,而是真正把文字送进了微信。
八、如何给真实好友发消息
给文件传输助手发送时使用 filehelper。给好友发送时,-To 后面不能写昵称,也不能写备注名,需要填写好友的 wxid。
基础版没有联系人扫描功能。最简单的获取方式,是让对方先给你发一条消息,然后从接收记录中读取 peer_wxid。
1. 启动消息归档器
新开一个 PowerShell 窗口,执行:
powershell -ExecutionPolicy Bypass -File examples\watch_messages.ps1这个窗口会持续观察:
bridge\inbox每当 DLL 收到一条微信消息,就会生成一个 JSON 文件;归档器再把它写进:
bridge\messages.sqlite32. 让好友发一句话
例如让对方发送:
测试一下3. 查看最近消息
执行:
python python\tools\wx_basic_bridge.py show --limit 20找到对应消息中的:
"peer_wxid":"wxid_xxxxxxxxx"4. 使用 wxid 回复
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 强行注入,因为不同版本的内部函数位置可能已经变化。
先执行:
python python\tools\inject_bridge.py --list重新确认输出中的版本号。
2. 提示找不到 UI thread
通常是微信主窗口没有打开。把微信主界面显示出来,再重新运行注入命令。
3. 发送结果是 timeout
依次检查:
- 注入器窗口是否仍在运行。
- 微信是否已经登录。
bridge\outbox\next.txt是否一直残留旧命令。bridge\control中是否生成了对应的结果文件。
如果 worker 已经停止,先重新启动注入器。确认 next.txt 是失败后遗留的旧命令,再清空它:
Clear-Content bridge\outbox\next.txt4. 提示 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
添加时请备注:微信完整版。
通过好友后发送本文标题,我会邀请你进入交流群,在群里获取完整版和后续更新。建议先按本文跑通基础版,再按需要逐步增加模块,这样学习和排错都会轻松很多。
下面是完整版当前覆盖的功能模块:

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














