You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建Telegram机器人实现消息发送及向树莓派下发命令

实现Telegram机器人控制树莓派+消息发送的Python方案

嘿,刚好我之前折腾过类似的需求,用Python完全能搞定,步骤不算复杂,我给你拆解成几个核心部分一步步来:

一、前期准备

首先确保你的树莓派上已经装了Python3,然后安装Telegram机器人开发最常用的库:

pip3 install python-telegram-bot --upgrade

你已经从BotFather拿到的机器人TOKEN留好,后面要用到。

二、基础消息发送&回复功能

先搭一个最基础的机器人框架,实现接收消息、自动回复,同时能记录用户ID方便后续主动发消息:

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

# 替换成你的机器人TOKEN
BOT_TOKEN = "你的BotFather给的TOKEN"
USER_CHAT_ID = None

# 处理/start初始化命令
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    global USER_CHAT_ID
    USER_CHAT_ID = update.effective_chat.id
    await update.message.reply_text("嘿!我是你的树莓派控制机器人~ 发送/commandPi来执行系统更新命令!")

# 处理普通消息的自动回复
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text(f"你说的是:{update.message.text}")

# 主动发消息的工具函数(后续可以在其他逻辑里调用)
async def send_active_message(context: ContextTypes.DEFAULT_TYPE, content: str):
    if USER_CHAT_ID:
        await context.bot.send_message(chat_id=USER_CHAT_ID, text=content)

def main():
    # 创建机器人应用实例
    application = ApplicationBuilder().token(BOT_TOKEN).build()

    # 注册命令和消息处理器
    application.add_handler(CommandHandler("start", start))
    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, echo))

    # 启动机器人(轮询模式,适合树莓派这种低功耗设备)
    application.run_polling()

if __name__ == "__main__":
    main()

运行这个脚本后,给机器人发消息它会自动回复,发/start能初始化你的用户ID,方便后续机器人主动给你发通知。

三、添加树莓派命令执行功能

接下来扩展/commandPi指令,让它执行sudo apt-get update,这里用subprocess模块调用系统命令,同时处理权限和输出问题:

先添加命令处理函数:

import subprocess

# 处理/commandPi命令,执行系统更新
async def command_pi(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("正在执行系统更新命令,请稍等...")
    try:
        # 执行sudo apt-get update,捕获输出和错误
        result = subprocess.run(
            ["sudo", "apt-get", "update", "-y"],
            capture_output=True,
            text=True,
            timeout=300  # 设置5分钟超时,避免命令卡住
        )
        # 根据执行结果返回内容
        if result.returncode == 0:
            output = result.stdout
            # Telegram单条消息有长度限制,太长就存本地
            if len(output) > 4096:
                await update.message.reply_text("命令执行完成!输出过长已保存到本地update_log.txt")
                with open("update_log.txt", "w") as f:
                    f.write(output)
            else:
                await update.message.reply_text(f"执行成功结果:\n`{output}`", parse_mode="Markdown")
        else:
            await update.message.reply_text(f"执行出错:\n`{result.stderr}`", parse_mode="Markdown")
    except subprocess.TimeoutExpired:
        await update.message.reply_text("命令执行超时啦,请稍后再试!")
    except Exception as e:
        await update.message.reply_text(f"未知错误:{str(e)}")

然后在main()里注册这个命令处理器:

application.add_handler(CommandHandler("commandPi", command_pi))

关于sudo权限的小技巧

直接用sudo会需要输入密码,脚本里没法交互,推荐给运行脚本的用户配置免密码执行指定命令:

  1. 编辑sudoers文件:sudo visudo
  2. 在文件末尾添加一行(假设你的树莓派用户名是pi):
    pi ALL=(ALL) NOPASSWD: /usr/bin/apt-get update
    

这样pi用户执行sudo apt-get update就不用输密码了,而且只开放这一个命令的权限,相对安全。

四、必须注意的安全事项

  • 绝对不要让机器人执行用户输入的任意命令:只能预设固定指令(比如/commandPi对应update,/commandPiUpgrade对应upgrade),防止被恶意利用控制你的树莓派。
  • 限制访问权限:可以在代码里加判断,只有你自己的chat_id才能执行命令,把陌生人挡在外。
  • 定期更新系统和依赖库,避免安全漏洞。

五、运行测试

把所有代码整合好,在树莓派上执行:

python3 your_bot_script.py

然后打开Telegram给机器人发/start,再发/commandPi,就能看到命令执行的结果啦。

内容的提问来源于stack exchange,提问作者Chuflitas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:37:27