如何创建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会需要输入密码,脚本里没法交互,推荐给运行脚本的用户配置免密码执行指定命令:
- 编辑sudoers文件:
sudo visudo - 在文件末尾添加一行(假设你的树莓派用户名是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
相关产品推荐
相关产品推荐

