
应用宝协议服务支持扫码登录、账号与 OpenID 管理、wx.login code 获取、Token 自动续期以及 Docker 和青龙部署。
应用宝协议服务支持扫码登录、账号与 OpenID 管理、wx.login code 获取、Token 自动续期以及 Docker 和青龙部署。
主要功能变化请查看 更新日志。
应用宝协议服务增强版,提供微信扫码登录、账号与 OpenID 管理、wx.login code 获取、凭据按需续期、带用户权限的 Web 控制台,以及 Docker 和面板接入。
YYB_SERVER,重复操作不会产生重复账号txt、json、json2 响应/wx/* 和 /wxapp/* 两套兼容接口:小程序 code、用户信息、手机号、加密 Key、云函数、二维码授权、文章会话/扩展数据/点赞scripts/code-collection-share/ 的 136 个 YYB 多账号适配脚本;已去重并脱离上游自动订阅,避免更新覆盖兼容修复授权短链接的历史 URL 使用 YYB_ACCOUNT_LINK_KEY 做 AES-GCM 加密保存。生产环境请设置随机长字符串并在升级时保持不变;不设置时会由管理员初始化配置派生兼容密钥。
账号队列中的“一键整理”仅供管理员使用。系统先列出候选记录,点击确认后才会清理明确没有 login_buffer、凭据且未绑定用户的扫码残留;该操作不会删除正常账号或已过期账号。另有“压缩账号 ID”功能,可预览并将现有账号按当前顺序迁移到连续的 1..N,同时迁移会话、代理、推送、脚本任务和用户归属,并尝试同步青龙 YYB_SERVER;不会删除账号内容。释放的 ID 会在后续成功扫码时自动复用。扫码页刷新二维码和返回时会取消旧会话,避免旧二维码的延迟请求再次写入账号。
打开 GitHub Pages 交互演示 查看纯静态 Demo。页面使用全部虚构的账号、OpenID、代理和时间数据,不会连接真实服务;也可通过 HTMLPreview 备用入口 访问。
运行环境需要 Docker、Docker Compose,以及名为 qinglong_default 的 Docker 网络。如果没有青龙,也可以先创建同名网络:
docker network create qinglong_default
创建本地配置:
cp .env.example .env
公开版本默认使用 SQLite,无需单独部署数据库。编辑 .env 时保留:
YYB_AUTH_DRIVER=sqlite
YYB_AUTH_DSN=
YYB_COOKIE_SECURE=false
认证数据库默认保存为持久化卷中的 resource/db/auth.db。首次打开控制台注册的第一个账号会自动成为管理员,后续注册账号为普通用户。也可以在首次启动前设置 YYB_ADMIN_USER 和 YYB_ADMIN_PASSWORD 来预先创建管理员。
构建并启动:
docker compose up -d --build
默认 Compose 只启动一个 yyb-go 容器,访问地址为 http://服务器IP:8000。Nginx Basic Auth 已由应用内登录页面替代;需要 HTTPS 或公网入口时,请在项目外使用已有反向代理并限制协议接口访问。
扫码页的“推荐代理地区”只在用户点击后运行。HTTPS 页面可在浏览器授权后将坐标发送到 OpenStreetMap Nominatim 做反向地理解析;局域网 HTTP 页面会使用公网 IP 地理服务,无法读取手机 GPS。推荐结果只预填省市,用户仍需确认并应用。
需要复用 MySQL 时,设置以下变量并确保 yyb-go 与 MySQL 容器位于同一 Docker 网络:
YYB_AUTH_DRIVER=mysql
YYB_AUTH_DSN=yyb_go:数据库密码@tcp(mysql:3306)/yyb_go?charset=utf8mb4&parseTime=true&loc=UTC
旧变量 YYB_AUTH_MYSQL_DSN 继续兼容:只设置该变量时会自动选择 MySQL,不会迁移或覆盖已有用户。YYB_AUTH_DRIVER=none 可关闭网页登录认证,仅建议用于受保护的本机调试。YYB_COOKIE_SECURE 仅在 HTTPS 反代下设为 true。
Android ARM64 设备可从 Releases 安装最新版 Magisk 模块。模块由 late_start service 开机常驻运行,不依赖 Termux;默认控制台为 http://127.0.0.1:8000,账号和配置持久化在 /data/adb/yyb-go。v0.2.0 合入新版保活与多账号隔离:临时网络、代理或 DNS 错误不会再误报账号失效,只有微信明确拒绝 refresh token 时才提示重扫。
模块目前只提供 ARM64 构建,不支持 32 位 Android。需要让青龙或呆呆面板访问手机服务时,必须在 /data/adb/yyb-go/config.conf 中配置局域网监听和面板地址;不要把端口暴露到公网。完整安装、升级、DNS 和局域网配置见 Magisk 模块文档。
YYB_ADMIN_USER、YYB_ADMIN_PASSWORD 初始化;未设置时首个注册账号成为管理员。/wx/*、/wxapp/* 保持给青龙脚本调用,不要求浏览器 Cookie;不要直接将这些协议接口暴露到公网。如必须通过公网访问协议接口,请设置 YYB_PROTOCOL_TOKEN,并让脚本在请求中携带 Authorization: Bearer 。设置后 /wx/*、/wxapp/* 的所有自动化调用都会校验该令牌,避免“服务地址@数字 ID”被扫描后直接调用。未设置时保持旧版兼容行为,仍应只在内网或可信反代后使用。
面板同步默认沿用数字 ID 以兼容旧脚本;设置 YYB_QINGLONG_REF_MODE=openid 后,一键同步会写入 地址@OpenID,账号删除、重排不会影响外部引用。重新设为 id 即可切回数字 ID。
项目已添加自动与手动构建 Docker 镜像的 Workflow (.github/workflows/docker-publish.yml),支持打包发布到 GitHub Container Registry (GHCR):
latest)并一键构建发布。main 或推送版本 Tag (如 v1.0.0) 时自动触发镜像构建。linux/amd64, linux/arm64)。go test ./...,测试失败时不会生成或推送镜像。Magisk 模块使用独立的 Build Magisk Module Workflow:服务端、运行前端资源或 Magisk 打包文件变更时会编译并校验 ARM64 安装包;推送 magisk-v0.2.0 这类标签时,会自动创建对应 Release 并上传 ZIP。也可在 Actions 页面手动填写版本并选择是否发布 Release。Docker 与 Magisk 为两条独立任务,一方失败不会阻塞另一方。
Docker 镜像只在服务端代码、运行资源、Go 依赖、Docker 构建文件或对应 workflow 变更时构建;scripts/**、README 和普通文档更新不会再触发镜像更新提示。Magisk 只在服务端代码、运行前端资源、打包文件、Go 依赖或对应 workflow 变更时构建。这样脚本发布不会伪装成 Docker/Magisk 版本更新,但核心服务提交仍会自动验证和构建。
同一 YYB 账号的 wx.login 取码请求会按账号串行化,避免两个青龙任务同时刷新/消费同一账号的短期 code;不同账号仍可并发执行。wx.login code 本身仍是一次性短期凭据,不能在脚本之间复用。
该能力默认关闭,因为桌面微信版本、浏览器本地网络权限和 OAuth Cookie 会话都会影响稳定性。已验证本机环境后可显式开启:
YYB_ENABLE_PC_LOGIN=true
开启后,在 Windows 电脑上打开 YYB Go 的“添加微信账号”页面,页面会尝试连接当前电脑已登录的微信客户端。检测成功后,点击“使用本机微信授权”,在电脑微信中确认即可。
该能力复用了微信开放平台网页授权的 fast_login 流程。浏览器只与本机微信通信,并把微信返回的一次性回调地址交给 YYB Go;账号凭据仍由 YYB Go 服务端换取和保存。服务端会校验回调协议、域名、路径和 state,且快速授权会话只能使用一次。
使用条件与限制:
https://localhost.weixin.qq.com。企业安全策略、浏览器本地网络访问限制或微信版本不支持时,检测会失败。如果只允许某个局域网地址监听,可设置:
YYB_BIND_ADDRESS=192.168.1.10
txt / json / json2 动态 API 代理通常是短效 IP,只适合扫码或临时业务请求,不能作为账号长期保活手段。YYB Go 会在界面上标记“短效代理,不可用于保活”,并跳过这类账号的后台自动保活,避免反复提取 IP 和无效刷新。静态、长效且地区稳定的代理才适合参与保活。
左侧“代理设置”集中管理每个微信账号的独立出口,工作台会显示当前账号的代理摘要;添加账号页面也可先设置登录代理,再生成二维码或发起本机微信授权。登录二维码、OAuth 回调、凭据刷新、用户资料、wx.login、LongLink 和 ShortLink 会使用该账号的同一代理策略。
支持以下配置:
-tcp-proxy,账号显式选择直连后也会覆盖全局值。host:port、user:pass@host:port、host:port:user:pass 或 host:port|user|pass。json / json2;解析器支持常见的 data、result、list、proxy_list、rows、items 等嵌套结构,以及独立的 IP、端口、用户名和密码字段。core-extract 链接,每个账号只关联配置和省市;修改配置链接后,所有关联账号自动生效。授权方式可直接选择“账号密码”或“出口 IP 白名单”,账号密码模式会强制使用 JSON 并读取品赞返回的临时 account/password,不依赖服务器公网 IP。json2 返回的临时 http_user/http_pass;也可切换为自动白名单模式。巨量当前提取接口仅能通过 HTTP 访问,是否启用请结合自己的网络环境判断。动态 API 会在短时间内复用同一代理,避免一段脚本流程反复提取和跳 IP;新代理会先尝试使用现有 login_buffer 建立协议会话,只有腾讯明确拒绝时才刷新 token。账号显式配置的代理若不可用,请求会直接失败,不会静默切换为直连。代理测试同时显示供应商入口节点和实际出口地区,入口机房所在地不等于最终出口所在地。原有 Magisk TCP_PROXY / 服务端 -tcp-proxy 仅作为没有账号配置时的兼容默认值。
同一微信账号重新扫码时只更新凭据并恢复账号状态,已有代理配置、地区和提前刷新时间不会被扫码页的默认直连覆盖。已知失效账号继续显示在工作台,协议调用会在提取动态代理前返回需重扫;重新扫码后自动恢复调用。
代理 API URL 和静态代理认证信息保存在本机协议 SQLite 数据库中。不要把数据库、管理接口或包含密钥的代理 URL 暴露到公网。
服务默认每 1 分钟执行一次轻量数据库检查。直连账号仍在 access token 剩余不足 45 分钟时刷新;使用专属代理的账号默认仅在剩余不足 5 分钟时刷新,可按账号调整为 5 到 90 分钟。数据库检查本身不会调用代理提取 API,默认代理账号通常约 115 分钟才提取一次新代理。该过程不会生成未消费的 wx.login code。
微信服务端可能只更新 access token 而不轮换 refresh token,因此后台保活不能保证 refresh token 永久有效。控制台会记录当前 refresh token 的首次观察时间;连续使用约 25 天后显示“建议重扫”,给可能存在的约 30 天失效窗口预留处理时间。只有微信实际返回不同的 refresh token 时,这个计时才会重置。
可以在 .env 中调整:
YYB_KEEPALIVE_INTERVAL=30m
YYB_KEEPALIVE_AHEAD=45m
将 YYB_KEEPALIVE_INTERVAL 设为 0 可关闭后台保活。提前续期遇到临时网络失败时会保留当前账号状态并在后续周期重试;凭据真正过期或 refresh token 被服务端撤销后会标记为需重扫,并停止保活和协议调用,避免继续消耗动态代理。
控制台密码保护管理页面;POST /wxapp/getCode 和 POST /wx/code 不依赖浏览器 Cookie,也不按调用方是否同机区别处理。只打开 http://服务器IP:8000/ 显示登录页是正常的,根路径不是取码接口。采用本仓库脚本时,YYB_SERVER 每行填写 http://YYB服务器IP:8000@账号ID,不要带 /login、?ref=... 或重复的接口路径。
请在实际执行脚本的容器内检查下面两个请求(地址换成你的 YYB 地址):
curl -i --max-time 10 http://YYB服务器IP:8000/health
curl -i --max-time 10 -X POST http://YYB服务器IP:8000/wxapp/getCode \
-H 'Content-Type: application/json' -d '{}'
预期分别为 200 JSON 和 400 JSON(ref is required);第二个请求只验证路由,不实际生成 code。正式请求体是 {"ref":"账号ID","app_id":"目标小程序AppID"}。异机部署不能使用另一台机器的 Docker 容器名 yyb-go 或 127.0.0.1。
303 / 302 跳转 /login 或最终收到 HTML:检查脚本最终请求 URL、旧版本及反向代理路径改写。诊断时不要添加 curl -L,避免自动跟随跳转隐藏原因。404 JSON:接口路径不匹配,注意 getCode 大小写;405 JSON:取码应使用 POST。401 JSON 来自 /accounts 等管理接口:这类接口仍需要网页登录,脚本读取备注失败应独立处理,不要阻断公共取码流程。无需为了异机调用关闭控制台登录。公共协议接口应限制在可信内网、VPN 或调用服务器 IP 白名单内;控制台密码本身不保护这些公共取码接口。
支持对接 青龙面板 (Qinglong)、呆呆面板 (daidai-panel) 与 Arcadia:
Client ID / Client Secret;呆呆面板使用 App Key / App Secret)。配置会持久化到 SQLite 数据库并优先于容器环境变量。404 或 405,系统会尝试另一种驱动;识别成功后使用正确的面板类型。PANEL_TYPE=qinglong
QL_URL=http://qinglong:5700
QL_CLIENT_ID=你的青龙ClientID
QL_CLIENT_SECRET=你的青龙ClientSecret
PANEL_TYPE=daidai
DAIDAI_URL=http://daidai-panel:5700
DAIDAI_APP_KEY=你的呆呆面板AppKey
DAIDAI_APP_SECRET=你的呆呆面板AppSecret
PANEL_TYPE=arcadia
ARCADIA_URL=http://arcadia:5678
ARCADIA_TOKEN=你的Arcadia_OpenAPI_Token
在 Arcadia 的 OpenAPI 令牌中启用 env:query、env:manage、cron:query、cron:manage、cron:run、file:list 和 file:read 权限。Arcadia 不持久化定时任务 stdout,YYB 创建的账号独立任务会将日志写入 /arcadia/log/yyb_account_*,再通过 File OpenAPI 回读;现有 Arcadia 任务不会被改写。三种面板的地址和凭据在控制台中按类型分别保存。切换面板类型只会切换当前运行面板,不会覆盖其他面板配置;Arcadia 账号独立任务的日志读取失败会直接显示面板返回的具体错误。
升级前已经使用青龙的部署不需要迁移配置,原有 QL_URL、QL_CLIENT_ID 和 QL_CLIENT_SECRET 会继续生效。面板适配层会分别处理三种面板的任务启停、运行状态与日志接口,避免混用不同的状态字段。
扫码成功页和账号控制台都提供“添加/同步到面板”按钮。同步会保留 YYB_SERVER 中已有的多行内容和环境变量备注,只追加缺少的账号,并同时识别账号 ID 与 OpenID,避免重复添加。
当面板和本服务都连接到 qinglong_default 网络后,面板环境变量可以填写:
YYB_SERVER=yyb-go:8000@1
@ 后可以使用控制台显示的账号 ID 或 OpenID。账号 ID 是本地数据库编号,删除并重新添加账号后可能变化;OpenID 更适合长期配置。
使用 OpenID 时要填写控制台显示的完整值,OpenID 只是说明文字,不能原样照填。例如:
YYB_SERVER=yyb-go:8000@owNAxxxxxxxxxxxxxxxxxxxxxxxx
POST /wx/oauth 只负责生成微信公众号网页授权链接,响应中的 code 在授权前固定为 null。用户必须在微信内打开 full_url 并同意授权,微信随后才会请求你填写的 redirect_uri?code=...&state=...;请在自己的回调页面读取这两个查询参数。YYB Go 无法替第三方公众号提前生成或截取该一次性 code。
已确认报错的青龙/呆呆面板脚本修复版收录在 scripts/。
scripts/yyb_account_guard.py 与 scripts/yyb-account-guard.js 为所有青龙
YYB 脚本提供共享的账号状态缓存,默认写入 /ql/data/config/yyb_account_status.json。
已接入爱玛、极兔、比亚迪海洋、都市甜心、DT 生活和慕斯脚本:明确的“未授权手机号、
未注册会员、未绑定小程序”等业务响应会冷却该账号,后续任务直接跳过并继续下一个;
超时、502/503、风控、活动太火爆、登录过期和 token 失效不会被误判为永久未注册。
青龙中新增 YYB账号状态检查.py(建议 17 */12 * * *)维护缓存。由于开启网页登录
认证后 /accounts 不能被青龙匿名读取,该任务只探测 YYB /healthz 并清理不在
YYB_SERVER 的缓存条目,不调用业务小程序接口,不产生未消费的 wx.login code。需要执行
手机号授权/自动注册流程的脚本可设置 YYB_GUARD_BYPASS=1 临时绕过公共过滤。
可选环境变量:
YYB_ACCOUNT_STATUS_FILE=/ql/data/config/yyb_account_status.json
YYB_GUARD_BYPASS=0
scripts/jmychongdian.py 将积分活动、可选的 1 元额度兑换和充电功率守护串成一个青龙任务。自动兑换默认关闭,只有显式设置 JMY_AUTO_EXCHANGE=1 才会兑换。它会先通过 YYB_SERVER 获取积分小程序 code,再调用积分 GraphQL;充电页仍需要 H5 的 mobile_user/XKSESSION Cookie。两套凭证不是同一个登录态,不能只填 YYB code。
最小配置示例(敏感值只放青龙环境变量):
YYB_SERVER=yyb-go:8000@1
JMY_GRAPHQL_TOKEN=Bearer 你的积分Token
JMY_COOKIE=mobile_user=...; XKSESSION=...
JMY_DEV_ID=扫码页面得到的dev_id
JMY_SOCKET_ID=扫码页面得到的socket_id
JMY_EXCHANGE_THRESHOLD=1000
需要多账号时使用 JMY_ACCOUNTS_JSON 数组;默认只对第一个账号执行充电,积分仍逐账号处理。确认兑换接口已能由自建服务用 code 换取会话后,可设置 JMY_CODE_EXCHANGE_URL,返回 JSON 中的 token/cookie/dev_id/socket_id 会自动接管后续流程。JMY_DRY_RUN=1 可只验证配置而不触发积分、兑换和充电请求。
暂无开放 Issues,或尚未同步最近议题。