Appearance
Telegram Bot 与 OpenCode 集成技术可行性研究
摘要 (Executive Summary)
本研究验证了在 Bun 环境下将 Telegram Bot 与 OpenCode 集成,实现进程监听和远程控制的技术可行性。通过分析 OpenCode 的输出机制、Telegram Bot API 能力以及 Bun 的进程管理能力,结论表明该方案完全可行,无需修改 OpenCode 源码即可实现所有需求功能。
核心实现方案是使用 Bun 的 spawn API 启动 OpenCode 进程,通过流式读取 stdout/stderr 实时捕获输出,并基于预定义策略将信息发送到 Telegram。同时通过进程管理实现 /kill 指令来终止正在运行的 OpenCode 进程。
可行性结论
结论:完全可行
- 方案 A(推荐):流式输出监听 - 实时性高、资源占用低
- 方案 B(备选):日志文件监听 - 适合事后查询场景
目录 (Table of Contents)
- 01-需求拆解 - 详细分析用户需求和关键技术挑战
- 02-核心能力验证 - 验证 OpenCode、Telegram Bot 和 Bun 的技术能力
- 03-解决方案设计 - 提供两种方案设计和详细架构说明
- 04-实施指南 - 提供完整的代码示例和部署指南
关键发现 (Key Findings)
技术能力验证
| 组件 | 能力 | 验证状态 |
|---|---|---|
| OpenCode | 标准输出流 | ✅ 完全支持 |
| Bun child_process | 进程管理 | ✅ 完全支持 |
| Telegram Bot API | 消息通知 | ✅ 完全支持 |
| 输出解析 | 模式匹配 | ✅ 可实现 |
| 进程终止 | 信号控制 | ✅ 完全支持 |
推荐技术栈
- 运行时:Bun v1.0+
- Telegram Bot 库:grammY(TypeScript 优先、现代 API)
- 进程存储:JSON 文件 + 内存缓存
- 部署:PM2 或 Systemd
实施建议
分阶段实施:
第一阶段(基础功能):
- 进程启动和 stdout 监听
- 简单通知(完整输出)
- 基础 kill 指令
第二阶段(智能通知):
- 输出解析和事件识别
- 通知策略和节流
- 消息格式化和分割
第三阶段(增强功能):
- 多进程管理
- 进程持久化和恢复
- 高级通知(消息编辑、文件上传)
风险评估
| 风险 | 级别 | 缓解措施 |
|---|---|---|
| OpenCode 输出格式变化 | 中 | 设计鲁棒的解析器,多模式匹配 |
| Telegram API 限流 | 低 | 实现消息队列,避免突发大量消息 |
| 进程管理复杂度 | 中 | 简化状态管理,避免过度设计 |
| 机器人异常中断 | 中 | 使用 systemd/supervisor 保证运行稳定性 |
架构概览
用户 ←→ Telegram Bot ←→ OpenCode 进程
↓
流监听器 & 解析器
↓
通知策略引擎
↓
Telegram API核心参考资料 (References)
- OpenCode GitHub Repository - OpenCode 开源代码仓库
- OpenCode Official Website - OpenCode 官方网站
- Bun Documentation - Child Processes - Bun 进程管理文档
- grammY Documentation - Telegram Bot 库文档
- Telegram Bot API - sendMessage - Telegram API 文档
结论
本研究确认了通过外部包装实现 OpenCode 与 Telegram Bot 集成的技术可行性。推荐使用流式输出监听方案(方案 A),该方案具有更好的实时性和用户体验。实施时建议分三个阶段逐步完善功能,从基础进程监听开始,逐步增加智能通知和高级特性。
附录:快速开始示例
bash
# 1. 初始化项目
bun init -y
bun add grammy
# 2. 创建简单监听器
# src/index.ts
import { spawn } from 'child_process';
import { Bot } from 'grammy';
const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN!);
bot.command('run', async (ctx) => {
const prompt = ctx.message.text.replace('/run', '').trim();
const process = spawn('opencode', ['--prompt=' + prompt], {
stdio: ['ignore', 'pipe', 'pipe']
});
process.stdout?.on('data', async (data) => {
await ctx.reply(data.toString());
});
ctx.reply('🚀 已启动 OpenCode');
});
bot.start();文档版本:1.0 创建日期:2026-01-21 研究类型:技术可行性研究