【教程】wxcode+YYB Go融合网关:单容器实现微信小程序取码(架构说明与完整部署指南)

【教程】wxcode+YYB Go融合网关:单容器实现微信小程序取码(架构说明与完整部署指南)

时间煮雨-Master
2026-09-18 / 0 评论 / 40 阅读 / 正在检测是否收录...

wxcode + YYB Go 融合网关:单容器实现微信小程序取码(架构说明与完整部署指南)

浏览器 /scan 出二维码 → 手机微信扫码 → 青龙脚本带令牌取 code。
无需 root 手机、无需 Android 容器、无需 Xposed。

  • GitHub:https://github.com/SJZYKJ/wxcode-yyb-fusion-docker
  • Docker Hub:chungg/wxcode-yyb-fusion(latest + v<N> 双标签,amd64/arm64)

Test

一、它解决什么问题

青龙面板里的取码类脚本(顺丰、移动云盘等)需要一个微信小程序的临时 code,而换取 code 的前提是有一份可用的微信登录态。

历史上的两类方案都不轻:

方案依赖问题
root 手机 + Xposed 模块一台常年开机的 root 安卓机、LSPosed、注入微信进程的模块机器成本、微信版本跟进、模块维护风险
redroid(Android-in-Docker)宿主机内核支持 binder / ashmem普通云 VPS / macOS / WSL2 大多不可用;还要在容器内维护微信登录态

设计结论:真正需要的是"一份微信登录态",而不是"一个跑着微信的安卓"。前者只需要一次扫码,后者需要一整套重环境。

所以从 v4.0.0 起项目改为单服务纯 Docker:扫码登录走 YYB Go 原生的微信登录协议,与 Android 完全解耦;原来的 wxcode 模块(WxLoginHook implements IXposedHookLoadPackage,必须注入 com.tencent.mm 进程运行,反射构造 JsApiLogin$LoginTask,在微信进程内起 NanoHTTPD 监听 8088)降级为可选的设备端点——它是纯 Java/Android 组件,无法编译进 Linux 上的 Go 服务,而它的"实时取码"能力原生扫码链路已经覆盖,且更轻。

通道原理依赖默认
原生扫码登录浏览器 /scan 出码 → 手机微信扫码 → login_buffer 自动刷新无(纯 Docker)✅ 开启
wxcode 设备已 root 手机装 wxcode_2.1.0.apk,NanoHTTPD :8088 取码root 手机 + LSPosed可选(配 WXCODE_URLS)

二、目录结构

wxcode-yyb-fusion-docker/
├── deploy.sh               # 一键部署脚本(生成 .env → 建数据目录 → 拉镜像 → 健康检查)
├── compose.yaml            # 默认编排:拉取预构建镜像(推荐)
├── compose.build.yaml      # 本地构建编排:改了源码后用
├── .env.example            # 环境变量模板
├── .github/workflows/
│   └── docker-publish.yml  # GitHub Actions:构建双架构镜像并推送到 Docker Hub
├── Dockerfile              # 网关镜像(预编译二进制,内置 wxcode APK)
├── Dockerfile.src          # 网关镜像(源码构建版,可选)
├── build-gateway.sh        # 交叉编译 gateway/yyb-go-{amd64,arm64}
├── src/                    # 融合版完整源码
│   ├── cmd/yyb-go/         # 主程序入口
│   ├── internal/
│   │   ├── httpapi/        # 路由层:/login /scan /wxcode/* 统一分发
│   │   ├── wxcode/         # wxcode 设备协议客户端
│   │   ├── protocol/       # 原生微信登录协议(login_buffer / pool / mmtls)
│   │   ├── qr/             # 扫码登录二维码生成与轮询
│   │   └── store/          # 账号与登录态存储(SQLite)
│   └── ...
├── gateway/
│   ├── yyb-go-amd64        # Linux/amd64 预编译融合网关
│   ├── yyb-go-arm64        # Linux/arm64 预编译融合网关
│   └── resource/           # Web 面板静态资源(含 /scan 扫码页)
└── wxcode/
    └── wxcode_2.1.0.apk    # 可选:安装到已 root 手机作设备取码端点

三、部署

前置:机器已装 Docker 与 docker compose。

3.1 一条命令(推荐,不用 clone)

curl -fsSL https://raw.githubusercontent.com/SJZYKJ/wxcode-yyb-fusion-docker/main/deploy.sh | bash

脚本自动完成:检查 Docker → 下载编排文件 → 生成随机访问令牌写入 .env → 建数据目录 → 拉镜像 → 启动 → 健康检查 → 打印访问地址与令牌。

3.2 clone 后执行

git clone https://github.com/SJZYKJ/wxcode-yyb-fusion-docker.git
cd wxcode-yyb-fusion-docker
./deploy.sh

3.3 手动 compose

git clone https://github.com/SJZYKJ/wxcode-yyb-fusion-docker.git && cd wxcode-yyb-fusion-docker
cp .env.example .env
docker compose up -d
不想手填令牌也不会裸奔:网关首次启动会自动生成访问令牌、存进数据库(跟随数据卷持久化,重启不变),并打印到 docker compose logs | grep 令牌。

3.4 deploy.sh 参数

./deploy.sh --help
参数说明
--dir <路径>部署目录(默认仓库目录,不 clone 时用 ./wxcode-yyb-fusion-docker)。NAS 上建议指定固定盘位
--port 8088宿主机端口
--bind 127.0.0.1只监听本机(配合 Nginx 反代更安全)
--token <令牌>指定访问令牌(默认自动生成随机串)
--no-token关闭访问令牌(⚠️ 取码接口裸奔,仅限完全可信内网)
--allow-registration开放公开注册(默认关闭)
--trust-proxy信任 X-Forwarded-For(确实有反代时才开)
--image-tag v11固定版本 / 回滚(v<N> 为全局递增的正式发布号)
--build用本仓库源码本地构建(改 Go 代码后用)
--dry-run只准备 .env 并打印命令,不启动容器
--logs启动后跟踪容器日志
--uninstall停止并删除容器(数据保留)
脚本是幂等的:重复执行 = 拉新镜像 + 重启,不会覆盖已有的 .env、访问令牌和数据。
Windows 上可用 Git Bash / WSL 执行同一个脚本(已处理 MSYS 路径差异)。

Test

四、部署完成后做三件事

1)注册管理员(只能从内网)

浏览器打开 http://<宿主IP>:8088/,首次部署时从内网访问 /register 注册第一个账号,自动成为管理员。已有账号则直接 /login。

注册默认关闭,且公网来源会被拒绝(防止实例刚上线就被陌生人抢注管理员)。若你只能从公网初始化,请在 .env 里预先设置管理员再重启:

YYB_ADMIN_USER=admin
YYB_ADMIN_PASSWORD=<10 位以上>

2)手机扫码添加微信号

打开 http://<宿主IP>:8088/scan,手机微信扫码,登录态自动保存并定时保活。

3)青龙里配上同名令牌

docker compose logs | grep -A6 "已自动生成 API 访问令牌"

把值填到青龙环境变量 YYB_API_TOKEN(顺丰中秋 / sfsy日常版 / 移动云盘三个脚本已内置支持,两边值必须一致)。

常用地址

地址用途
http://<host>:8088/Web 面板(账号管理、运行管理)
http://<host>:8088/scan微信扫码登录页
http://<host>:8088/instances账号实例列表(脚本枚举用,需令牌)
http://<host>:8088/wxapp/getCode指定账号取码(脚本用,需令牌)
http://<host>:8088/health健康检查(始终免鉴权)
http://<host>:8088/login?appId=wx...取码接口(wxcode 协议;自动适配:设备优先,无设备回退原生)

五、取码接口

# 1) 原生扫码登录(推荐):/scan 扫码后直接取码
curl -X POST http://127.0.0.1:8088/login -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $YYB_API_TOKEN" \
  -d '{"app_id":"wxaa3a999db5d744c6"}'
# 返回 {"source":"native","fallback":false,"openid":"...","result":{"code":"...","status":"success"}}

# 2) wxcode 兼容格式(响应保持 err/msg/appId/status/code/codeType/codeLength,客户端无需改动)
curl -H "Authorization: Bearer $YYB_API_TOKEN" \
  'http://127.0.0.1:8088/login?appId=wxaa3a999db5d744c6'

# 3) 兼容端点
curl -H "Authorization: Bearer $YYB_API_TOKEN" http://127.0.0.1:8088/whoami
curl -H "Authorization: Bearer $YYB_API_TOKEN" http://127.0.0.1:8088/instances

通道选择规则:

  • 只传 app_id → 先设备(wxcode)后原生;
  • 传 app_id + ref → 先原生(指定账号)后设备;
  • 传 prefer=device|native → 显式指定。

脚本侧传令牌的三种方式

curl -H "Authorization: Bearer $YYB_API_TOKEN" http://host:8088/instances      # 1 推荐
curl -H "X-API-Token: $YYB_API_TOKEN" 'http://host:8088/login?appId=wx...'     # 2 推荐
curl "http://host:8088/instances?token=$YYB_API_TOKEN"                         # 3 兜底
前两种更安全:?token= 会出现在 Web 服务器访问日志、浏览器历史与 Referer 里。

Python(青龙脚本)里的标准写法:

GATEWAY_TOKEN = os.environ.get("YYB_API_TOKEN", "").strip()
GATEWAY_HEADERS = {"Authorization": f"Bearer {GATEWAY_TOKEN}"} if GATEWAY_TOKEN else {}
# 合并进 requests 的 headers 参数即可

六、多用户与权限模型

关键设计:会话 ≠ 令牌。 同一个接口,按你用什么凭据调用,可见范围不同。

凭据权限模型可见 / 可取范围
API 令牌(Authorization / X-API-Token / ?token=)公开 API(脚本通道)全部 api_shared=1 的账号,不做归属过滤 —— 青龙脚本行为与以前完全一致
浏览器会话 Cookie控制台(按归属)管理员:全部账号;普通账号:只有归属自己的账号
视角判定方式能看到哪些账号
管理员注册的第一个账号,或角色为 admin全部账号
普通用户由管理员创建 / 自行注册只有自己扫码添加的账号
脚本 / 公开 API不带浏览器会话调用取码类接口全部账号,但跳过拥有者关闭了「脚本可读」的账号

「脚本可读」开关(api_shared):账号拥有者在工作台选中账号后可开关。开启(默认)时脚本能通过 /instances、/login、/wxapp/getCode 读到它;关闭后该账号从这些接口消失,只保留在拥有者自己的控制台里。

扫码归属:普通用户扫码 → 账号归自己,别人(含管理员)看不到;管理员扫码 → 记在自己名下,但不会夺走已归属其他用户的账号;老库升级时 owner_user_id 为 NULL 的历史账号视为管理员名下。

普通用户可用的页面:/ 工作台、/scan、/runs、/qr、/quick-login、/accounts 及其操作、/api/qinglong/*、/settings。仅管理员可用:/users、/api/auth/users*、注册开关、/api/qinglong/config。


七、安全默认值

项目默认行为
取码类接口
/login 取码分支、/instances、/whoami、/wxapp/*、/wx/*、/wxcode/*、/openapi.json
必须带访问令牌(fail-closed)。YYB_API_TOKEN 留空时网关自动生成 256bit 随机令牌、写入数据库持久化(重启/升级不变)并打印到容器日志,不存在无鉴权的窗口
关闭鉴权只有显式设 YYB_ALLOW_NO_AUTH=true 才生效(启动日志有醒目警告)
公开注册默认关闭。库中无账号时仅允许内网/回环地址完成首个管理员注册;公网直连一律拒绝
登录限速账号 10 次 / IP 8 次,15 分钟窗口,双通道计数(只伪造 IP 或只打单账号都绕不过);计数表有上限
X-Forwarded-For默认不信任,只有 YYB_TRUST_PROXY=true 才采信
会话 CookieHttpOnly + SameSite=Lax;HTTPS 请求自动加 Secure,也可 YYB_COOKIE_SECURE=true 强制
开放重定向登录 next 参数只接受站内路径,//host、/\host 与控制字符注入一律收敛到 /
/wxcode/* 设备端纳入令牌保护(注册接口写入的端口会被当作取码源请求,不鉴权等于开放 SSRF/取码源劫持点);hookcfg/config/register 只接受令牌或管理员会话
容器非 root(yyb)运行、cap_drop: ALL、no-new-privileges,仅保留启动时修数据目录权限所需的 5 项 capability
令牌比较常量时间函数
⚠️ v4.2.4 及更早存在横向越权:任何登录用户用浏览器打开 /instances 就能列出全部账号的 openid,并能借 api_shared 默认开启按 ref 取到他人(含管理员)的 code。原因是"有效会话"被当成与令牌等价的凭据放行,却没有把会话身份注入请求上下文。v4.2.5 起按上表修正,越权请求返回 account not found,不泄露账号是否存在或归属。

八、环境变量参考(.env)

变量默认说明
IMAGE_REPOchungg/wxcode-yyb-fusion镜像仓库
IMAGE_TAGlatest固定版本用 v<N>;latest 会动,别拿它回滚
DATA_DIR./data数据目录(SQLite / 头像 / 二维码),相对路径以 compose 文件所在目录为基准
YYB_PORT8088宿主机端口
YYB_BIND_ADDRESS0.0.0.0只监听本机就填 127.0.0.1
YYB_PLATFORMlinux/amd64ARM 设备(树莓派 / ARM NAS)必须改成 linux/arm64
YYB_API_TOKEN空留空则自动生成并落库
YYB_ALLOW_NO_AUTHfalse显式关闭鉴权(⚠️ 危险)
YYB_ALLOW_REGISTRATIONfalse开放公开注册
YYB_TRUST_PROXYfalse部署在反代后面时才开
YYB_COOKIE_SECUREfalseHTTPS 反代时设 true
YYB_ADMIN_USER / YYB_ADMIN_PASSWORDadmin / 空预设管理员,启动时自动创建(密码 ≥10 位)
YYB_AUTH_DRIVERsqlite建议保持默认;设为 none 会关掉 Web 鉴权,工作台的「调用配置」也会被令牌拦住
WXCODE_URLS空设备端点,如 http://<手机IP>:8088;多设备逗号分隔
WXCODE_HOOK_PORT8088wxcode 设备协议端口
PANEL_TYPE / QL_* / DAIDAI_*—面板对接(青龙 / 呆呆)
YYB_DNS_SERVERS223.5.5.5:53,119.29.29.29:53网关解析用的 DNS
YYB_KEEPALIVE_INTERVAL / YYB_KEEPALIVE_AHEAD30m / 45m登录态保活间隔与提前量

九、日常运维

操作命令
看日志docker compose logs -f --tail=100
升级./deploy.sh(自动 pull + 重启)
回滚./deploy.sh --image-tag v11
停服./deploy.sh --uninstall
改端口编辑 .env 的 YYB_PORT,再跑 ./deploy.sh
备份数据拷走 .env 里 DATA_DIR 指向的目录(默认 ./data)。这就是全部家当,含微信登录凭据
本地构建./build-gateway.sh && docker compose -f compose.build.yaml up -d --build

核对当前版本:

docker compose exec yyb-go cat /app/resource/static/version.json   # -> {"version":"v11"}
curl -s http://127.0.0.1:8088/static/version.json

登录页也会直接显示版本号(该文件由构建参数 VERSION 写入,是公开静态资源,不需要令牌)。本地 compose.build.yaml 自建的镜像显示 local。

改了源码怎么重新出镜像:

./build-gateway.sh                                            # ① 交叉编译 amd64+arm64
cp -r src/resource/templates/. gateway/resource/templates/     # ② 同步面板资源
docker compose -f compose.build.yaml up -d --build             # ③ 构建并启动
Dockerfile 只 COPY gateway/ 下的二进制和 resource/。只改 src/ 而不跑第 ① 步,部署上去毫无变化。

十、wxcode 设备通道(可选)

  1. 准备一台已 root 的 Android 手机,安装 LSPosed;
  2. 安装 wxcode/wxcode_2.1.0.apk 并启用模块,作用域勾选微信;
  3. 重启微信,确认手机端 http://127.0.0.1:8088/instances 有实例;
  4. 在 .env 中配置 WXCODE_URLS=http://<手机IP>:8088(同一局域网;或用 adb reverse);
  5. docker compose up -d 重启网关。
手机端 NanoHTTPD 默认监听 8088,若还跑了 Zygisk hook(8089)可同时填多个端点:http://ip:8088,http://ip:8089。Docker 部署的推荐做法是静态配置 WXCODE_URLS,而不是让手机 hook 自注册。

十一、排错

现象原因 / 处理
WXCODE_URLS 留空时 /login?appId= 能用吗能。设备通道不可达时自动回退原生扫码登录,响应仍是 wxcode 格式,客户端无需改动
/api/wxcode/status 显示 127.0.0.1:8089 offline正常。容器内不可达该地址,会自动回退原生通道
没有 root 手机能用吗能。原生扫码登录完全够用,wxcode 只是可选的加分项
面板登录不上首个管理员从内网访问 /register 注册;或用 YYB_ADMIN_USER/YYB_ADMIN_PASSWORD 预设
脚本报 401(配了令牌)给网关请求加 Authorization: Bearer 或 X-API-Token 头,或在 URL 拼 ?token=
脚本报 401(没配令牌)令牌是自动生成的,去日志取:`docker compose logs \grep -A6 已自动生成`
升级重启后令牌变了吗没变。存在 app_settings.api_token,跟随数据卷持久化。除非你删了数据卷
升级后注册页打不开预期行为,公开注册默认关闭。加人请由管理员在「用户管理」创建
wxcode 手机 hook 的 /wxcode/register 报 401已纳入令牌保护,改用静态 WXCODE_URLS 配置
填了令牌后浏览器登不上控制台不会。POST /login(带 username)与登录页始终放行,工作台用会话访问不受令牌限制
数据在哪${DATA_DIR:-./data}/{db,avatars,qr},重启不丢;换位置改 .env 的 DATA_DIR

十二、版本记录

版本内容
v6修复横向越权:按凭据类型区分权限模型(令牌 = 公开 API 不做归属过滤,脚本行为不变;会话 = 控制台,普通用户只能读写自己的账号);/wxcode/* 收窄为「令牌或管理员」
v5安全加固:取码接口 fail-closed(令牌未配置自动生成并落库);/wxcode/* 纳入鉴权;注册默认关闭 + 首个管理员仅限内网注册;登录限速改双通道且默认不信任 X-Forwarded-For;修复 next 参数开放重定向
v4公开接口可选访问令牌(YYB_API_TOKEN);编排拆分为 compose.yaml / compose.build.yaml;GitHub Actions 双架构发布流水线;一键部署脚本 deploy.sh
v3多用户账号隔离:普通用户只看自己扫码添加的账号;账号级「脚本可读」开关控制是否对脚本暴露
v2修复 bind-mount 数据目录权限导致的 SQLite 打不开;/login 无设备时自动回退原生微信登录
v1/login?appId= 兼容 wxcode 接口(设备优先,无设备回退原生);新增 /whoami、/instances 兼容端点;GET /login?appId= 多账号时自动选存活/最近更新账号

本次:登录页新增版本更新记录与个人主页入口;版本号改为构建期注入的动态显示。


十三、两点说明

关于许可与来源:项目内嵌了 wxcode 2.1.0 的 APK 作为可选取码端点,第三方来源与许可说明见仓库根目录 NOTICE.md。使用前请自行确认相关合规要求。

关于数据安全:.env 里 DATA_DIR 指向的目录含微信登录凭据(SQLite 明文),请勿放到可被外部访问的共享目录;公网暴露时建议 --bind 127.0.0.1 + 反代 + HTTPS。

0

评论 (0)

取消