把 Telegram 机器人部署到服务器,本质上是让一个常驻进程通过 Telegram Bot API 与用户交互。Python 和 Node.js 都提供了稳定的封装库,开发者不必直接拼接 HTTP 请求,可以把精力放在业务逻辑上。下面先梳理通用准备流程,再分别给出两种语言的可运行示例和部署配置。

一、创建机器人并获取 Token
所有 Telegram 机器人都需要先在 BotFather 处注册。打开 Telegram 搜索 @BotFather,发送 /newbot 命令,按提示填写机器人名称和用户名。用户名必须以 bot 结尾,例如 weather_notify_bot。创建成功后,BotFather 会返回一串形如 123456789:AAF... 的令牌,这个令牌是控制机器人的唯一凭证,必须妥善保存,不要提交到公开仓库。
拿到令牌后,建议先设置机器人的命令列表和描述。发送 /setcommands 给 BotFather,选择目标机器人,输入 start - 开始使用、help - 获取帮助、echo - 重复消息 等内容,每行一个命令。这一步不是必需的,但能提升使用体验。服务器方面,一台 1 核 1G 内存的 VPS 即可满足绝大多数机器人需求,操作系统选择 Ubuntu 20.04 或 22.04 即可。
正式开发前,还需确认服务器可以访问 Telegram API 域名 api.telegram.org。如果在国内服务器,可能需要配置代理或改用海外节点。测试连通性可以用 curl 命令:curl https://api.telegram.org/bot你的令牌/getMe,返回机器人信息即表示网络正常。
二、Python 方案:用 python-telegram-bot 实现
Python 生态中,python-telegram-bot 是目前维护最活跃的库之一。它同时支持同步和异步两种模式,从 20.x 版本开始推荐使用异步写法。安装依赖前,建议先创建虚拟环境,避免污染系统 Python。执行 pip install python-telegram-bot 即可,如果追求更快速度可以加上 -i 镜像参数。
下面是一个最小可运行示例,包含 /start 命令和普通文本回显。把其中的 YOUR_TOKEN 替换为 BotFather 返回的令牌:
<code>import asyncio
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters
TOKEN = "YOUR_TOKEN"
async def start(update: Update, context):
await update.message.reply_text("你好,我是机器人")
async def echo(update: Update, context):
text = update.message.text
await update.message.reply_text(f"你说的是:{text}")
def main():
app = Application.builder().token(TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))
print("机器人已启动")
app.run_polling()
if __name__ == "__main__":
main()</code>保存为 bot.py 后,直接 python bot.py 即可看到机器人上线。但仅靠前台运行并不稳定,SSH 断开后进程会退出。生产环境通常使用 systemd 将程序注册为系统服务。创建 /etc/systemd/system/telegram-bot.service 文件,内容如下:
<code>[Unit] Description=Telegram Python Bot After=network.target [Service] WorkingDirectory=/opt/telegram-bot ExecStart=/opt/telegram-bot/venv/bin/python /opt/telegram-bot/bot.py Restart=always RestartSec=5 User=botuser [Install] WantedBy=multi-user.target</code>
保存后执行 systemctl daemon-reload 和 systemctl enable --now telegram-bot 即可启动并设置开机自启。查看运行状态用 systemctl status telegram-bot。如果遇到错误,可以结合 journalctl -u telegram-bot -f 实时查看日志。对于需要处理大量并发的机器人,python-telegram-bot 也可以改用 Webhook 模式,但需要额外配置 HTTPS 证书,对个人项目来说轮询模式更省心。
三、Node.js 方案:用 node-telegram-bot-api 实现
Node.js 方向的 node-telegram-bot-api 是一个轻量级封装,支持轮询和 Webhook,调用方式非常直接。先初始化项目并安装依赖:
<code>mkdir telegram-bot cd telegram-bot npm init -y npm install node-telegram-bot-api</code>
创建 index.js,写入以下内容:
<code>const TelegramBot = require('node-telegram-bot-api');
const token = 'YOUR_TOKEN';
const bot = new TelegramBot(token, { polling: true });
bot.onText(/\/start/, (msg) => {
const chatId = msg.chat.id;
bot.sendMessage(chatId, '你好,我是 Node.js 机器人');
});
bot.on('message', (msg) => {
const chatId = msg.chat.id;
if (!msg.text || msg.text.startsWith('/')) return;
bot.sendMessage(chatId, `你说的是:${msg.text}`);
});
console.log('机器人已启动');</code>保存为 index.js 后,运行 node index.js 即可启动。为了保证长期在线,可以使用 PM2 进程管理器。安装命令 npm install -g pm2,然后执行 pm2 start index.js --name telegram-bot 和 pm2 save、pm2 startup。PM2 崩溃后会自动拉起进程,并且提供 pm2 logs 查看实时输出。如果系统已经使用 systemd,也可以创建类似 Python 方案的服务单元,只需把 ExecStart 改成 node /opt/telegram-bot/index.js 即可。
四、两种方案对比与选择建议
Python 和 Node.js 都能很好地完成 Telegram 机器人开发,但在具体场景下体验会有差异。Python 的 python-telegram-bot 库抽象层次更高,命令和消息处理机制完善,适合逻辑较复杂的机器人,例如需要调用数据分析、机器学习模型或内部业务系统的场景。Node.js 则胜在启动快、内存占用低,如果你的团队本来就熟悉 JavaScript,或者机器人需要频繁调用前端接口,选 Node.js 会更加顺手。
下表从几个维度做了直观对比:
| 对比维度 | Python | Node.js |
|---|---|---|
| 开发库 | python-telegram-bot | node-telegram-bot-api |
| 异步支持 | 原生 asyncio,写法稍复杂 | 事件驱动,回调自然 |
| 内存占用 | 中等,依赖较多 | 更低,启动更快 |
| 生态整合 | 数据处理、AI 库丰富 | Web 生态紧密 |
| 部署复杂度 | 需管理虚拟环境 | 需管理 node_modules |
如果只是做定时推送、消息提醒或小型群管机器人,两者区别不大,选自己更熟悉的语言即可。打算长期维护、不断增加功能的话,Python 的类型提示和丰富库支持会让重构更安心;追求轻量和快速响应,Node.js 则更灵活。
五、用 Docker 实现容器化部署
如果不想在服务器上手动配置环境,Docker 是很好的选择。把应用打包成镜像后,无论换到哪台机器,一条命令就能恢复运行。以 Python 机器人项目为例,先创建 requirements.txt 写入 python-telegram-bot,再创建 Dockerfile:
<code>FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY bot.py . CMD ["python", "bot.py"]</code>
构建并运行:
<code>docker build -t telegram-bot . docker run -d --name telegram-bot --restart unless-stopped telegram-bot</code>
Node.js 的 Dockerfile 类似,基础镜像换成 node:18-alpine,把 npm install 和启动命令替换即可。容器化部署的好处是依赖隔离和版本统一,升级时重新构建镜像即可。但要注意容器内时区问题,涉及定时任务时需要挂载 /etc/localtime 或设置 TZ 环境变量,否则定时消息可能偏差数小时。
六、常见问题与排错
机器人上线后最常遇到的问题是 getUpdates 冲突。如果一个令牌同时被多个进程轮询,Telegram 会返回 409 Conflict 错误。解决方法是停掉所有旧进程,只保留一个轮询实例,或在代码中主动调用 deleteWebhook 清除 Webhook 状态。还有一种情况是机器人突然不响应,可以先手动调用 getMe 接口确认令牌是否有效,再用 getUpdates 查看是否有堆积的更新。
网络与防火墙也可能导致请求超时。如果你的服务器位于国内,建议配置可访问 api.telegram.org 的代理,并在代码中设置连接超时和重试。生产环境务必打开自动重启:systemd 的 Restart=always 或 Docker 的 --restart unless-stopped 都能有效防止进程意外退出后失联。日志方面,systemd 和 Docker 都提供了标准输出采集,遇到异常先把相关日志完整保留下来,再根据错误码定位问题。
最后提醒一句,机器人令牌等同于账号密码,不要在截图、日志或前端代码中暴露。如果怀疑令牌泄露,可以到 BotFather 使用 /revoke 命令快速撤销并生成新令牌,然后更新服务器配置即可。日常操作加上最小权限原则,足以避免大部分安全风险。

