[READ-ONLY] Mirror of https://github.com/sxzz/midden. Archive posts and media across platforms, with tenant accounts and Telegram access
midden docs channel-api.md
3.2 kB · 25 lines
Markdown
at main

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 投递任务。