不会编程用 AI 做 Telegram 机器人:从零到上线(2026)
如果你想用 AI 做出第一个「真的有人用」的产品,Telegram 机器人是性价比最高的起点:不用做前端界面、不用备案、不用买域名,一个几十行的脚本挂上去就能被全世界的人用。而这几十行代码,现在完全可以让 AI 帮你写。这篇教程带你用 AI 从零做出一个 Telegram 机器人并真正部署上线——包含拿 token、生成代码、接大模型、选部署方式的全过程,也包含国内开发者绕不开的网络问题怎么解决。全程命令可复制,不会编程也能跟着做完。
开始前必须知道的前提
Telegram 在中国大陆无法直接访问,`api.telegram.org` 同样被阻断。这意味着:你本机开发需要有稳定的代理,机器人上线后**必须部署在境外**(海外 VPS 或 Cloudflare Workers 这类边缘平台),不能放在阿里云/腾讯云的国内节点。这不是配置问题,是硬约束,先想清楚再动手。
为什么 Telegram 机器人适合作为第一个 AI 练手项目
- 零界面成本。 聊天框就是你的 UI,省掉了整个前端,这恰恰是新手最容易卡死的部分。
- 接口极其简单。 Telegram Bot API 就是一堆 HTTP 请求,AI 对它非常熟悉,生成的代码首次跑通率很高。
- 免费部署真的免费。 Cloudflare Workers 免费额度每天 10 万次请求,个人机器人一辈子也用不完。
- 反馈闭环短。 改完代码重新部署,切回聊天窗口发一条消息就能验证,不用等构建、不用刷新缓存。
- 天然适合 AI 场景。 问答助手、内容摘要、定时提醒、监控告警,这些都是 30 行代码就能落地的真实需求。
动手前先定三件事
别一上来就让 AI 写代码。先花两分钟把这三个选择定下来,后面能少走很多弯路——因为这三项决定了 AI 该给你生成什么样的代码。
| 要决定的事 | 选项 | 建议 |
|---|---|---|
| 用什么语言和框架 | Python 的 python-telegram-bot / aiogram,TypeScript 的 grammY | 完全新手选 Python + python-telegram-bot(资料最多);想白嫖 Cloudflare 免费部署选 grammY |
| 机器人怎么收消息 | 长轮询(主动问)/ Webhook(被动收) | 本机开发和调试用长轮询,上线后能用 Webhook 就用 Webhook |
| 部署到哪里 | Cloudflare Workers / 海外 VPS / Render 等平台 | 只做轻量问答用 Cloudflare Workers(免费);要跑定时任务或存文件用 VPS |
两条最省事的组合
**新手最快路线**:Python + python-telegram-bot + 长轮询 + 海外 VPS。代码最短、报错资料最全。 **零成本路线**:TypeScript + grammY + Webhook + Cloudflare Workers。一分钱不花,但需要接受 serverless 的限制(不能跑常驻定时任务)。
第一步:找 BotFather 要一个 token
Telegram 上所有机器人都由一个叫 BotFather 的官方机器人创建。这一步不写任何代码,纯聊天完成:
- 1在 Telegram 搜索
@BotFather,认准带蓝色认证勾的那个(同名假号很多)。 - 2发送
/newbot。 - 3输入机器人的显示名称,例如「我的 AI 助手」,这个可以是中文、之后能改。
- 4输入机器人的用户名,必须以 `bot` 或 `_bot` 结尾且全局唯一,例如
my_ai_helper_bot。 - 5BotFather 会返回一串形如
8123456789:AAF...的 token——这就是你机器人的密码,泄露了别人就能完全接管它。
顺手把这几个也配了,体验会好很多:
/setdescription 设置机器人简介(用户首次打开时看到的说明)
/setabouttext 设置资料卡里的简短介绍
/setuserpic 设置头像
/setcommands 设置命令菜单,用户输入 / 时会自动提示
/token 重新查看 token
/revoke token 泄露了用这个作废重发token 绝对不能提交进 Git
最常见的翻车方式:AI 生成的示例代码把 token 直接写在源码里,你顺手 push 到了 GitHub 公开仓库。Telegram 有扫描机制,token 泄露后机器人几分钟内就可能被人接管去发垃圾信息。**永远用环境变量存 token**,并把 `.env` 写进 `.gitignore`。
第二步:让 AI 写出第一个能跑的机器人
现在打开你用的 AI 编程工具(Claude Code、Codex、Qwen Code、iFlow 都行,没装的话可以先看 免费国产平替 CLI 实测 挑一个)。给 AI 提需求时,把上一步定下的三个选择明确写进提示词,这是首次生成就能跑通的关键:
帮我写一个 Telegram 机器人,要求:
1. 用 Python + python-telegram-bot 最新版(v22.x),异步写法
2. 用长轮询(run_polling)接收消息,不用 webhook
3. token 从环境变量 BOT_TOKEN 读取,不要硬编码
4. 支持 /start 命令回复一句欢迎语
5. 收到任何文本消息就原样回复一遍(先跑通链路)
6. 给我一份 requirements.txt 和运行说明
注意:python-telegram-bot v20 之后 API 改动很大,请用 ApplicationBuilder 的新写法,
不要用 Updater / dispatcher 那套旧 API。最后那句提醒很重要——网上大量教程还停留在 v13 时代的旧 API,模型很容易被这些过时资料带偏,生成一份根本装不上的代码。正确的现代写法长这样(截至 2026 年 8 月,python-telegram-bot 最新版本为 v22.8):
import os
from telegram import Update
from telegram.ext import (
ApplicationBuilder, CommandHandler, MessageHandler,
ContextTypes, filters,
)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("你好,我是你的 AI 助手,直接发消息给我就行。")
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(f"你说的是:{update.message.text}")
if __name__ == "__main__":
app = ApplicationBuilder().token(os.environ["BOT_TOKEN"]).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
app.run_polling()跑起来:
python3 -m venv venv
source venv/bin/activate # Windows 用 venv\Scripts\activate
pip install -U python-telegram-bot
export BOT_TOKEN="你的token" # Windows PowerShell 用 $env:BOT_TOKEN="..."
python bot.py回到 Telegram 找到你的机器人,发一句 /start,能收到回复就说明链路通了。这一步跑通比什么都重要——先让最简单的版本跑起来,再往上加功能,这样出问题时你永远知道是刚加的那部分坏了。
第三步:接上大模型,让它真的会聊天
把 echo 换成调用大模型就行。国内用户建议直接接 DeepSeek、GLM、Kimi 这类兼容 OpenAI 接口的国产模型——便宜、无需代理、速度也快(各家 API 的配置方式可参考 Claude Code 接入国产模型教程 里的网关地址部分)。核心改动就这么点:
import os
from openai import AsyncOpenAI
from telegram import Update
from telegram.constants import ChatAction
from telegram.ext import ContextTypes
client = AsyncOpenAI(
api_key=os.environ["LLM_API_KEY"],
base_url=os.environ.get("LLM_BASE_URL", "https://api.deepseek.com/v1"),
)
async def chat(update: Update, context: ContextTypes.DEFAULT_TYPE):
# 先发"正在输入",避免用户以为机器人死了
await context.bot.send_chat_action(update.effective_chat.id, ChatAction.TYPING)
# 用 chat_data 保存这个会话的历史,实现多轮对话
history = context.chat_data.setdefault("history", [])
history.append({"role": "user", "content": update.message.text})
resp = await client.chat.completions.create(
model=os.environ.get("LLM_MODEL", "deepseek-chat"),
messages=[{"role": "system", "content": "你是一个简洁友好的助手,回答控制在 300 字以内。"}]
+ history[-10:], # 只带最近 10 条,防止 token 爆炸
)
answer = resp.choices[0].message.content
history.append({"role": "assistant", "content": answer})
await update.message.reply_text(answer)- 一定要发 typing 状态。 大模型响应要几秒,没有这个提示用户会以为机器人挂了。
- 历史消息要截断。
history[-10:]这类限制必须加,否则聊得越久越贵,最后直接超出上下文窗口报错。 - Telegram 单条消息上限 4096 字符。 模型输出太长会直接发送失败,记得让 AI 帮你加分段发送的逻辑。
- 加个用量限制。 机器人是公开的,任何人都能找到它。不加限制的话,你的 API key 可能一夜之间被跑光——按
update.effective_user.id做个每日次数上限即可。
第四步:长轮询还是 Webhook?
这是新手最容易困惑的一步,其实区别很简单:长轮询是你的程序反复问 Telegram「有新消息吗」,Webhook 是 Telegram 有消息了主动推给你。
| 对比项 | 长轮询 Long Polling | Webhook |
|---|---|---|
| 需要公网域名 | 不需要 | 需要,且必须是 HTTPS |
| 需要常驻进程 | 需要,程序得一直开着 | 不需要,可以用 serverless |
| 本机开发调试 | 非常方便,改完直接跑 | 麻烦,得用内网穿透 |
| 响应延迟 | 略高(取决于轮询间隔) | 更低,几乎实时 |
| 能否白嫖免费平台 | 较难,多数免费平台不给常驻进程 | 可以,Cloudflare Workers 等完美适配 |
| 适合 | 开发阶段、VPS 部署、要跑定时任务 | 正式上线、追求零成本、消息量大 |
实用结论:开发时用长轮询,上线切 Webhook。同一份业务逻辑,两种模式只是入口不同,让 AI 帮你改造几分钟就能完成。注意两者不能同时开启——设置了 Webhook 之后长轮询会直接报冲突错误(409 Conflict),这是新手最常见的报错之一,用 deleteWebhook 清掉即可。
# 设置 Webhook
curl "https://api.telegram.org/bot<你的TOKEN>/setWebhook?url=https://your-worker.workers.dev"
# 查看当前 Webhook 状态和最近的错误(排查神器)
curl "https://api.telegram.org/bot<你的TOKEN>/getWebhookInfo"
# 删掉 Webhook,切回长轮询
curl "https://api.telegram.org/bot<你的TOKEN>/deleteWebhook"第五步:部署上线
路线 A:Cloudflare Workers(免费,推荐轻量机器人)
Cloudflare Workers 的免费额度是每天 10 万次请求、每次调用 10ms CPU 时间(额度在 UTC 00:00 重置,超出会返回 1027 错误)。个人机器人根本用不完,而且它在境外、天然绕开了国内访问不了 Telegram 的问题。配合 TypeScript 的 grammY 框架最顺:
import { Bot, Context, webhookCallback } from "grammy";
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
const bot = new Bot(env.BOT_TOKEN, { botInfo: JSON.parse(env.BOT_INFO) });
bot.command("start", async (ctx: Context) => {
await ctx.reply("你好,我是跑在 Cloudflare 上的机器人。");
});
bot.on("message:text", async (ctx: Context) => {
await ctx.reply(`收到:${ctx.message?.text}`);
});
return webhookCallback(bot, "cloudflare-mod")(request);
},
};部署命令:
npm create cloudflare@latest my-tg-bot
cd my-tg-bot
npm install grammy
# token 存成加密 secret,不会出现在代码里
npx wrangler secret put BOT_TOKEN
# 部署
npx wrangler deploy
# 拿到 workers.dev 域名后,注册 webhook
curl "https://api.telegram.org/bot<你的TOKEN>/setWebhook?url=https://my-tg-bot.<你的子域>.workers.dev"关于 BOT_INFO
grammY 在 Workers 上要求预先提供机器人信息,避免每次冷启动都去问 Telegram。执行 `curl https://api.telegram.org/bot<TOKEN>/getMe`,把返回结果里 `result` 字段的 JSON 原样填进 `wrangler.toml` 的 `BOT_INFO` 变量即可。
路线 B:海外 VPS(要跑定时任务、要存数据就选它)
如果机器人需要定时推送、需要读写本地文件、需要跑长时间任务,serverless 就不合适了,老老实实用一台境外小鸡(每月几美元的最低配就够)。用 systemd 托管,保证挂了自动重启、开机自启:
sudo tee /etc/systemd/system/tgbot.service > /dev/null <<'EOF'
[Unit]
Description=Telegram Bot
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/mybot
EnvironmentFile=/home/ubuntu/mybot/.env
ExecStart=/home/ubuntu/mybot/venv/bin/python bot.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now tgbot
sudo systemctl status tgbot # 看运行状态
journalctl -u tgbot -f # 实时看日志,排查必用国内开发者的三个特殊坑
- 1本机开发连不上 api.telegram.org。 不用改代码结构,python-telegram-bot 支持直接配代理:
ApplicationBuilder().token(TOKEN).proxy("http://127.0.0.1:7890").get_updates_proxy("http://127.0.0.1:7890").build()。注意两个都要配——proxy()管发送消息,get_updates_proxy()管拉取更新,只配一个会出现「能收不能发」或反过来的怪现象。 - 2别把机器人部署在国内服务器上。 有人会想用反向代理把
api.telegram.org代理到国内,技术上可行(Cloudflare Workers 反代或自己用 Nginx 搭),但多了一跳、稳定性差、证书还得单独处理。既然 Cloudflare Workers 免费、海外 VPS 也就几美元,没必要给自己找麻烦。 - 3服务器时区会坑定时任务。 海外 VPS 默认多是 UTC,你写「每天早上 8 点推送」结果变成下午 4 点。部署后先跑一句
sudo timedatectl set-timezone Asia/Shanghai,或者在代码里显式指定时区,别依赖系统默认。
上线前的自检清单
- token 存在环境变量里,源码里搜不到,
.env已进.gitignore。 - 加了用户级别的调用频率限制,防止 API key 被陌生人跑爆。
- 长消息做了分段,不会因为超过 4096 字符发送失败。
- 调用大模型的地方包了 try/except,超时或报错时给用户一句友好提示而不是静默失败。
- 对话历史做了条数截断,长期聊天不会无限膨胀。
- 部署后用
getWebhookInfo确认没有堆积的错误。 - 找一个朋友用他的账号测一遍——你自己测不出「新用户第一次打开」的问题。
做完这一个机器人,你其实已经完整走过了一遍软件交付的全流程:需求拆解 → AI 生成代码 → 本地调试 → 选择架构 → 部署上线 → 排查故障。这套流程换成小程序、Chrome 插件、桌面应用也是一样的骨架,只是壳不同。真正决定你能不能做出「能交付的产品」而不只是「能跑的 demo」的,是这套流程的熟练度。想系统地把它练成肌肉记忆,欢迎来 IMAI 看看我们的体系化实战课程。
想系统学会用 AI 编程,从入门到做出真实产品?
查看系统课程