mirror of
https://github.com/NanmiCoder/cc-haha
synced 2026-07-16 13:03:31 +08:00
Remove .claude/ and docs/superpowers/ from git tracking as they are local-only config and planning files. Also remove stale screenshots and update docs/channel content. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
173 lines
3.7 KiB
Markdown
173 lines
3.7 KiB
Markdown
# Telegram 接入
|
||
|
||
> Telegram Adapter 的实际接入说明,基于当前仓库代码,而不是旧 README。
|
||
|
||
## 适用场景
|
||
|
||
Telegram 方案适合个人私聊远程使用。当前实现只处理 `private chat`,不处理群聊。
|
||
|
||
实现入口:`adapters/telegram/index.ts`
|
||
|
||
## 启动前准备
|
||
|
||
### 1. 创建 Bot
|
||
|
||
在 Telegram 里找 `@BotFather`:
|
||
|
||
1. 发送 `/newbot`
|
||
2. 按提示创建 bot
|
||
3. 拿到 `Bot Token`
|
||
|
||
### 2. 在 Desktop Webapp 里填写配置
|
||
|
||
打开 `Settings -> IM 接入 -> Telegram`,填写:
|
||
|
||
- `Bot Token`
|
||
- `Allowed Users`,可选
|
||
- 全局 `Default Project`
|
||
|
||
也可以直接写 `~/.claude/adapters.json`,但当前推荐从 Webapp 配。
|
||
|
||
配置结构示例:
|
||
|
||
```json
|
||
{
|
||
"serverUrl": "ws://127.0.0.1:3456",
|
||
"defaultProjectDir": "/Users/me/workspace/my-project",
|
||
"telegram": {
|
||
"botToken": "123456:ABC-DEF...",
|
||
"allowedUsers": [123456789]
|
||
}
|
||
}
|
||
```
|
||
|
||
环境变量优先级更高:
|
||
|
||
```bash
|
||
export TELEGRAM_BOT_TOKEN="123456:ABC-DEF..."
|
||
export ADAPTER_SERVER_URL="ws://127.0.0.1:3456"
|
||
```
|
||
|
||
## 启动
|
||
|
||
```bash
|
||
cd adapters
|
||
bun install
|
||
bun run telegram
|
||
```
|
||
|
||
## 首次配对
|
||
|
||
Telegram 侧的授权入口不再只依赖 `allowedUsers`。
|
||
|
||
当前真实逻辑:
|
||
|
||
1. 在 Desktop Webapp 里生成配对码
|
||
2. 去 Telegram 私聊 bot
|
||
3. 把那 6 位码直接发给 bot
|
||
4. adapter 调用 `tryPair(...)`
|
||
5. 配对成功后,把当前 Telegram user 写进 `telegram.pairedUsers`
|
||
|
||
特点:
|
||
|
||
- 配对码 60 分钟过期
|
||
- 配对成功后立即失效
|
||
- 和飞书共用同一枚全局配对码
|
||
- 连续输错有速率限制
|
||
|
||
## 日常使用流程
|
||
|
||
### 首次消息
|
||
|
||
`adapters/telegram/index.ts` 的流程是:
|
||
|
||
1. 校验是否私聊
|
||
2. 去重
|
||
3. 校验是否已授权
|
||
4. 没有 session 时:
|
||
- 优先恢复 `adapter-sessions.json` 里的旧 session
|
||
- 否则用 `defaultProjectDir` 创建新 session
|
||
- 如果没配默认项目,则拉最近项目列表让你选
|
||
|
||
### 项目选择
|
||
|
||
当没有默认项目时,bot 会调用 `GET /api/sessions/recent-projects`,返回最近项目列表,并要求你回复编号。
|
||
|
||
选中后:
|
||
|
||
- adapter 用 `POST /api/sessions` 创建 session
|
||
- 把 `chatId -> sessionId -> workDir` 写进 `~/.claude/adapter-sessions.json`
|
||
- 后续消息继续复用
|
||
|
||
## 支持的命令
|
||
|
||
### `/start`
|
||
|
||
显示帮助和可用命令。
|
||
|
||
### `/projects`
|
||
|
||
切换项目,重新显示最近项目列表。
|
||
|
||
### `/new`
|
||
|
||
清空当前 chat 绑定的 session,并重新选择项目。
|
||
|
||
### `/stop`
|
||
|
||
向当前 session 发送 `stop_generation`。
|
||
|
||
## 权限审批
|
||
|
||
当 Claude 需要敏感权限时,Telegram adapter 会发带按钮的消息:
|
||
|
||
- `✅ 允许`
|
||
- `❌ 拒绝`
|
||
|
||
点击后,adapter 会把结果通过 `permission_response` 发回 Desktop server。
|
||
|
||
## 返回消息的表现
|
||
|
||
Telegram 侧有一层流式缓冲:
|
||
|
||
- thinking 时先发占位消息
|
||
- text delta 逐步累积
|
||
- 完成时按 4000 字分片发送
|
||
|
||
对应公共模块:
|
||
|
||
- `adapters/common/message-buffer.ts`
|
||
- `adapters/common/format.ts`
|
||
- `adapters/common/ws-bridge.ts`
|
||
|
||
## 常见问题
|
||
|
||
### bot 启动时报缺少 token
|
||
|
||
说明 `TELEGRAM_BOT_TOKEN` 和 `~/.claude/adapters.json` 里的 `telegram.botToken` 都没有生效。
|
||
|
||
### 能打开设置页但 bot 不工作
|
||
|
||
Webapp 只负责配置,不会自动拉起 `bun run telegram`。
|
||
|
||
### 发消息提示未授权
|
||
|
||
优先检查:
|
||
|
||
- 是否已经在 Webapp 里生成配对码
|
||
- 配对码是否过期
|
||
- 是否把码发到了正确的 bot 私聊
|
||
- `allowedUsers` / `pairedUsers` 是否真的包含当前账号
|
||
|
||
### 每次重启后会话丢失
|
||
|
||
检查 `~/.claude/adapter-sessions.json` 是否能正常写入,以及 Desktop server 的 session 是否仍存在。
|
||
|
||
## 源码入口
|
||
|
||
- `adapters/telegram/index.ts`
|
||
- `adapters/common/pairing.ts`
|
||
- `adapters/common/session-store.ts`
|
||
- `adapters/common/ws-bridge.ts`
|
||
- `adapters/common/http-client.ts`
|