开发 Telegram Bot 的第一步是通过官方的 BotFather 创建机器人并获取 API Token。这个 Token 是 Bot 的身份证,所有 API 调用都需要带上它。
@BotFather 并开始对话/newbot 命令,按提示输入 Bot 名称和用户名(用户名必须以 bot 结尾)123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11Bot 需要知道给谁发消息。你自己的 Chat ID 可以通过调用 getUpdates API 获取:
返回结果中找到 message.chat.id 字段,那个数字就是你的 Chat ID(通常是一串正整数)。
@userinfobot,给它发条消息,它会直接返回你的 ID。Bot Token 和 Chat ID 是 Bot 开发中最重要的两个凭证,务必妥善保管。在 Termux 原生环境或 proot Ubuntu 中都可以安装。推荐使用 v22.7 版本(2026 年 6 月最新稳定版),它基于 Python asyncio,完全异步:
从 v20 开始,python-telegram-bot 全面转向 asyncio 异步架构。这意味着所有 Handler 函数都要用 async def 定义,调用 Bot API 方法时要加 await。
先写一个最简 Bot,收到 /start 命令时回复欢迎消息:
运行前先设置环境变量,避免把 Token 硬编码在代码里:
Bot 启动后,在 Telegram 里给它发 /start,就能收到自动回复。按 Ctrl+C 可以停止 Bot。
awaitBot 的核心是「收到消息 → 做出响应」的闭环。除了斜杠命令,Bot 还能处理普通文本、图片、文件等各种消息类型。本节介绍常用的消息处理器。
| Handler | 用途 | 示例 |
|---|---|---|
| CommandHandler | 处理斜杠命令 | /start /help |
| MessageHandler + filters | 处理普通消息 | 文本、图片、文件、语音 |
| CallbackQueryHandler | 处理内联按钮点击 | InlineKeyboardButton |
| ConversationHandler | 多步对话流程 | 填表、向导式交互 |
给 Bot 添加 /status 命令,用来查看 Termux 系统状态,以及 /echo 命令回显文字:
~filters.COMMAND 可以排除掉斜杠命令消息。内联按钮(Inline Keyboard)是 Bot 交互的核心组件,点击按钮会触发 CallbackQuery,Bot 收到后可以更新消息内容、弹出提示或执行操作。
用 InlineKeyboardMarkup 和 InlineKeyboardButton 构建按钮,每个按钮绑定一个 callback_data 作为回调标识:
用户点击按钮后,Bot 会收到 CallbackQuery,需要用 CallbackQueryHandler 来处理。注意必须调用 answer_callback_query,否则按钮会一直显示加载状态:
edit_message_text 会原地修改消息内容(替换按钮菜单为结果),适合减少聊天记录刷屏。如果想保留原消息直接回复,用 query.message.reply_text()。掌握基础后,来实现几个真正实用的功能:AI 对话助手、文件传输、定时推送消息。这些功能组合起来,就能打造一个强大的个人助手 Bot。
结合第 18 篇学过的 LLM API,给 Bot 加上 AI 对话能力。用户发消息,Bot 调用大模型 API 返回回答:
Bot 可以接收用户发来的文件并保存到 Termux,也能把 Termux 上的文件发送给用户。这是远程管理手机文件的便捷方式:
利用 python-telegram-bot 的 JobQueue 可以实现定时任务,比如每天早上推送天气预报、定时提醒等。JobQueue 是内置的,无需额外安装:
run_once 一次性任务run_repeating 周期性任务(秒级间隔)run_daily 每日定时任务(指定时间)run_monthly 每月定时任务
Bot 写好了,但手机屏幕一关、Termux 一进后台就被杀掉怎么办?本节讲如何让 Bot 24 小时稳定运行,以及如何做好安全防护,防止 Bot 被滥用。
最基础的保活方案:用 tmux 让 Bot 在后台会话中运行,再配合 termux-wake-lock 防止 CPU 休眠:
即使有 wake-lock,Android 系统在内存紧张时仍可能杀掉 Termux。用 termux-job-scheduler 可以每隔一段时间唤醒 Termux 并检查 Bot 是否还在运行,不在就重启: