CI / backend (push) Canceled after 0s
上一版按"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(拿的是微信真二维码) 教训:接入第三方协议先去已有实现里找协议,别从直觉倒推。
25 lines
684 B
Plaintext
25 lines
684 B
Plaintext
fastapi==0.115.6
|
|
uvicorn[standard]==0.34.0
|
|
# 生产进程管理:gunicorn + UvicornWorker(开发用 `uvicorn --reload` 即可)
|
|
gunicorn==23.0.0
|
|
sqlalchemy[asyncio]==2.0.36
|
|
asyncpg==0.30.0
|
|
alembic==1.14.0
|
|
pydantic==2.10.4
|
|
pydantic-settings==2.7.0
|
|
pyjwt==2.10.1
|
|
redis==5.2.1
|
|
python-multipart==0.0.20
|
|
# Windows has no system tz database; ZoneInfo("Asia/Shanghai") fails without this.
|
|
# On Linux the package simply shadows the system one -- harmless.
|
|
tzdata==2026.5
|
|
|
|
# dev / test only (split into requirements-dev.txt when it grows)
|
|
pytest==8.3.4
|
|
pytest-asyncio==0.25.0
|
|
httpx==0.28.1
|
|
# 微信登录态加密(Fernet)与二维码渲染
|
|
cryptography==50.0.2
|
|
qrcode==8.2
|
|
ruff==0.8.4
|