上一版按"webhook + URL 里带令牌"自己编了一套,用户当场指出微信必须先扫码配对。 现在照腾讯 iLink Bot 协议自己做客户端:取二维码 → 手机扫码确认 → 存加密登录态 → 后端长轮询收消息 → 用 context_token 回话。独立实现,不依赖 DSH 的运行环境。 后端 - wechat_ilink.py:get_bot_qrcode / get_qrcode_status / getupdates / sendmessage, bot_token 用 Fernet(密钥由 JWT_SECRET 派生)加密入库,日志与接口都不回明文 - wechat_intake.py:一句话 → 任务或知识草稿,前缀识别、#标签、首行标题 - wechat_bot.py:每条通道一个轮询任务,启动时按 status='active' 恢复; message_id 去重;errcode -14 转 expired 让用户重新扫 - api/integrations.py 重写成扫码三接口 + 停用/断开/最近消息 - 迁移 0013(登录态列)、0014(轮询入口按 app.bot_channel 主键的 RLS 口子) Web - 接入页改成扫码流程:页面里画出二维码、每 2 秒问一次状态、连上显示微信用户与最近消息 验证 - pytest 149 passed(新增 test_wechat_bot 9 例) - ruff check / ruff format --check 干净;tsc 0;vite build ✓ - web/e2e/integrations.mjs 7 项 ALL PASS(拿的是微信真二维码) 教训:接入第三方协议先去已有实现里找协议,别从直觉倒推。
一条通道一张令牌,机器人把消息 POST 到 /integrations/clawbot/{token}, 正文按前缀落到任务或知识草稿:没有前缀就是任务,「知识:」「笔记:」记成知识, 「帮助」只回用法。首行当标题、其余当正文,`#标签` 摘出来挂到事项上。 同一个 msg_id 只处理一次——微信会重推,重推不能变成两条任务。 为什么不塞进 system_setting 的 JSON:一个工作区可能挂多个通道,还得能单独停用。 令牌库里只存 sha256,只在创建/重新生成时显示一次;收消息时还不知道是哪个工作区, 所以 bot_channel 的 RLS 额外放行 token_hash = current_setting('app.bot_token_hash'), 读到通道再 bind_tenant 进上下文,按通道创建者记账。 - 后端:models_integrations.py(bot_channel / bot_message)、迁移 0012(RLS)、 api/integrations.py(收消息 + 管理接口)、错误码 9002/9003 - Web:/w/:wsId/integrations「接入」页——建通道、复制回调地址与令牌、最近消息、 停用/换令牌/删除,只有 owner/admin 能改 - 测试:test_clawbot.py 10 例;web/e2e/integrations.mjs 7 项(冒充 clawbot 真推一条) 验证:pytest 150 passed,ruff check/format 全绿,tsc 0,vite build 通过,e2e 7 项全绿。