Telegram Bot + Claude API
High Contrast
Dark Mode
Light Mode
Sepia
Forest
1 min read263 words

Telegram Bot + Claude API

手机随时能用 Claude——不是打开 App 切换窗口,而是直接在 Telegram 发消息,AI 立刻回复。

Telegram Bot 架构

graph LR USER[用户] --> TELEGRAM[Telegram 消息] TELEGRAM --> WEBHOOK[Webhook/轮询] WEBHOOK --> BOT_SERVER[Bot 服务器] BOT_SERVER --> CLAUDE_API[Claude API] CLAUDE_API --> BOT_SERVER BOT_SERVER --> TELEGRAM TELEGRAM --> USER BOT_SERVER --> SESSION[会话管理] BOT_SERVER --> HISTORY[对话历史] BOT_SERVER --> COMMANDS[命令路由] COMMANDS --> CMD1[/chat 对话] COMMANDS --> CMD2[/analyze 分析图片] COMMANDS --> CMD3[/translate 翻译] COMMANDS --> CMD4[/summarize 摘要] style BOT_SERVER fill:#c8e6c9,stroke:#388e3c,stroke-width:2px style CLAUDE_API fill:#e3f2fd,stroke:#1565c0,stroke-width:2px

完整 Telegram Bot 实现

"""
Telegram Bot + Claude API 完整实现
依赖: pip install python-telegram-bot anthropic
"""
import os
import asyncio
from dataclasses import dataclass, field
from collections import defaultdict
import anthropic
@dataclass
class ConversationSession:
"""用户会话"""
user_id: int
username: str
messages: list[dict] = field(default_factory=list)
system_prompt: str = "You are a helpful assistant. Be concise and practical."
max_history: int = 20   # 保留最近 20 条消息
def add_message(self, role: str, content: str):
self.messages.append({"role": role, "content": content})
# 保持历史在限制内(保留 system 外的最近 N 条)
if len(self.messages) > self.max_history:
self.messages = self.messages[-self.max_history:]
def clear(self):
self.messages = []
class ClaudeTelegramBot:
"""Claude 驱动的 Telegram 机器人"""
COMMANDS = {
"/start": "初始化机器人并显示帮助",
"/chat": "开始或继续对话(默认模式)",
"/clear": "清除对话历史",
"/system": "设置自定义 System Prompt",
"/translate": "翻译文本(发送后跟文字)",
"/summarize": "摘要长文本",
"/code": "代码审查或生成",
"/image": "分析图片(发送图片时使用)",
}
PRESET_SYSTEMS = {
"助手": "你是一个智能助手,回答要简洁实用,用中文回复。",
"翻译": "你是专业翻译,将用户发送的文本翻译成中文(如果是中文则翻译成英文),只输出译文,不加解释。",
"程序员": "你是资深程序员。代码问题给出可运行的代码示例,附简要说明。",
"写作": "你是写作助手,帮助改善文字表达,使其更清晰有力。",
}
def __init__(self, telegram_token: str, anthropic_api_key: str):
self.telegram_token = telegram_token
self.claude = anthropic.Anthropic(api_key=anthropic_api_key)
self.sessions: dict[int, ConversationSession] = defaultdict(
lambda: ConversationSession(user_id=0, username="")
)
def call_claude(self, session: ConversationSession, user_message: str) -> str:
"""调用 Claude API"""
session.add_message("user", user_message)
try:
response = self.claude.messages.create(
model="claude-sonnet-4-5-20251001",
max_tokens=1024,
system=session.system_prompt,
messages=session.messages,
)
assistant_reply = response.content[0].text
session.add_message("assistant", assistant_reply)
return assistant_reply
except anthropic.APIError as e:
return f"❌ API 错误: {str(e)}"
def handle_command(self, user_id: int, username: str, command: str, args: str) -> str:
"""处理命令"""
session = self.sessions[user_id]
session.user_id = user_id
session.username = username
if command == "/start":
session.clear()
return self._help_message()
elif command == "/clear":
session.clear()
return "✅ 对话历史已清除"
elif command == "/system":
if args in self.PRESET_SYSTEMS:
session.system_prompt = self.PRESET_SYSTEMS[args]
return f"✅ 已切换到预设模式: {args}"
elif args:
session.system_prompt = args
return f"✅ System Prompt 已更新"
else:
presets = "\n".join(f"  /system {k}" for k in self.PRESET_SYSTEMS)
return f"当前 System: {session.system_prompt[:100]}...\n\n预设:\n{presets}"
elif command == "/translate":
if not args:
return "请在命令后输入要翻译的文本\n例如: /translate Hello World"
old_system = session.system_prompt
session.system_prompt = self.PRESET_SYSTEMS["翻译"]
result = self.call_claude(session, args)
session.system_prompt = old_system
return result
elif command == "/summarize":
if not args:
return "请在命令后输入要摘要的文本"
return self.call_claude(session, f"请用3-5句话摘要以下内容:\n\n{args}")
elif command == "/code":
if not args:
return "请描述你的代码问题或粘贴代码"
return self.call_claude(session, f"作为代码专家,请帮助处理以下问题:\n\n{args}")
return "❓ 未知命令,发送 /start 查看帮助"
def handle_message(self, user_id: int, username: str, text: str) -> str:
"""处理普通消息"""
session = self.sessions[user_id]
session.user_id = user_id
session.username = username
return self.call_claude(session, text)
def _help_message(self) -> str:
cmds = "\n".join(f"  {cmd} — {desc}" for cmd, desc in self.COMMANDS.items())
return f"""👋 你好!我是 Claude AI 助手。
**可用命令:**
{cmds}
**快速开始:**
直接发送任何消息即可对话!
**切换角色:**
/system 翻译  → 翻译模式
/system 程序员 → 代码助手
/system 写作  → 写作助手"""
# 模拟运行演示
def demo():
bot = ClaudeTelegramBot(
telegram_token="YOUR_TELEGRAM_TOKEN",
anthropic_api_key=os.environ.get("ANTHROPIC_API_KEY", "demo"),
)
user_id = 123456
username = "demo_user"
print("=== Telegram Bot 模拟演示 ===\n")
# 模拟对话
interactions = [
("/start", ""),
("/system", "翻译"),
("/translate", "Hello, how are you today?"),
("/clear", ""),
("msg", "Python 中如何读取 CSV 文件?"),
]
for cmd, args in interactions:
if cmd == "msg":
print(f"用户: {args}")
# 实际调用 Claude(演示时跳过)
print(f"Claude: [调用 Claude API 回复]\n")
else:
response = bot.handle_command(user_id, username, cmd, args)
print(f"命令: {cmd} {args}")
print(f"Bot: {response[:200]}...\n" if len(response) > 200 else f"Bot: {response}\n")
demo()

部署方案对比

方案 成本 复杂度 适合场景
Railway/Render 免费层 $0 个人使用,轻量访问
VPS (DigitalOcean $5/月) $5/月 团队使用,稳定访问
AWS Lambda 按请求计费 高并发,成本可控
本地 + ngrok(开发) $0 开发测试专用

行动清单

下一节02-WhatsApp-Business接入Claude — 在 WhatsApp Business 中搭建 Claude 自动回复系统。