适用:已有 Pi(本地或服务器均可),想通过 QQ 私聊直接指挥它干活。本方案经生产环境实测:零依赖 Node 桥、观察模式安全起步、指数退避防平台打标。
你在 QQ 发消息 → QQ 机器人平台 → WebSocket 推给桥程序
→ 桥 spawn「pi -p 你的消息」→ Pi 干活出结果
→ 桥把结果发回 QQ → 你在 QQ 里看到回复桥是一段独立的 Node 脚本(不装任何第三方包,只有 Node 自带模块),Pi 以子进程方式被调用。每用户固定 session-id,上下文连续——同一用户连续问,Pi 记得前面聊过什么。
服务器或电脑上确认 Node ≥ 20:
node -v不需要安装任何 npm 包——桥只依赖 Node 内置模块(ws 不是内置的,所以下面用平台官方的 WebSocket 接口路径,或直接引入一个 ws 包即可;若想保持零依赖,用 Node 22+ 内置的 WebSocket 全局对象)。
// qq-bridge.mjs —— QQ 机器人 → Pi 的桥
import { spawn } from 'node:child_process';
const APP_ID = '你的AppID';
const TOKEN = '你的Token';
const WS_URL = 'wss://api.sgroup.qq.com/websocket'; // 官方 WebSocket 网关
const sessions = {}; // openid -> pi session-id(上下文连续)
function runPi(openid, text, cb) {
const sid = sessions[openid] ||= 'qq-' + openid.slice(-8);
const child = spawn('pi', ['-p', text, '--session', sid], {
stdio: ['ignore', 'pipe', 'pipe'], // 关键:stdin 必须 ignore,否则 pi 等输入卡死
});
let out = '';
child.stdout.on('data', d => out += d);
child.on('close', () => cb(out.trim() || '(Pi 没有输出)'));
}
// 以下为 WebSocket 接入:鉴权、收消息、回消息
// (鉴权头 Authorization: Bot <AppID>.<Token>,事件类型 AT_MESSAGE_CREATE / DIRECT_MESSAGE_CREATE
// 回消息走开放平台 REST 接口,完整实现见 pi-qq-channel 技能包)最容易踩的坑:spawn 默认把 stdin 连成管道,Pi 会一直等你敲回车 → 静默卡死。必须 stdio: ['ignore','pipe','pipe'],实测从"卡 3 分钟"变成"1.3 秒回复"。
平台对机器人有风控,乱节奏的爆发式回复容易被打标限流。三个保命习惯:
跑通这三步,你就有个 QQ 里随叫随到的 Pi 了——出门在外掏出手机就能指挥它干活。
ignore,否则 pi 一直在等你敲回车。'qq-' + openid.slice(-8) 就是干这个的),别用全局单 session。