实战 📋 6 个步骤 第 402 / 470 篇

用 AI 做一个能聊天的 Telegram 机器人:十分钟上线

用 python-telegram-bot 加一个大模型,十分钟做出会对话、能接命令的 Telegram 机器人。涵盖会话记忆、命令菜单、限流与人工兜底,以及上线部署要点。

2026.09.09· 18 分钟阅读· 约 1002 字· 🤖 Telegram / 🧠 DeepSeek

Telegram 机器人是接 AI 最省事的入口之一:用户在你机器人里发消息,你的程序调用大模型生成回复,再发回去。不用做前端、不用管登录,一个 BotFather 令牌就能开工。本教程带你从零做一个能聊天、有记忆、可上线的 AI 机器人。

🤖 本教程适合:想快速验证 AI 产品点子、做社群助手/客服原型/个人效率机器人的开发者。

先搞懂:Telegram 机器人是怎么跑的?

一句话:BotFather 给你一个 token(令牌),你的程序用这个 token 长轮询/接收用户消息,调用 AI 生成回复,再发回去。AI 是大脑,Telegram 是「嘴巴和耳朵」。

角色负责
Telegram收发消息、按钮、命令菜单
你的程序接收消息、调 AI、回消息
大模型理解并生成回答

Step 1:找 @BotFather 创建机器人

1 拿到机器人的「身份证」

在 Telegram 搜索 @BotFather,发 /newbot,按提示起名,拿到一串 123456:ABCdef... 的 token。

1. 给 BotFather 发 /newbot
2. 填机器人显示名(如 My AI Helper)
3. 填用户名(必须以 bot 结尾,如 my_ai_helper_bot)
4. 复制返回的 token:123456:ABCdef...

token 等于账号密码:谁拿到都能以你的机器人身份发消息。只放环境变量,别提交到代码仓库。

Step 2:跑通「收到 hi 回你好」

2 最小可运行骨架

装好库,先不接 AI,确认消息收发通了:

pip install python-telegram-bot

from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes

async def echo(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("你好,我是 AI 机器人!")

app = ApplicationBuilder().token("你的TOKEN").build()
app.add_handler(MessageHandler(filters.TEXT, echo))
app.run_polling()
💡 能收到「你好」回复,说明 token 和收发链路都对了。下一步把 AI 接进来处理文本。

Step 3:把 AI 接进来当大脑

3 用户说什么,AI 答什么

把 echo 换成「调大模型」,用 DeepSeek/通义都行:

from openai import OpenAI
client = OpenAI(api_key=..., base_url="https://api.deepseek.com")

async def chat(update: Update, ctx: ContextTypes.DEFAULT_TYPE):
    user_text = update.message.text
    r = client.chat.completions.create(
        model="deepseek-chat",
        messages=[{"role":"user","content":user_text}],
    )
    await update.message.reply_text(r.choices[0].message.content)

回复长度限制:Telegram 单条消息有长度上限,AI 回答过长要分段发,或先摘要再发。

Step 4:加「会话记忆」

4 让机器人记得你们聊过啥

用 chat_id 当 key,把历史攒在内存(生产用数据库):

history = {}  # chat_id -> [消息列表]

async def chat(update, ctx):
    cid = update.message.chat_id
    history.setdefault(cid, [])
    history[cid].append({"role":"user","content":update.message.text})
    r = client.chat.completions.create(model="deepseek-chat", messages=history[cid])
    a = r.choices[0].message.content
    history[cid].append({"role":"assistant","content":a})
    await update.message.reply_text(a)
🔑 多轮记忆很自然,但要设上限(如最近 20 轮),否则越聊越慢越贵;也可把旧内容总结压缩。

Step 5:加命令菜单与兜底

5 体验与安全都要有

加上 /start、/reset 命令,并对敏感场景做兜底:

1. /start:发欢迎语 + 功能说明
2. /reset:清空该用户 history(保护隐私)
3. 敏感问题:先识别再转人工,不随意作答
4. 限流:同一用户每分钟最多 N 条,防刷防烧钱

公开机器人必须有护栏:限流防恶意刷接口;涉及账号、支付、个人隐私的内容转人工;内容违规及时拦截。

Step 6:部署上线

本地跑只能你电脑开机才在线。要 7×24:

1. 长期运行:丢一台云服务器 / 容器,用 nohup 或 systemd 保活
2. Webhook 模式:比轮询更省资源(需公网 HTTPS 地址)
3. 调试用 ngrok:把本地暴露到公网,仅开发期使用
4. 监控:token 泄露告警、用量与错误日志
🚀 小提示:先用 run_polling 在笔记本上验证完整逻辑,再搬去服务器跑 Webhook,省去反复部署。

常见问题速查

现象大概率原因 & 解决
机器人不回消息token 错 / 没 run_polling / 被封
409 Conflict同一个 token 多处运行,只留一个
回复被截断超长度,分段发送或先摘要
被人刷爆额度加限流 + 用量监控
← 返回教程中心