Core / channel 内部协议 #
本接口只挂载于 CHANNEL_LISTEN,默认 127.0.0.1:8081。Compose 中为 :8081,仅容器网络可达。公共 :8080 不注册内部路由。内部接口不要求 Authorization;携带浏览器 Origin 的请求被拒绝。租约字段仅用于防止过期任务确认,不是服务认证。
所有路径以 /internal/v1/channels/{channel_id} 开头。渠道必须与 core 数据库配置的 Telegram channel 一致;租户由已登记渠道和输入 actor 解析,请求不接受 tenant ID。完整类型见 internal/channelapi/types.go。
| 方法与后缀 | 用途 |
|---|---|
GET /config |
Bot 配置、Web URL、持久化轮询 offset |
POST /events |
持久化规范化输入;按渠道与 update_id 去重;返回是否删除凭据原消息 |
POST /work/claim |
最长等待 20 秒;返回 work 和 90 秒租约,无任务返回 204 |
POST /work/{id}/ack |
续租、批次进度、message_id、完成或延后重试;重复完成确认幂等 |
POST /actions |
在 event 的 actor 上下文执行业务动作并保存结果;重试返回已存结果 |
GET /work/{id}/delivery |
收藏、任务暂停状态和集合进度(含中止状态);由 channel 生成 Telegram 文本与按钮 |
GET /work/{id}/assets/{asset} |
校验领取任务的租户与资源权限后代理私有对象数据,支持 Range |
GET/PUT/DELETE /media-cache |
当前 Bot 的媒体远端引用缓存;缓存不作为内容授权依据 |
POST /work/{id}/normalize |
仅升级时使用,将旧 inbox 输入转成规范化 event |
领取返回的 lease 用于动作和确认请求;读取任务资源时置于 X-Work-Lease。每 25 秒续租。崩溃后租约到期可重新领取,progress 和 message_id 保留。TG channel 不连接 PostgreSQL、S3 或 gRPC Adapter。
输入确认和 offset 更新处于同一个数据库事务。账号凭据在持久化之前由 core 加密,完成或永久失败后清除暂存密文。账号对话存在数据库中,因此两个进程重启都不会丢失对话。已确认的媒体批次不会再次发送;发送成功但 HTTP/TG 确认丢失仍可能重复,协议不承诺恰好一次。
Web 继续使用公共 /v1 API,Telegram initData 的签名在 core 本地校验,不需要 channel 在线。已有收藏的查询与下载也不需要 Adapter 在线;采集和凭据校验才调用 Adapter。
internal/app 不处理 Telegram Update、SDK 调用或消息排版。历史 inbox 的解析在 channel 完成,core 的 /normalize 仅处理升级数据与凭据密文;历史 reply 的已存内容由 channel 发送。新任务统一进入 channel_work,不再生成 River 投递任务。