Telegram 自动通知脚本运行结果

很多时候,运行一个耗时的脚本,像是编译或神经网络的拟合,我们并不想一直盯着屏幕到运行完成,希望能在脚本执行完成之后能够自动给我们发送结果,用 Telegram Bot 可以轻松实现自动化的消息提醒。

之前我也试过用 Email 的方式发送脚本运行结果,但需要用到 Python,相较而言更为复杂。

创建和使用 Telegram Bot

创建 Telegram Bot 非常简单。首先在 Telegram 中查找 BotFather,输入 /newbot,按照提示输入名称和 Bot 的唯一用户名之后即可创建成功,随即会得到一串 HTTP API Token,记下这个 Token。

Create Bot

前往你刚刚创建的 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

Hello

通过 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 创建了对话式聊天机器人等。

参考:

加载评论