微信输入法(WeType)跨设备剪贴板的独立 Rust 客户端:以全新的设备身份与官方输入法配对, 然后收发文本、图片和文件。
| 路径 | 用途 |
|---|---|
crates/wx-ime-protocol |
包编解码、控制通道加密、配对码、protobuf 线格式消息 |
crates/wx-ime-sdk |
异步客户端:身份、配对、剪贴板、局域网文件传输 |
cli/ |
基于 SDK 的命令行工具 wxc |
SDK 不会读写宿主机剪贴板。
本项目原创代码采用 Apache License 2.0,允许在遵守协议条款的前提下使用、修改、 分发和商业集成。第三方依赖及其版权声明仍受各自许可证约束;本许可不授予腾讯或其他第三方 的商标、服务访问权限或其专利权。
- 非官方项目:本项目是独立开发的微信输入法(WeType)协议兼容实现,不是腾讯或微信 官方 SDK,未获其认可、赞助或背书。微信、WeChat、WeType 等名称和商标归其权利人所有, 在此仅用于说明兼容对象。
- 兼容性与服务风险:实现基于协议分析和有限测试,不保证与任何官方版本持续兼容, 也不保证服务可用、数据完整或消息送达。官方协议、服务策略或风控变化可能导致功能失效、 连接中断、账号限制或封禁;请在重要操作前备份数据并确认接收结果。
- 授权与合规:请仅在本人拥有或已获明确授权的设备、账号和数据上使用,遵守适用法律、 隐私要求及相关服务条款。不得用于未经授权的访问、截取他人数据或干扰服务。 本项目的开源许可不是对第三方服务条款的豁免,也不代表第三方已授权此类访问。
- 敏感信息:配对身份、私钥、令牌及剪贴板内容可能包含敏感数据。请妥善保护状态目录, 不要将其提交到代码仓库或公开日志;使用本项目与官方服务交互时,数据处理也受相关服务 的实际行为和隐私政策影响。
- 无担保与责任限制:在适用法律允许的范围内,本软件按“现状”提供,不附带明示或默示 担保;作者和贡献者的责任限制以 LICENSE 第 7、8 条为准。本声明不排除法律 规定不可排除的责任,也不限制 Apache-2.0 已授予的软件许可权利。
发布完成后可以使用(当前仓库配置不代表 npm 已发布):
npm install -g @mkdir700/wxc
wxc --help
# 或临时运行
npm exec --package=@mkdir700/wxc -- wxc --help需要 Node.js 22+,支持 macOS arm64/x64、Linux glibc 2.35+ arm64/x64、Windows x64。 预编译包内置 OpenSSL,不需要 Rust 工具链;保持 npm optional dependencies 启用。 这安装的是 CLI,不是 JavaScript SDK。构建验证与首次发布配置见 发布说明。
需要 Rust 1.92+、protoc、带 secp128r1 曲线的 OpenSSL 开发文件和 C 工具链。启用
vendored-openssl 特性可改为从源码编译 OpenSSL。
cargo build --release -p wxc # 产物:target/release/wxc
cargo test --workspacewxc [--state DIR] [--name NAME] [--timeout SECONDS] <COMMAND>
| 命令 | 行为 |
|---|---|
wxc pair 123456 |
加入官方输入法显示的六位配对码,并保存新身份 |
wxc devices |
以 JSON 输出本机和已配对设备(Uin) |
wxc send 'hello' |
发送文本 |
wxc send ./photo.png |
发送图片(按内容识别 PNG/JPEG,最大 16 MiB) |
wxc send ./report.pdf |
通过局域网发送其他普通文件(最大 1 GiB) |
wxc send - |
读取标准输入作为文本发送(UTF-8,保留换行) |
wxc recv |
拉取一次最新剪贴板内容。文本输出到 stdout,图片保存到 -o(默认 .);没有新内容时退出码为 0,并在 stderr 提示 |
wxc recv -f -o . |
等待官方应用发来的文件邀请,接受后保存到 -o,完成后退出 |
send 的判定规则:
- 参数指向已存在的普通文件时,按文件内容判断发送图片还是文件,不看扩展名。超过 16 MiB 的 图片、GIF、WebP 按普通文件发送。
- 否则按文本发送。若参数形如路径(
./x、../x、/x、~/x)但文件不存在,则报错,避免 把写错的路径当文本发出去。 - 在 Unix 上,若字面路径不存在,会再尝试去掉反斜杠转义(如终端拖入文件得到的
a\ b.png)。 --text强制按文本发送,即使存在同名文件。- 发送文件需要确定目标:用
--peer UIN指定;若恰好只有一个已配对设备支持文件传输,则自动 选中。--ip IP可覆盖自动探测的局域网地址。
recv -f 选项:-n N 收到 N 个文件后退出(默认 1);--wait 秒数 限制等待邀请的时间
(默认 300,0 表示一直等到 Ctrl-C);--ip IP 覆盖对外公布的局域网地址。文件先放在状态
目录内的私有暂存区,再移动到 -o,不会覆盖已有文件,重名时变成 name (1).ext。
输出:默认输出便于阅读的文本;加全局选项 --json 时,pair、devices、send、recv
(图片)和 recv -f 改为在 stdout 输出 JSON。recv 收到的文本始终原样输出。进度和诊断信息写
stderr;失败时退出码为 1。
文件传输需要告诉对端本机的局域网地址。未指定 --ip 时,wxc 枚举物理网卡的 IPv4 地址并全部
公布(对端会逐个尝试),自动排除代理/VPN 的虚拟网卡(utun*、tun*、docker* 等)以及
198.18.0.0/15(Clash/Surge 的 fake-IP)、100.64.0.0/10、链路本地地址。若仍选错,用
--ip 手动指定。
身份(私钥、设备 Uin)保存在 --state DIR,默认依次取 $WXC_STATE、
$XDG_CONFIG_HOME/wxc、~/.config/wxc。同一目录同一时间只运行一个 wxc。
设备名(官方应用里显示的名字)在首次创建身份时用 --name 指定,例如
wxc pair 123456 --name 'My Mac',不指定时随机生成 WXC-XXXX(4 位随机字符)。名字会记在状态目录的 device-name 文件里,之后
的命令不必再带 --name。身份创建后不能改名:用不同的 --name 运行会报错,要改名请用
wxc pair CODE --reset --name 新名字 重新创建身份。
已配对的身份再次 wxc pair 通常会失败。要加入另一台官方设备,使用:
wxc pair 123456 --reset它会把当前状态目录改名为 <state>.old-<时间戳> 留作备份,用全新的身份去配对;配对失败时自动还原
旧身份。注意这不是“退出旧组”:协议中退出组/解绑的请求尚未逆向,旧设备条目会作为多余的 wxc
留在官方端的设备列表里,需要在官方应用中手动移除。
- 文本和图片的回执只表示服务端已接受,不代表官方应用已经粘贴。发送超时意味着送达结果未知, 重试前先在对端确认。
- 文件回执表示接收方已确认完整的字节范围。
- 文件传输是两台设备之间的局域网 TLS 直连,没有广域网或 NAT 中继。双方必须在可互通的网络
中;
recv -f会监听随机端口,本机防火墙需放行入站连接。
以下是协议层面已实现、仍需真机运行确认的部分:
recv -f依赖服务端的待接收邀请查询(GroupRequest.filter的 64 位、Group第 7 字段)。官方应用的“发送文件”入口会检查目标设备的support_file_transfer标志,而本 SDK 自己不上报该标志。如果官方应用不把wxc列为文件目标,在弄清该标志之前无法走到接收流程。- 邀请的
send_time单位未核实,因此不按时间判断过期,而是记住上一个处理过的邀请码 (<state>/last-invite)并跳过。 - 加入邀请后,
recv -f会一直等待对端连接;若官方端已取消,请用 Ctrl-C 结束。