之前一直用 server 酱配合微信实现消息推送,但是最近微信开始收紧,后期有无法使用的可能。于是在找替代品,常见的就是自建了,比如 iOS 平台使用 bark,安卓上的 gotify,更小众的有小米用自带的 mipush 等。但是用起来都需要自建服务,或者面临复杂的编写环境。一个合适的替代品是 telegram bot,支持多种语言,既操作简便又功能众多尤其是在 python 平台上,如果只想达到类似 server 酱的功能,那直接 post 即可。
以下使用 python3 环境为例,保姆级教程,从 bot 的申请到 python 脚本的 systemctl 配置都有。
申请 telegram bot
- 打开 bot 的生成链接 https://t.me/botfather (生成 bot 的地方叫 bot 之父而不是之母,可能预示了设计者是个俄罗斯人)。
- 点击 /newbot – create a new bot 生成新一个的 bot,系统会让你给它取一个名字,这里可以随便输入,反正方便记就可以了。
- 系统会再次让你取一个名字并输入,现在的名字必须以 bot 结尾,不可以和其他任何 bot 重名。这一步的名字类似于身份证号码,而前一布的名字类似于身份证上面的名字。身份证上的名字可以重复,但是身份证号码不允许重复。
- 一旦你输入的 bot 名字可用,系统会生成一个 token 给你,类似于 1689581149:AAGYVVjEHsaNjsnT8eQpWyshwr2o4PqU7u8,请务必保存好此 token 并且不泄露,这是唯一的用户凭证。
- 此时,你拥有了一个 bot,但是还无法使用,因为你知道它,它不知道你。这时候打开 https://t.me/iamthebot 这个链接,注意 iamthebot 为你刚才新建的 bot 的名字!点击 /start 进入对话框,发送 @userinfobot 后并点击它。userinfobot 的对话中,点击或者输入 /start,你将获取一个 Id/chat_id,具体表现为一串数字,比如 387980691。
至此,电报的机器人已经申请完成,你获得了机器人的 bot 名字,一个 token,还有一个 chat_id
python3 程序实现消息推送
- 电报机器人的功能众多,所以配置起来很复杂,好在我们只需要使用消息推送,所以选择使用 python3 和 pyTelegramBotAPI 来实现,程序写起来会很简单。
- 安装 pyTelegramBotAPI 方式为 pip3 install pyTelegramBotAPI,如果提示没有 pip 或者 pip3,请自行安装,每个 linux 系统可能都会有少许的差异,具体请百度 / 谷歌 / 必应 / 问别人都行,反正装上去就行了。
- 实例程序如下,其中 TOKEN 为你申请得到的 token,tb.send_message 中的数字为从 userinfobot 那里拿到的 ID/chat_id,text 为想要推送的消息。
import telebot
TOKEN = '1689581149:AAGYVVjEHsaNjsnT8eQpWyshwr2o4PqU7u8'
tb = telebot.TeleBot(TOKEN)
text = "I am the first telegram bot notification"
tb.send_message(387980691, text)
至此,运行这个 python3 程序,一个简单的消息推送已经实现了,你会在和这个机器人的对话框中收到机器人发送给你的消息。
电报机器人的实际使用案例
在树莓派上装了一个光敏传感器,用来判断是否有人开灯。每 10 秒检查一次光敏传感器的状态,如果发生开灯或者关灯动作,那就通过电报器人发送消息给我。程序依旧是 python3 和 pyTelegramBotAPI 配合,引入了 GPIO 读取光敏传感器反馈的状态,同时使用 systemctl 实现开机自启。能看到这一步或者有类似需求的,大概多少懂点程序和 linux 基础,我直接放出源码以供参考。
以下为主程序,为 GPIO 读取光敏传感器状态,以及电报机器人的消息推送部分。
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import telebot
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN)
TOKEN = '1689581149:AAGYVVjEHsaNjsnT8eQpWyshwr2o4PqU7u8'
tb = telebot.TeleBot(TOKEN)
# 0 is OFF
VALUE = 0
try:
while True:
nowtime=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
if GPIO.input(17):
if VALUE == 0:
pass
else:
VALUE = 0
text = "OFF!" + nowtime
tb.send_message(387980691, text)
else:
if VALUE == 1:
pass
else:
VALUE = 1
text = "ON!" + nowtime
tb.send_message(387980691, text)
time.sleep(10)
except:
text = "ERROR!"
tb.send_message(387980691, text)
以下为 systemctl 的 service 配置文件,我习惯性放入 /etc/systemd/system 中,并将上述 python 程序放入 /etc/lightelebot 文件夹中。
[Unit]
Description=Light Sensor Service
After=multi-user.target
[Service]
WorkingDirectory=/etc/lightelebot
User=root
Type=idle
ExecStart=/usr/bin/python3 /etc/lightelebot/lightelebot.py
Restart=always
[Install]
WantedBy=multi-user.target