Telegram 的 Bot API 允许程序通过 HTTPS 收发消息,而当前主流的大模型服务基本都提供兼容 OpenAI 格式的 HTTP 接口。把这两个接口连起来,个人就能拥有一个不需要手动打开网页、在手机聊天窗口里随时问答的 AI 助手。下文使用 Python 实现,从创建机器人、编写消息处理回调,到接入模型、处理多轮上下文,最后讨论部署细节。

一、创建机器人并准备 Access Token
在 Telegram 中搜索 @BotFather,发送 /newbot 命令,按提示输入机器人名称和用户名。创建成功后,BotFather 会返回一串形如 123456789:AA... 的 token。这串 token 等同于机器人控制权,不能提交到公开仓库。建议放在项目根目录的 .env 文件里,并通过 python-dotenv 读取。
AI API 这边可以去 OpenAI、DeepSeek、Moonshot 等平台申请 Key。如果暂时没有 Key,也可以用本地 Ollama 暴露的兼容接口做测试。无论哪种方式,都需要准备三样信息:API Key、请求地址、模型名称。下面的 .env 文件示例展示了最小配置。
TELEGRAM_BOT_TOKEN=123456789:AAFakeTokenExample AI_API_KEY=sk-your-api-key-here AI_BASE_URL=https://api.openai.com/v1 AI_MODEL=gpt-4o-mini
把敏感信息放在环境变量中还有一个好处:在不同机器上部署时,不需要改动主程序,只需调整 .env 文件即可。注意 .env 文件应加入 .gitignore,避免被版本控制工具记录。
二、使用 python-telegram-bot 编写消息处理逻辑
Python 生态里常用的 Telegram Bot 库有两个:aiogram 和 python-telegram-bot。本文选择 python-telegram-bot v21 以上版本。安装命令如下:pip install python-telegram-bot openai python-dotenv。这个库采用异步回调模式,当用户发送消息时,框架会调用我们注册的函数。
下面的代码创建了 Application 实例,注册 /start 命令和普通文本消息处理器。start 函数返回一句欢迎语,handle_message 则把用户输入转发给下一节的 AI 函数,并把模型返回内容发回聊天窗口。
import os
from dotenv import load_dotenv
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters
load_dotenv()
async def start(update: Update, context):
await update.message.reply_text("你好,我是你的 AI 助手,直接发送问题即可。")
async def handle_message(update: Update, context):
user_text = update.message.text
if not user_text:
return
reply = await get_ai_reply(str(update.effective_user.id), user_text)
await update.message.reply_text(reply)
def main():
app = Application.builder().token(os.getenv("TELEGRAM_BOT_TOKEN")).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
app.run_polling()
if __name__ == "__main__":
main()
这里需要说明,filters.TEXT & ~filters.COMMAND 的含义是:只处理普通文本消息,跳过以 / 开头的命令。长轮询方式适合开发和低负载场景,程序会不断询问 Telegram 服务器是否有新消息。如果用户量增加,可以切换到 Webhook 模式,让 Telegram 主动推送消息到你的服务器,延迟更低。
另外,reply_text 默认会保留 Markdown 格式,但 AI 返回的文本可能包含特殊字符,因此我们采用纯文本模式发送,避免解析失败。实际测试时,可以先让机器人重复用户输入,确认消息链路正常,再接入 AI 接口。
三、接入 AI API 并维护多轮对话上下文
大模型接口通常使用聊天补全格式,请求体中包含 messages 数组,每个元素包含 role 和 content。为了让机器人具备连续对话能力,不能只发送当前问题,需要把历史消息一起发送。最简单的方式是在内存中为每个用户维护一个消息列表,每次请求时把列表传给 API,响应返回后再追加 assistant 消息。
下面的 get_ai_reply 函数使用 openai 库的 AsyncOpenAI 客户端。注意 base_url 必须指向正确的兼容路径,例如 OpenAI 官方是 https://api.openai.com/v1,DeepSeek 可能是 https://api.deepseek.com/v1。调用时设置超时时间为 60 秒,避免模型响应过慢导致整个机器人卡住。
import os
from openai import AsyncOpenAI
client = AsyncOpenAI(
api_key=os.getenv("AI_API_KEY"),
base_url=os.getenv("AI_BASE_URL"),
)
user_sessions = {}
async def get_ai_reply(user_id: str, user_text: str):
if user_id not in user_sessions:
user_sessions[user_id] = [
{"role": "system", "content": "你是一个乐于助人的个人助手。"}
]
messages = user_sessions[user_id]
messages.append({"role": "user", "content": user_text})
try:
response = await client.chat.completions.create(
model=os.getenv("AI_MODEL"),
messages=messages,
temperature=0.7,
max_tokens=1024,
)
reply = response.choices[0].message.content.strip()
except Exception as exc:
reply = f"AI 服务调用失败:{exc}"
messages.append({"role": "assistant", "content": reply})
# 控制上下文长度,防止 token 无限增长
if len(messages) > 21:
del messages[1:3]
return reply
代码中的 user_sessions 字典以用户 ID 为键。使用内存存储的缺点是进程重启后会丢失,如果希望长期保存会话,可以替换为 Redis 或 SQLite。上下文截断策略很关键:当消息数量超过一定范围时,只删除最早的几轮对话,同时保留 system 消息。实际场景中更推荐按 token 数量裁剪,而不是直接按条数删除。
还有一个容易忽略的问题:Telegram 用户 ID 是整数,但异步函数参数中我们把它转成字符串,避免字典键类型不一致。异常处理部分虽然简单,但可以防止 AI 接口返回超时或限流时整个程序崩溃。后续可以加入重试机制和指数退避,让服务更稳定。
四、部署与测试:从本地运行到云服务器
本地开发时直接执行 python main.py 即可。机器人上线后,需要保持进程常驻。云服务器上推荐使用 systemd 管理服务。创建 /etc/systemd/system/telegram-ai.service 文件,写入以下内容。
[Unit] Description=Telegram AI Assistant Bot After=network.target [Service] User=www-data WorkingDirectory=/opt/telegram-ai EnvironmentFile=/opt/telegram-ai/.env ExecStart=/usr/bin/python3 main.py Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
保存后运行 sudo systemctl enable telegram-ai && sudo systemctl start telegram-ai。使用 journalctl -u telegram-ai -f 查看实时日志。如果出现 token 无效或网络错误,先检查 .env 文件是否放在正确目录,并确认服务器可以访问 Telegram API 和 AI 服务所在域名。部分云服务器访问 OpenAI 接口可能不稳定,可以配置 HTTP 代理环境变量,或在 AI_BASE_URL 中填写中转地址。
测试阶段可以先在 Telegram 里发送 /start,再发送一个简单问题,例如“用一句话解释什么是 Webhook”。如果收到合理回复,说明整条链路已经打通。后续可以增加 /clear 命令清空上下文、限制用户频率、添加群聊支持等。个人助手机器人的扩展方向很多,但上述基础结构足以支撑大多数轻量场景。
Telegram BotAI API聊天机器人修改时间:2026-10-02 01:09:56