很多时候,运行一个耗时的脚本,像是编译或神经网络的拟合,我们并不想一直盯着屏幕到运行完成,希望能在脚本执行完成之后能够自动给我们发送结果,用 Telegram Bot 可以轻松实现自动化的消息提醒。
之前我也试过用 Email 的方式发送脚本运行结果,但需要用到 Python,相较而言更为复杂。
创建和使用 Telegram Bot
创建 Telegram Bot 非常简单。首先在 Telegram 中查找 BotFather
,输入 /newbot
,按照提示输入名称和 Bot 的唯一用户名之后即可创建成功,随即会得到一串 HTTP API Token,记下这个 Token。
前往你刚刚创建的 Bot 的聊天界面,随便输入任何消息。之后在浏览器中打开链接 https://api.telegram.org/bot<TOKEN>/getUpdates
,找到你的 Chat ID。随后在浏览器中打开链接测试给自己的账号发送 Hello World
的消息:
https://api.telegram.org/bot<TOKEN>/sendMessage?chat_id=<CHAT_ID>&text=Hello%20World
通过 Bash 脚本发送消息
上面的例子是一个非常简单的 HTTP 请求,在 Bash 中用 cURL
可以很便捷的实现
1
2
| $ curl -s -X POST https://api.telegram.org/bot<TOKEN>/sendMessage \
-d chat_id=<CHAT_ID> -d text="Hello World"
|
这时候就可以创建一个简单的 Bash 脚本来自动发送消息了,创建如下的 send.sh
,只需 $ bash send.sh
即可自动发送消息。
1
2
3
4
5
6
7
8
| #!/bin/bash
TOKEN=<TOKEN>
CHAT_ID=<CHAT_ID>
MESSAGE="Hello World"
URL="https://api.telegram.org/bot$TOKEN/sendMessage"
curl -s -X POST $URL -d chat_id=$CHAT_ID -d text="$MESSAGE"
|
同样的,也可以发送文件:
1
2
3
4
5
6
| CAP="Run Script"
FILE="log.txt"
URL_FILE="https://api.telegram.org/bot${TOKEN}/sendDocument"
curl -s -X POST $URL_FILE -F chat_id=$CHAT_ID -F caption="$CAP" \
-F document=@"$FILE" > /dev/null
|
通用的消息提醒脚本
进一步,我想创建一个脚本 run.sh
的通用脚本,运行 $ bash run.sh cmd.sh
即可执行 cmd.sh
中的命令并在结束之后将结果发送到 Telegram
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| #!/bin/bash
HOST=`hostname`
DATETIME=`date "+%Y%m%d-%H%M%S"`
# Telegram bot settings
TOKEN=<TOKEN>
CHAT_ID=<CHAT_ID>
# URLs for sending messages and files
URL_MESSAGE="https://api.telegram.org/bot$TOKEN/sendMessage"
URL_FILE="https://api.telegram.org/bot$TOKEN/sendDocument"
# Log settings
THIS_PATH=`dirname "$0"`
LOG_FILE="$HOME/workspace/logs/$DATETIME.txt"
# Run the script
SCRIPT="`dirname "$0"`/$1"
[ -f $SCRIPT ] || { echo "$SCRIPT does not exist!" && exit 1; }
printf "$DATETIME\n" >> $LOG_FILE && cat $SCRIPT >> $LOG_FILE
bash $SCRIPT 2>&1 | tee -a $LOG_FILE
# Send log
CAP="Run on $HOST at $DATETIME"
curl -s -X POST $URL_FILE -F chat_id=$CHAT_ID -F caption="$CAP" -F document=@"$LOG_FILE" > /dev/null
# Send message
#curl -s -X POST $URL_MESSAGE -d chat_id=$CHAT_ID -d text="$MESSAGE"
|
其中,最重要的是 bash $SCRIPT 2>&1 | tee -a $LOG_FILE
,即将脚本的输出同时显示在终端并且保存到文件 $LOG_FILE
中。
此外,还可以集成 Seashells,将脚本运行结果实时输出到在线终端中,对于训练神经网络之类的任务能够更方便的查看。之后便可将 Seashells 的 URL 通过 Telegram 发送给自己,就可以实时查看脚本运行进度。
写在后面
上面展示了如何在 Bash 脚本中使用,同样也可以在 Python 中使用,GitHub 上已经有了现成的 wrapper:python-telegram-bot,能够直接 import。
Telegram Bot 还有更多玩法,不仅仅是用在发送脚本的消息提醒,比如结合 Microsoft Bot Framework 创建了对话式聊天机器人等。
参考: