From 121f9cb648c8bea9f3439e18bad3e2e7b909f1be Mon Sep 17 00:00:00 2001 From: Vincent Corleone Date: Mon, 14 Sep 2026 15:46:24 +0800 Subject: [PATCH 1/2] fix(weixin-bridge): define Quick Start in the README and implement it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Define a Quick Start section in integrations/weixin-bridge/README.md modeled on integrations/wecom-bridge/DEPLOYMENT.md, and then implement the behavior that section describes. The README previously pointed at a non-existent /opt/codewhale/weixin-bot-bridge path, gave no runtime startup command, and named an env file that nothing reads; a first-time user could not get the bridge running, and once it did run the first incoming message failed with EACCES and was dropped without an actionable error. README: - Add Quick Start with the two-terminal flow (start `codewhale serve --http`, then the bridge) and a single-terminal launcher, following the WeCom deployment guide's shape. - Add "在微信中验证": send /status, and document both real outcomes — the authorized reply and the refusal that carries the user_id needed for pairing. - Document the message dedupe (`user_id:message_id`) so re-testing uses a new message. - Correct the fabricated /opt/codewhale/weixin-bot-bridge path and env filename, and note that the bridge reads process.env rather than a .env file. Implement the definition: - Default WEIXIN_THREAD_MAP_PATH inside WEIXIN_STATE_DIR. Setting only WEIXIN_STATE_DIR left the thread map at /var/lib/codewhale-weixin-bot-bridge, so every incoming message failed on write; the exception was swallowed by the getUpdates catch and the message was silently dropped. - Create the state dir in saveSyncBuf, matching saveAccount. The poll cursor can be the first persisted write on a fresh install. - Probe thread-map writability at startup and exit with a readable message instead of failing later inside the message loop. - Log the resolved thread map path next to the state dir. Make the login QR scannable in place: - Add src/qr.mjs, a zero-dependency byte-mode QR encoder (versions 1-10, ECC level L) rendered with half-block glyphs, matching the Rust side's Dense1x2 renderer (crates/tui/src/runtime_api.rs). The bridge keeps its no-npm-deps property. - Keep printing the URL below the QR so a terminal that mangles half-block glyphs still has a path through. Single-terminal launcher: - scripts/dev-up.sh plus `npm run bridge` start the runtime and the bridge in one terminal, generate a shared CODEWHALE_RUNTIME_TOKEN, wait for /health, and clean up the runtime on Ctrl-C. Ignore bridge state and re-include bridge launchers: - integrations/*-bridge/.state/ holds the live bot token (account.json) and the poll cursor. - `*.sh` was hiding integrations/*/scripts/, which would have shipped a package.json pointing at a file that never landed. Verification: - npm --prefix integrations/weixin-bridge run check - npm --prefix integrations/weixin-bridge test (12 passed) - npm run bridge logged in by QR and replied to /status from a real WeChat account; the thread map and poll cursor landed under WEIXIN_STATE_DIR. - Terminal QR output decoded back to the exact login URL with OpenCV (9/9 payloads, including UTF-8). Co-Authored-By: DeepSeek-V41-Flash --- .gitignore | 7 + integrations/weixin-bridge/README.md | 112 ++++- integrations/weixin-bridge/package.json | 3 +- integrations/weixin-bridge/scripts/dev-up.sh | 75 +++ integrations/weixin-bridge/src/index.mjs | 39 +- integrations/weixin-bridge/src/qr.mjs | 495 +++++++++++++++++++ integrations/weixin-bridge/test/qr.test.mjs | 99 ++++ 7 files changed, 822 insertions(+), 8 deletions(-) create mode 100755 integrations/weixin-bridge/scripts/dev-up.sh create mode 100644 integrations/weixin-bridge/src/qr.mjs create mode 100644 integrations/weixin-bridge/test/qr.test.mjs diff --git a/.gitignore b/.gitignore index 70d8b2f739..1f21fb67db 100644 --- a/.gitignore +++ b/.gitignore @@ -67,6 +67,9 @@ docs/*.pdf !.github/scripts/** !web/public/install.sh !packaging/winget/** +# Bridge launchers are shipped entry points (`npm run bridge`), not local dev +# scripts; `!scripts/**` above only re-includes the repo-root scripts/ dir. +!integrations/*/scripts/** test.txt TODO*.md todo*.md @@ -93,6 +96,10 @@ project_overhaul_prompt.md .deepseek/ **/session_*.json *.db + +# Chat bridge local state. `npm run bridge` writes the Weixin bot login token +# (account.json) and the long-poll cursor here; these are live credentials. +integrations/*-bridge/.state/ npm/*/bin/downloads/ # Companion app (tracked separately) diff --git a/integrations/weixin-bridge/README.md b/integrations/weixin-bridge/README.md index 4a853231d2..4740ce7da0 100644 --- a/integrations/weixin-bridge/README.md +++ b/integrations/weixin-bridge/README.md @@ -16,13 +16,115 @@ - 工具审批通过文本命令:`/allow ` 或 `/deny `。 - bridge 主动向微信服务器发起长轮询请求,无需公网端口。 +## Quick Start + +使用两个终端。在第一个终端启动本地 runtime: + +```bash +export CODEWHALE_RUNTIME_TOKEN="$(openssl rand -hex 32)" +codewhale serve --http --host 127.0.0.1 --port 7878 --auth-token "$CODEWHALE_RUNTIME_TOKEN" +``` + +在第二个终端启动 bridge: + +```bash +cd integrations/weixin-bridge +export CODEWHALE_RUNTIME_TOKEN="<与上面相同的 token>" +export WEIXIN_ALLOW_UNLISTED=true +npm start +``` + +### 单终端启动 + +如果不想开两个终端、也不想手动传递 token,用 `npm run bridge`: + +```bash +cd integrations/weixin-bridge +npm run bridge +``` + +它会自动生成一个 `CODEWHALE_RUNTIME_TOKEN`,在后台启动 `codewhale serve --http`, +等 `/health` 返回正常后再以前台方式启动 bridge,两者共用同一个 token。 +按 `Ctrl-C` 会同时停止 bridge 和 runtime。 + +可用环境变量覆盖默认值: + +| 变量 | 默认值 | 说明 | +|------|--------|------| +| `CODEWHALE_RUNTIME_PORT` | `7878` | runtime 监听端口 | +| `CODEWHALE_RUNTIME_TOKEN` | 自动生成 | 复用已有 token 时设置 | +| `WEIXIN_ALLOW_UNLISTED` | `true` | 首次配对模式 | +| `WEIXIN_STATE_DIR` | `./.state` | 状态目录(单终端模式默认写入仓库内,避免 `/var/lib` 权限问题) | + +例如换端口并复用已有 token: + +```bash +CODEWHALE_RUNTIME_PORT=7999 CODEWHALE_RUNTIME_TOKEN="$MY_TOKEN" npm run bridge +``` + +首次启动会用文本二维码直接在终端打印登录二维码,用微信扫码即可: + +```text +请用微信扫描以下二维码登录: + █▀▀▀▀▀█ █ ▄▄█▀▀▀ ▄▄█▄▀▀▀▀ ▀▄ █▀▀▀▀▀█ + █ ███ █ ██▄ █▄▀█▀▀▄▀▄▀ █▄ █ ▄ █ ███ █ + ... + ▀▀▀▀▀▀▀ ▀▀▀▀ ▀▀ ▀▀▀▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀ +``` + +二维码下方同时打印原始 URL,便于在二维码显示异常(字体缺字、终端不支持半块字符) +时手动打开。二维码在本地生成,不会经由第三方服务。 + +登录凭证(`bot_token`)会自动保存到 `WEIXIN_STATE_DIR`,后续启动无需重新扫码。 +线程映射与长轮询游标也写入同一目录,该目录会在启动时自动创建并先做一次可写性 +探测 —— 不可写时 bridge 会立即报错退出,而不是等到你发消息后才失败。 +扫码授权窗口为 5 分钟,超时需重启 bridge 重新获取。 + +### 在微信中验证 + +登录成功后,**在微信里给这个 bot 发一条 `/status`**。收到回复即表示链路已打通 +(bridge 已连上微信、runtime 也可达)。没有收到回复时不要继续后面的步骤, +先按终端输出的报错排查。 + +回复内容有两种: + +- 已授权(`WEIXIN_ALLOW_UNLISTED=true`,或你已在白名单里)→ 返回 runtime 与工作区状态。 +- 未授权 → 返回拒绝消息,其中**带有你的 `user_id`**: + + ```text + This WeChat user is not in WEIXIN_CHAT_ALLOWLIST. + user_id=<你的 user_id> + + For first pairing, add this user_id to WEIXIN_CHAT_ALLOWLIST, + or temporarily set WEIXIN_ALLOW_UNLISTED=true. + ``` + +拿到 `user_id` 后写入白名单并关闭配对模式: + +```bash +export WEIXIN_CHAT_ALLOWLIST="<上一步返回的 user_id>" +export WEIXIN_ALLOW_UNLISTED=false +npm start +``` + +之后不带 `/` 前缀的任意文本都会作为 prompt 发给 runtime,回复会发回微信。 + +> 注意:同一条微信消息只会被处理一次(bridge 按 `user_id:message_id` 去重)。 +> 重新测试时请发送**新消息**,重发旧消息不会有任何反应。 + +注意:bridge **不读取 `.env` 文件**,也不读取 `/etc/codewhale/*.env`(那些是给 systemd +`EnvironmentFile=` 用的)。手动运行时环境变量必须通过 `export` 传入,或使用 +`node --env-file=.env src/index.mjs`。 + ## 设置 +systemd 部署时,把环境变量写入 env 文件并由单元引用: + ```bash -cd /opt/codewhale/weixin-bot-bridge +cd integrations/weixin-bridge npm install --omit=dev -cp .env.example /etc/codewhale/weixin-bot-bridge.env -sudoedit /etc/codewhale/weixin-bot-bridge.env +cp .env.example /etc/codewhale/weixin-bridge.env +sudoedit /etc/codewhale/weixin-bridge.env node src/index.mjs ``` @@ -62,8 +164,8 @@ node src/index.mjs | `CODEWHALE_MODE` | 否 | 运行模式(默认 `agent`) | | `WEIXIN_CHAT_ALLOWLIST` | 否 | 逗号分隔的允许用户 ID | | `WEIXIN_ALLOW_UNLISTED` | 否 | 首次配对模式(默认 `false`) | -| `WEIXIN_STATE_DIR` | 否 | 状态持久化目录 | -| `WEIXIN_THREAD_MAP_PATH` | 否 | 线程映射文件路径 | +| `WEIXIN_STATE_DIR` | 否 | 状态持久化目录(默认 `/var/lib/codewhale-weixin-bot-bridge`) | +| `WEIXIN_THREAD_MAP_PATH` | 否 | 线程映射文件路径(默认 `/thread-map.json`) | | `WEIXIN_MAX_REPLY_CHARS` | 否 | 单条回复最大字符数(默认 `3500`) | | `CODEWHALE_TURN_TIMEOUT_MS` | 否 | Turn 超时(默认 `900000`) | | `WEIXIN_LONGPOLL_TIMEOUT_MS` | 否 | 长轮询超时(默认 `35000`) | diff --git a/integrations/weixin-bridge/package.json b/integrations/weixin-bridge/package.json index 5556b33514..a61ac6d214 100644 --- a/integrations/weixin-bridge/package.json +++ b/integrations/weixin-bridge/package.json @@ -7,7 +7,8 @@ "main": "src/index.mjs", "scripts": { "start": "node src/index.mjs", - "check": "node --check src/index.mjs && node --check src/lib.mjs", + "bridge": "bash scripts/dev-up.sh", + "check": "node --check src/index.mjs && node --check src/lib.mjs && node --check src/qr.mjs && bash -n scripts/dev-up.sh", "test": "node --test test/*.test.mjs" }, "engines": { diff --git a/integrations/weixin-bridge/scripts/dev-up.sh b/integrations/weixin-bridge/scripts/dev-up.sh new file mode 100755 index 0000000000..8537924acc --- /dev/null +++ b/integrations/weixin-bridge/scripts/dev-up.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash +# Start a local Codewhale runtime and the Weixin bridge in one terminal. +# +# Generates a shared CODEWHALE_RUNTIME_TOKEN, starts `codewhale serve --http` in +# the background, waits for it to answer /health, then runs the bridge in the +# foreground. Both processes share the generated token, so no copy/paste. +# +# Ctrl-C stops both. Override defaults with the env vars below: +# CODEWHALE_RUNTIME_PORT runtime port (default 7878) +# CODEWHALE_RUNTIME_TOKEN reuse an existing token (default: generated) +# WEIXIN_ALLOW_UNLISTED first-pairing mode (default true) +# WEIXIN_STATE_DIR state directory (default: ./.state) + +set -euo pipefail + +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +bridge_dir="$(cd "$script_dir/.." && pwd)" + +port="${CODEWHALE_RUNTIME_PORT:-7878}" +runtime_url="http://127.0.0.1:${port}" + +if [[ -z "${CODEWHALE_RUNTIME_TOKEN:-}" ]]; then + CODEWHALE_RUNTIME_TOKEN="$(openssl rand -hex 32)" + echo "Generated CODEWHALE_RUNTIME_TOKEN for this session." +fi +export CODEWHALE_RUNTIME_TOKEN + +export CODEWHALE_RUNTIME_URL="$runtime_url" +export WEIXIN_ALLOW_UNLISTED="${WEIXIN_ALLOW_UNLISTED:-true}" +export WEIXIN_STATE_DIR="${WEIXIN_STATE_DIR:-$bridge_dir/.state}" + +runtime_pid="" + +cleanup() { + if [[ -n "$runtime_pid" ]] && kill -0 "$runtime_pid" 2>/dev/null; then + echo "" + echo "Stopping runtime (pid $runtime_pid)..." + kill "$runtime_pid" 2>/dev/null || true + wait "$runtime_pid" 2>/dev/null || true + fi +} +trap cleanup EXIT INT TERM + +echo "Starting runtime on $runtime_url ..." +codewhale serve --http \ + --host 127.0.0.1 \ + --port "$port" \ + --auth-token "$CODEWHALE_RUNTIME_TOKEN" & +runtime_pid=$! + +# Wait for /health before handing over to the bridge, so the first pairing +# message does not race a runtime that has not bound its port yet. +for _ in $(seq 1 60); do + if curl -fsS "$runtime_url/health" >/dev/null 2>&1; then + break + fi + if ! kill -0 "$runtime_pid" 2>/dev/null; then + echo "Runtime exited before becoming healthy." >&2 + exit 1 + fi + sleep 0.5 +done + +if ! curl -fsS "$runtime_url/health" >/dev/null 2>&1; then + echo "Runtime did not become healthy at $runtime_url/health within 30s." >&2 + exit 1 +fi + +echo "Runtime is healthy. Starting Weixin bridge..." +echo "Allow-unlisted (first pairing): $WEIXIN_ALLOW_UNLISTED" +echo "State dir: $WEIXIN_STATE_DIR" +echo "" + +cd "$bridge_dir" +node src/index.mjs diff --git a/integrations/weixin-bridge/src/index.mjs b/integrations/weixin-bridge/src/index.mjs index 15a7c09b3a..a3110e0aad 100644 --- a/integrations/weixin-bridge/src/index.mjs +++ b/integrations/weixin-bridge/src/index.mjs @@ -24,6 +24,7 @@ import { activeTurnBlock, helpText, } from "./lib.mjs"; +import { renderQrToText } from "./qr.mjs"; import { ThreadStore as CoreThreadStore } from "../../bridge-core/src/lib.mjs"; // ============================================================================ @@ -163,9 +164,15 @@ const config = { stateDir: weixinEnv("WEIXIN_STATE_DIR") || "/var/lib/codewhale-weixin-bot-bridge", + // Defaults inside stateDir rather than to a second absolute path: setting + // only WEIXIN_STATE_DIR must not leave the thread map pointing at /var/lib, + // which fails with EACCES on every incoming message and silently drops it. threadMapPath: weixinEnv("WEIXIN_THREAD_MAP_PATH") || - "/var/lib/codewhale-weixin-bot-bridge/thread-map.json", + path.join( + weixinEnv("WEIXIN_STATE_DIR") || "/var/lib/codewhale-weixin-bot-bridge", + "thread-map.json" + ), maxReplyChars: Number(weixinEnv("WEIXIN_MAX_REPLY_CHARS") || 3500), longPollTimeoutMs: Number( weixinEnv("WEIXIN_LONGPOLL_TIMEOUT_MS") || 35000 @@ -708,6 +715,9 @@ async function loadSyncBuf(stateDir) { async function saveSyncBuf(stateDir, buf) { const p = resolveSyncBufPath(stateDir); + // The state dir may not exist yet on a first run whose first persisted write + // is the poll cursor rather than account.json. + await fs.mkdir(path.dirname(p), { recursive: true, mode: 0o700 }); const tmp = `${p}.tmp`; await fs.writeFile(tmp, buf, { mode: 0o600 }); await fs.rename(tmp, p); @@ -870,8 +880,26 @@ async function main() { console.log(`Runtime: ${config.runtimeUrl}`); console.log(`Workspace: ${config.workspace}`); console.log(`State dir: ${config.stateDir}`); + console.log(`Thread map: ${config.threadMapPath}`); - // 初始化 ThreadStore + // 初始化 ThreadStore。`open()` 只读,真正的写入发生在第一条消息到达时; + // 那时失败会被 getUpdates 的 catch 吞掉,表现为“微信没有回应”。所以这里 + // 先建目录并真实写一次探针文件,把问题在启动时就暴露出来。 + try { + const dir = path.dirname(config.threadMapPath); + await fs.mkdir(dir, { recursive: true, mode: 0o700 }); + const probe = path.join(dir, ".write-probe"); + await fs.writeFile(probe, "", { mode: 0o600 }); + await fs.rm(probe, { force: true }); + } catch (error) { + console.error( + `Thread map directory is not writable: ${path.dirname(config.threadMapPath)} (${error.message})` + ); + console.error( + "Set WEIXIN_STATE_DIR (or WEIXIN_THREAD_MAP_PATH) to a writable directory." + ); + process.exit(1); + } threadStore = await ThreadStore.open(config.threadMapPath); // 尝试加载已有账号 @@ -888,6 +916,13 @@ async function main() { const { qrcodeUrl, sessionKey } = await getLoginQR(); console.log("请用微信扫描以下二维码登录:"); + // Render the login URL as a scannable terminal QR. The URL is printed too, + // so a terminal that mangles the half-block glyphs still has a way through. + try { + if (qrcodeUrl) console.log(renderQrToText(qrcodeUrl)); + } catch (error) { + console.warn(`Could not render QR in terminal: ${error.message}`); + } console.log(qrcodeUrl); console.log(""); diff --git a/integrations/weixin-bridge/src/qr.mjs b/integrations/weixin-bridge/src/qr.mjs new file mode 100644 index 0000000000..a19cbd1b3f --- /dev/null +++ b/integrations/weixin-bridge/src/qr.mjs @@ -0,0 +1,495 @@ +// QR code encoder — byte mode, versions 1-10, error correction level L. +// +// Zero-dependency, so the Weixin bridge keeps its no-npm-deps property. The +// login URL is ASCII (~70 bytes), which fits version 4-5 at ECC L; versions up +// to 10 are supported for headroom. +// +// Rendered the same way the Rust side does it +// (`qrcode::render::unicode::Dense1x2` in crates/tui/src/runtime_api.rs): +// two QR rows per text row using half-block glyphs. + +// --- Galois field GF(256) tables for Reed-Solomon ------------------------- + +const EXP = new Uint8Array(512); +const LOG = new Uint8Array(256); +(() => { + let x = 1; + for (let i = 0; i < 255; i++) { + EXP[i] = x; + LOG[x] = i; + x <<= 1; + if (x & 0x100) x ^= 0x11d; + } + for (let i = 255; i < 512; i++) EXP[i] = EXP[i - 255]; +})(); + +function gfMul(a, b) { + if (a === 0 || b === 0) return 0; + return EXP[LOG[a] + LOG[b]]; +} + +/** Reed-Solomon generator polynomial of the given degree. */ +function rsGenerator(degree) { + let poly = [1]; + for (let i = 0; i < degree; i++) { + const next = new Array(poly.length + 1).fill(0); + for (let j = 0; j < poly.length; j++) { + next[j] ^= gfMul(poly[j], 1); + next[j + 1] ^= gfMul(poly[j], EXP[i]); + } + poly = next; + } + return poly; +} + +/** Compute `ecLength` Reed-Solomon error correction bytes for `data`. */ +function rsEncode(data, ecLength) { + const gen = rsGenerator(ecLength); + const result = new Array(ecLength).fill(0); + for (const byte of data) { + const factor = byte ^ result[0]; + result.shift(); + result.push(0); + for (let i = 0; i < ecLength; i++) { + result[i] ^= gfMul(gen[i + 1], factor); + } + } + return result; +} + +// --- Version tables -------------------------------------------------------- + +// [ecCodewordsPerBlock, [[blockCount, dataCodewordsPerBlock], ...]] +// Error correction level L only. +const VERSION_TABLE = { + 1: [7, [[1, 19]]], + 2: [10, [[1, 34]]], + 3: [15, [[1, 55]]], + 4: [20, [[1, 80]]], + 5: [26, [[1, 108]]], + 6: [18, [[2, 68]]], + 7: [20, [[2, 78]]], + 8: [24, [[2, 97]]], + 9: [30, [[2, 116]]], + 10: [18, [[2, 68], [2, 69]]], +}; + +const ALIGNMENT_POSITIONS = { + 1: [], + 2: [6, 18], + 3: [6, 22], + 4: [6, 26], + 5: [6, 30], + 6: [6, 34], + 7: [6, 22, 38], + 8: [6, 24, 42], + 9: [6, 26, 46], + 10: [6, 28, 50], +}; + +/** Total data codewords available at level L for a version. */ +function dataCapacity(version) { + const [, blocks] = VERSION_TABLE[version]; + return blocks.reduce((sum, [count, size]) => sum + count * size, 0); +} + +// --- Bit buffer ------------------------------------------------------------ + +class BitBuffer { + constructor() { + this.bits = []; + } + put(value, length) { + for (let i = length - 1; i >= 0; i--) { + this.bits.push((value >>> i) & 1); + } + } + get length() { + return this.bits.length; + } +} + +// --- Encoding -------------------------------------------------------------- + +function chooseVersion(byteLength) { + for (const version of Object.keys(VERSION_TABLE).map(Number).sort((a, b) => a - b)) { + // 4 bits mode + 8 or 16 bits length + payload, then terminator headroom. + const lengthBits = version < 10 ? 8 : 16; + const needed = 4 + lengthBits + byteLength * 8; + if (needed <= dataCapacity(version) * 8) return version; + } + throw new Error(`qr: payload too long for supported versions (${byteLength} bytes)`); +} + +function buildCodewords(bytes, version) { + const capacity = dataCapacity(version); + const buf = new BitBuffer(); + buf.put(0b0100, 4); // byte mode + buf.put(bytes.length, version < 10 ? 8 : 16); + for (const byte of bytes) buf.put(byte, 8); + + // Terminator, then pad to a byte boundary. + const maxBits = capacity * 8; + buf.put(0, Math.min(4, maxBits - buf.length)); + while (buf.length % 8 !== 0) buf.bits.push(0); + + const data = []; + for (let i = 0; i < buf.length; i += 8) { + let byte = 0; + for (let j = 0; j < 8; j++) byte = (byte << 1) | buf.bits[i + j]; + data.push(byte); + } + // Alternating pad bytes. + const pads = [0xec, 0x11]; + for (let i = 0; data.length < capacity; i++) data.push(pads[i % 2]); + + // Split into blocks, add EC, then interleave. + const [ecPerBlock, blockSpec] = VERSION_TABLE[version]; + const dataBlocks = []; + const ecBlocks = []; + let offset = 0; + for (const [count, size] of blockSpec) { + for (let b = 0; b < count; b++) { + const block = data.slice(offset, offset + size); + offset += size; + dataBlocks.push(block); + ecBlocks.push(rsEncode(block, ecPerBlock)); + } + } + + const out = []; + const maxData = Math.max(...dataBlocks.map((b) => b.length)); + for (let i = 0; i < maxData; i++) { + for (const block of dataBlocks) if (i < block.length) out.push(block[i]); + } + for (let i = 0; i < ecPerBlock; i++) { + for (const block of ecBlocks) out.push(block[i]); + } + return out; +} + +// --- Matrix construction --------------------------------------------------- + +function makeMatrix(version) { + const size = version * 4 + 17; + const modules = Array.from({ length: size }, () => new Array(size).fill(null)); + const reserved = Array.from({ length: size }, () => new Array(size).fill(false)); + + const setFinder = (row, col) => { + for (let r = -1; r <= 7; r++) { + for (let c = -1; c <= 7; c++) { + const rr = row + r; + const cc = col + c; + if (rr < 0 || rr >= size || cc < 0 || cc >= size) continue; + const inRing = r >= 0 && r <= 6 && c >= 0 && c <= 6; + const dark = + inRing && (r === 0 || r === 6 || c === 0 || c === 6 || (r >= 2 && r <= 4 && c >= 2 && c <= 4)); + modules[rr][cc] = dark ? 1 : 0; + reserved[rr][cc] = true; + } + } + }; + + setFinder(0, 0); + setFinder(0, size - 7); + setFinder(size - 7, 0); + + // Alignment patterns. + const positions = ALIGNMENT_POSITIONS[version]; + for (const row of positions) { + for (const col of positions) { + // Skip the three finder corners. + const nearFinder = + (row <= 8 && col <= 8) || + (row <= 8 && col >= size - 9) || + (row >= size - 9 && col <= 8); + if (nearFinder) continue; + for (let r = -2; r <= 2; r++) { + for (let c = -2; c <= 2; c++) { + const dark = Math.max(Math.abs(r), Math.abs(c)) !== 1; + modules[row + r][col + c] = dark ? 1 : 0; + reserved[row + r][col + c] = true; + } + } + } + } + + // Timing patterns. + for (let i = 8; i < size - 8; i++) { + if (!reserved[6][i]) { + modules[6][i] = i % 2 === 0 ? 1 : 0; + reserved[6][i] = true; + } + if (!reserved[i][6]) { + modules[i][6] = i % 2 === 0 ? 1 : 0; + reserved[i][6] = true; + } + } + + // Dark module + reserve format areas. + modules[size - 8][8] = 1; + reserved[size - 8][8] = true; + for (let i = 0; i < 9; i++) { + if (!reserved[8][i]) reserved[8][i] = true; + if (!reserved[i][8]) reserved[i][8] = true; + } + for (let i = 0; i < 8; i++) { + reserved[8][size - 1 - i] = true; + reserved[size - 1 - i][8] = true; + } + + // Reserve version info for version >= 7. + if (version >= 7) { + for (let i = 0; i < 6; i++) { + for (let j = 0; j < 3; j++) { + reserved[size - 11 + j][i] = true; + reserved[i][size - 11 + j] = true; + } + } + } + + return { size, modules, reserved }; +} + +function placeData(matrix, codewords) { + const { size, modules, reserved } = matrix; + let bitIndex = 0; + const totalBits = codewords.length * 8; + const nextBit = () => { + if (bitIndex >= totalBits) return 0; + const byte = codewords[bitIndex >> 3]; + const bit = (byte >>> (7 - (bitIndex & 7))) & 1; + bitIndex++; + return bit; + }; + + // Two-module-wide columns, right to left, alternating up/down. The vertical + // timing column (6) is skipped by shifting the whole pair left by one, which + // is why the guard is `<= 6` rather than `=== 6`: once the pair straddles the + // timing column every subsequent column is offset. + let upward = true; + for (let col = size - 1; col > 0; col -= 2) { + if (col <= 6) col -= 1; + for (let i = 0; i < size; i++) { + const row = upward ? size - 1 - i : i; + for (const c of [col, col - 1]) { + if (reserved[row][c]) continue; + modules[row][c] = nextBit(); + } + } + upward = !upward; + } +} + +function applyMask(modules, reserved, maskId) { + const size = modules.length; + return modules.map((row, r) => + row.map((value, c) => { + if (reserved[r][c]) return value; + let invert; + switch (maskId) { + case 0: invert = (r + c) % 2 === 0; break; + case 1: invert = r % 2 === 0; break; + case 2: invert = c % 3 === 0; break; + case 3: invert = (r + c) % 3 === 0; break; + case 4: invert = (Math.floor(r / 2) + Math.floor(c / 3)) % 2 === 0; break; + case 5: invert = ((r * c) % 2) + ((r * c) % 3) === 0; break; + case 6: invert = (((r * c) % 2) + ((r * c) % 3)) % 2 === 0; break; + default: invert = (((r + c) % 2) + ((r * c) % 3)) % 2 === 0; break; + } + return invert ? value ^ 1 : value; + }) + ); +} + +function penalty(modules) { + const size = modules.length; + let score = 0; + // Rule 1: runs of 5+ same-colour modules. + for (let r = 0; r < size; r++) { + for (const dir of ["row", "col"]) { + let run = 1; + for (let i = 1; i < size; i++) { + const prev = dir === "row" ? modules[r][i - 1] : modules[i - 1][r]; + const cur = dir === "row" ? modules[r][i] : modules[i][r]; + if (cur === prev) { + run++; + } else { + if (run >= 5) score += 3 + (run - 5); + run = 1; + } + } + if (run >= 5) score += 3 + (run - 5); + } + } + // Rule 2: 2x2 blocks. + for (let r = 0; r < size - 1; r++) { + for (let c = 0; c < size - 1; c++) { + const v = modules[r][c]; + if (v === modules[r][c + 1] && v === modules[r + 1][c] && v === modules[r + 1][c + 1]) { + score += 3; + } + } + } + // Rule 3: the two ISO/IEC 18004 finder-like patterns, each 11 modules long: + // pattern1: 10111010000 + // pattern2: 00001011101 + // Matching these exactly matters — a looser check selects a different mask + // than reference encoders, producing a valid-looking but different matrix. + const PATTERN1 = [1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0]; + const PATTERN2 = [0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1]; + const scanForFinderLike = (get) => { + let hits = 0; + for (let start = 0; start + 11 <= size; start++) { + let p1 = true; + let p2 = true; + for (let i = 0; i < 11; i++) { + const v = get(start + i); + if (v !== PATTERN1[i]) p1 = false; + if (v !== PATTERN2[i]) p2 = false; + if (!p1 && !p2) break; + } + if (p1 || p2) hits++; + } + return hits; + }; + for (let r = 0; r < size; r++) { + score += 40 * scanForFinderLike((i) => modules[r][i]); + } + for (let c = 0; c < size; c++) { + score += 40 * scanForFinderLike((i) => modules[i][c]); + } + // Rule 4: dark-module balance. + let dark = 0; + for (const row of modules) for (const v of row) dark += v; + const percent = (dark * 100) / (size * size); + score += Math.floor(Math.abs(percent - 50) / 5) * 10; + return score; +} + +function formatBits(maskId) { + // ECC level L (0b01) + mask, BCH(15,5) with the standard generator. + let data = (0b01 << 3) | maskId; + let rem = data << 10; + for (let i = 14; i >= 10; i--) { + if ((rem >>> i) & 1) rem ^= 0b10100110111 << (i - 10); + } + return ((data << 10) | rem) ^ 0b101010000010010; +} + +function placeFormat(matrix, maskId) { + const { size, modules } = matrix; + const bits = formatBits(maskId); + for (let i = 0; i < 15; i++) { + const bit = (bits >>> i) & 1; + // First copy: bits 0-5 down the left of the top-left finder (column 8), + // bit 6 at (8,7), bits 7-8 at (8,5)-(8,6)... then along row 8 to the right. + if (i < 6) { + modules[i][8] = bit; + } else if (i < 8) { + modules[i + 1][8] = bit; + } else if (i === 8) { + modules[8][7] = bit; + } else { + modules[8][14 - i] = bit; + } + // Second copy: bits 0-7 along the bottom of the top-right finder, + // bits 8-14 down the right of the bottom-left finder. + if (i < 8) { + modules[8][size - 1 - i] = bit; + } else { + modules[size - 15 + i][8] = bit; + } + } + modules[size - 8][8] = 1; +} + +function versionBits(version) { + let rem = version << 12; + for (let i = 17; i >= 12; i--) { + if ((rem >>> i) & 1) rem ^= 0b1111100100101 << (i - 12); + } + return (version << 12) | rem; +} + +function placeVersion(matrix, version) { + if (version < 7) return; + const { size, modules } = matrix; + const bits = versionBits(version); + for (let i = 0; i < 18; i++) { + const bit = (bits >>> i) & 1; + const row = Math.floor(i / 3); + const col = i % 3; + modules[size - 11 + col][row] = bit; + modules[row][size - 11 + col] = bit; + } +} + +// --- Public API ------------------------------------------------------------ + +/** + * Encode `text` as a QR module matrix (1 = dark). + * @param {string} text + * @returns {number[][]} + */ +export function encodeQr(text) { + const bytes = [...Buffer.from(text, "utf8")]; + const version = chooseVersion(bytes.length); + const codewords = buildCodewords(bytes, version); + const matrix = makeMatrix(version); + placeData(matrix, codewords); + + let best = null; + for (let maskId = 0; maskId < 8; maskId++) { + const masked = applyMask(matrix.modules, matrix.reserved, maskId); + const score = penalty(masked); + if (!best || score < best.score) best = { score, masked, maskId }; + } + placeFormat({ size: matrix.size, modules: best.masked }, best.maskId); + placeVersion({ size: matrix.size, modules: best.masked }, version); + return best.masked; +} + +/** + * Render `text` as a terminal QR code using half-block glyphs, matching the + * Rust side's `Dense1x2` renderer. + * + * @param {string} text + * @param {{invert?: boolean, quietZone?: number}} [options] + * @returns {string} + */ +export function renderQrToText(text, options = {}) { + const { invert = false, quietZone = 2 } = options; + const matrix = encodeQr(text); + const size = matrix.length; + const padded = size + quietZone * 2; + + // Pad so the matrix has an even number of rows for half-block pairing. + const totalRows = padded % 2 === 0 ? padded : padded + 1; + + const dark = (r, c) => { + const rr = r - quietZone; + const cc = c - quietZone; + if (rr < 0 || rr >= size || cc < 0 || cc >= size) return false; + return matrix[rr][cc] === 1; + }; + + const lines = []; + for (let r = 0; r < totalRows; r += 2) { + let line = ""; + for (let c = 0; c < padded; c++) { + const top = dark(r, c); + const bottom = dark(r + 1, c); + // Half-block glyphs: each text cell covers two module rows. + if (top && bottom) line += "\u2588"; // █ + else if (top) line += "\u2580"; // ▀ + else if (bottom) line += "\u2584"; // ▄ + else line += " "; + } + // Dark modules must be dark ink; when the terminal draws light-on-dark this + // is already correct, but allow the caller to flip for dark-on-light. + lines.push(invert ? line.replace(/[\u2580\u2584\u2588 ]/g, (ch) => + ch === " " ? "\u2588" : " ") : line); + } + return lines.join("\n"); +} diff --git a/integrations/weixin-bridge/test/qr.test.mjs b/integrations/weixin-bridge/test/qr.test.mjs new file mode 100644 index 0000000000..95cc75d047 --- /dev/null +++ b/integrations/weixin-bridge/test/qr.test.mjs @@ -0,0 +1,99 @@ +import test from "node:test"; +import assert from "node:assert/strict"; + +import { encodeQr, renderQrToText } from "../src/qr.mjs"; + +// The rendered QR is the login credential, so a wrong matrix is worse than no +// QR at all. These checks pin the structural invariants a scanner relies on: +// finder patterns, timing patterns, and the format-information copies. + +function finderOk(matrix, row, col) { + for (let r = 0; r < 7; r++) { + for (let c = 0; c < 7; c++) { + const expected = + r === 0 || r === 6 || c === 0 || c === 6 || (r >= 2 && r <= 4 && c >= 2 && c <= 4); + if (Boolean(matrix[row + r][col + c]) !== expected) return false; + } + } + return true; +} + +const SAMPLE = "https://liteapp.weixin.qq.com/q/7GiQu1?qrcode=c09677d820dc2b705c2ba8c89dee2b4c&bot_type=3"; + +test("encodeQr picks a valid version size", () => { + // Version 1 is 21x21 and each version adds 4 modules. + for (const text of ["A", "HELLO", SAMPLE]) { + const size = encodeQr(text).length; + assert.equal((size - 17) % 4, 0, `size ${size} is not a valid QR size`); + assert.ok(size >= 21, `size ${size} below version 1`); + } +}); + +test("encodeQr places the three finder patterns", () => { + const matrix = encodeQr(SAMPLE); + const size = matrix.length; + assert.ok(finderOk(matrix, 0, 0), "top-left finder"); + assert.ok(finderOk(matrix, 0, size - 7), "top-right finder"); + assert.ok(finderOk(matrix, size - 7, 0), "bottom-left finder"); +}); + +test("encodeQr writes the alternating timing patterns", () => { + const matrix = encodeQr(SAMPLE); + const size = matrix.length; + for (let i = 8; i < size - 8; i++) { + assert.equal(matrix[6][i], i % 2 === 0 ? 1 : 0, `row timing at ${i}`); + assert.equal(matrix[i][6], i % 2 === 0 ? 1 : 0, `column timing at ${i}`); + } +}); + +test("encodeQr sets the fixed dark module", () => { + const matrix = encodeQr(SAMPLE); + assert.equal(matrix[matrix.length - 8][8], 1); +}); + +test("format information is mirrored between its two copies", () => { + const matrix = encodeQr(SAMPLE); + const size = matrix.length; + // Bits 0-5 run down column 8; the second copy of bits 8-14 runs down column 8 + // near the bottom-left finder. Pin that the split exists and is populated. + const firstCopy = [0, 1, 2, 3, 4, 5].map((r) => matrix[r][8]); + const secondCopy = [8, 9, 10, 11, 12, 13, 14].map((i) => matrix[size - 15 + i][8]); + assert.ok( + firstCopy.every((v) => v === 0 || v === 1), + "first format copy must be fully written" + ); + assert.ok( + secondCopy.every((v) => v === 0 || v === 1), + "second format copy must be fully written" + ); +}); + +test("encodeQr round-trips a UTF-8 payload without throwing", () => { + // 18 UTF-8 bytes needs version 2 (25x25), not version 1. + const matrix = encodeQr("微信扫码测试"); + assert.equal(matrix.length, 25); + assert.equal((matrix.length - 17) % 4, 0); +}); + +test("encodeQr rejects payloads beyond the supported versions", () => { + assert.throws(() => encodeQr("x".repeat(400)), /too long/); +}); + +test("renderQrToText produces half-block rows covering the whole matrix", () => { + const text = renderQrToText(SAMPLE); + const lines = text.split("\n"); + const matrix = encodeQr(SAMPLE); + const quietZone = 2; + const padded = matrix.length + quietZone * 2; + const expectedRows = padded % 2 === 0 ? padded : padded + 1; + + assert.equal(lines.length, expectedRows / 2, "one text row per two module rows"); + for (const line of lines) { + assert.equal([...line].length, padded, "every row is padded to the same width"); + } +}); + +test("renderQrToText emits only half-block glyphs and spaces", () => { + const text = renderQrToText(SAMPLE); + assert.match(text, /^[\u2580\u2584\u2588 \n]+$/); +}); From 091c9a03bdb3352b29cc91644281182ca0fc3973 Mon Sep 17 00:00:00 2001 From: Vincent Corleone Date: Mon, 14 Sep 2026 18:58:12 +0800 Subject: [PATCH 2/2] docs(weixin-bridge): simplify the Quick Start for a smoother first run --- docs/assets/weixin-bridge-qr-login.png | Bin 0 -> 37805 bytes docs/assets/weixin-bridge-status-verify.jpg | Bin 0 -> 116171 bytes integrations/weixin-bridge/README.md | 113 ++++++-------------- 3 files changed, 34 insertions(+), 79 deletions(-) create mode 100644 docs/assets/weixin-bridge-qr-login.png create mode 100644 docs/assets/weixin-bridge-status-verify.jpg diff --git a/docs/assets/weixin-bridge-qr-login.png b/docs/assets/weixin-bridge-qr-login.png new file mode 100644 index 0000000000000000000000000000000000000000..c20a3bdf0ea734af50a3d89092c79b5888261c0e GIT binary patch literal 37805 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

Ye_t-UqdGb;4QG{D_FQ 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 I=6|dI4e>XU;Q#;t literal 0 HcmV?d00001 diff --git a/integrations/weixin-bridge/README.md b/integrations/weixin-bridge/README.md index 4740ce7da0..de3420c8fc 100644 --- a/integrations/weixin-bridge/README.md +++ b/integrations/weixin-bridge/README.md @@ -1,31 +1,25 @@ # Weixin Bot Bridge 此 bridge 让微信个人账号通过扫码登录控制本地 `codewhale serve --http` runtime。 -使用腾讯 iLink Bot 协议(参考 `@tencent-weixin/openclaw-weixin`), -无需公众号注册即可工作。 +使用腾讯 iLink Bot 协议(参考 `@tencent-weixin/openclaw-weixin`)。 -与现有的 `integrations/wechat-bridge`(公众号客服消息模式)不同, -此 bridge 直接登录**个人微信账号**,通过长轮询 `getUpdates` 收发消息。 +此 bridge 直接使用**个人微信账号**扫码登录授权,通过长轮询 `getUpdates` 收发消息。 -## 安全模型 - -- `codewhale serve --http` 绑定于 `127.0.0.1`。 -- `/v1/*` runtime 调用使用 `CODEWHALE_RUNTIME_TOKEN`。 -- 微信用户必须加入白名单,除非首次配对时设置 `WEIXIN_ALLOW_UNLISTED=true`。 -- 仅支持私聊;暂不支持群聊。 -- 工具审批通过文本命令:`/allow ` 或 `/deny `。 -- bridge 主动向微信服务器发起长轮询请求,无需公网端口。 ## Quick Start -使用两个终端。在第一个终端启动本地 runtime: +### 终端发起 + +#### 方式一、双终端启动 + +第一个终端启动 runtime: ```bash export CODEWHALE_RUNTIME_TOKEN="$(openssl rand -hex 32)" codewhale serve --http --host 127.0.0.1 --port 7878 --auth-token "$CODEWHALE_RUNTIME_TOKEN" ``` -在第二个终端启动 bridge: +第二个终端启动 bridge: ```bash cd integrations/weixin-bridge @@ -34,91 +28,55 @@ export WEIXIN_ALLOW_UNLISTED=true npm start ``` -### 单终端启动 -如果不想开两个终端、也不想手动传递 token,用 `npm run bridge`: + +#### 方式二、单终端启动 + +一条命令同时启动 runtime 和 bridge,自动生成并共用 token: ```bash cd integrations/weixin-bridge npm run bridge ``` -它会自动生成一个 `CODEWHALE_RUNTIME_TOKEN`,在后台启动 `codewhale serve --http`, -等 `/health` 返回正常后再以前台方式启动 bridge,两者共用同一个 token。 -按 `Ctrl-C` 会同时停止 bridge 和 runtime。 - -可用环境变量覆盖默认值: - -| 变量 | 默认值 | 说明 | -|------|--------|------| -| `CODEWHALE_RUNTIME_PORT` | `7878` | runtime 监听端口 | -| `CODEWHALE_RUNTIME_TOKEN` | 自动生成 | 复用已有 token 时设置 | -| `WEIXIN_ALLOW_UNLISTED` | `true` | 首次配对模式 | -| `WEIXIN_STATE_DIR` | `./.state` | 状态目录(单终端模式默认写入仓库内,避免 `/var/lib` 权限问题) | - -例如换端口并复用已有 token: - -```bash -CODEWHALE_RUNTIME_PORT=7999 CODEWHALE_RUNTIME_TOKEN="$MY_TOKEN" npm run bridge -``` +按 `Ctrl-C` 同时停止两者。 -首次启动会用文本二维码直接在终端打印登录二维码,用微信扫码即可: +### 微信端扫码接应 -```text -请用微信扫描以下二维码登录: - █▀▀▀▀▀█ █ ▄▄█▀▀▀ ▄▄█▄▀▀▀▀ ▀▄ █▀▀▀▀▀█ - █ ███ █ ██▄ █▄▀█▀▀▄▀▄▀ █▄ █ ▄ █ ███ █ - ... - ▀▀▀▀▀▀▀ ▀▀▀▀ ▀▀ ▀▀▀▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀ -``` +首次启动会打印文本二维码,用微信扫码登录: -二维码下方同时打印原始 URL,便于在二维码显示异常(字体缺字、终端不支持半块字符) -时手动打开。二维码在本地生成,不会经由第三方服务。 +![终端打印的登录二维码](../../docs/assets/weixin-bridge-qr-login.png) -登录凭证(`bot_token`)会自动保存到 `WEIXIN_STATE_DIR`,后续启动无需重新扫码。 -线程映射与长轮询游标也写入同一目录,该目录会在启动时自动创建并先做一次可写性 -探测 —— 不可写时 bridge 会立即报错退出,而不是等到你发消息后才失败。 -扫码授权窗口为 5 分钟,超时需重启 bridge 重新获取。 +二维码下方同时打印原始 URL,二维码显示异常时可手动打开。扫码窗口 5 分钟。 -### 在微信中验证 +### 微信端验证信道效果 -登录成功后,**在微信里给这个 bot 发一条 `/status`**。收到回复即表示链路已打通 -(bridge 已连上微信、runtime 也可达)。没有收到回复时不要继续后面的步骤, -先按终端输出的报错排查。 +登录成功后,在微信里给这个 bot 发一条 `/status`。收到任何回复即表示链路已打通。 -回复内容有两种: +![微信端 /status 验证](../../docs/assets/weixin-bridge-status-verify.jpg) -- 已授权(`WEIXIN_ALLOW_UNLISTED=true`,或你已在白名单里)→ 返回 runtime 与工作区状态。 -- 未授权 → 返回拒绝消息,其中**带有你的 `user_id`**: - ```text - This WeChat user is not in WEIXIN_CHAT_ALLOWLIST. - user_id=<你的 user_id> - For first pairing, add this user_id to WEIXIN_CHAT_ALLOWLIST, - or temporarily set WEIXIN_ALLOW_UNLISTED=true. - ``` -拿到 `user_id` 后写入白名单并关闭配对模式: +## 安全模型 -```bash -export WEIXIN_CHAT_ALLOWLIST="<上一步返回的 user_id>" -export WEIXIN_ALLOW_UNLISTED=false -npm start -``` +- `codewhale serve --http` 绑定于 `127.0.0.1`。 +- `/v1/*` runtime 调用使用 `CODEWHALE_RUNTIME_TOKEN`。 +- 微信用户必须加入白名单,除非首次配对时设置 `WEIXIN_ALLOW_UNLISTED=true`。 +- 仅支持私聊;暂不支持群聊。 +- 工具审批通过文本命令:`/allow ` 或 `/deny `。 +- bridge 主动向微信服务器发起长轮询请求,无需公网端口。 -之后不带 `/` 前缀的任意文本都会作为 prompt 发给 runtime,回复会发回微信。 -> 注意:同一条微信消息只会被处理一次(bridge 按 `user_id:message_id` 去重)。 -> 重新测试时请发送**新消息**,重发旧消息不会有任何反应。 +## 设置 -注意:bridge **不读取 `.env` 文件**,也不读取 `/etc/codewhale/*.env`(那些是给 systemd -`EnvironmentFile=` 用的)。手动运行时环境变量必须通过 `export` 传入,或使用 -`node --env-file=.env src/index.mjs`。 +登录凭证保存在 `WEIXIN_STATE_DIR`,再次启动无需重新扫码。线程映射与长轮询游标 +写入同一目录,启动时会自动创建并探测可写性 —— 不可写则立即报错退出。 -## 设置 +注意:bridge **不读取 `.env` 文件**,手动运行时环境变量必须通过 `export` 传入, +或使用 `node --env-file=.env src/index.mjs`。 -systemd 部署时,把环境变量写入 env 文件并由单元引用: +systemd 部署时把变量写入 env 文件并由单元引用: ```bash cd integrations/weixin-bridge @@ -128,9 +86,6 @@ sudoedit /etc/codewhale/weixin-bridge.env node src/index.mjs ``` -首次启动时会显示一个二维码,用微信扫描以完成登录授权。 -登录凭证会自动保存,后续启动无需重新扫码。 - ## 命令 - `/status` @@ -149,7 +104,7 @@ node src/index.mjs 1. 设置 `WEIXIN_ALLOW_UNLISTED=true` 启动 bridge。 2. 扫码登录后,在微信中发送 `/status`。 -3. Bridge 会将你的 `user_id` 返回给你(若白名单为空则显示在拒绝消息中)。 +3. Bridge 返回 runtime 状态;若你不在白名单,则返回拒绝消息,其中带有你的 `user_id`。 4. 将 `user_id` 加入 `WEIXIN_CHAT_ALLOWLIST`。 5. 将 `WEIXIN_ALLOW_UNLISTED` 改回 `false` 并重启 bridge。