如何在Ubuntu18.04上使用DiscordWebhooks获取网站状态通知

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Apache 软件基金会 来接受捐赠。

介绍

当您拥有关键网站时,您会想知道它们何时遇到任何问题,以便在对用户产生影响之前修复它们。 接收通知的一种方法是通过基于文本的聊天系统设置警报。

Discord 是一个类似于 Slack 的托管聊天系统。 使用 Discord,您可以设置一个免费的消息系统,让您可以通过文本消息、图像、音频和视频进行交流。 虽然它提供高级功能,但您可以 免费注册 ,它有适用于 Windows、macOS、Linux、Android 和 iOS 的客户端。

在本教程中,您将配置自己的 Discord 服务器、创建 Discord webhook、编写检查网站列表状态的 Bash 脚本,并测试从服务器到 Discord 频道的通知。

先决条件

在开始本指南之前,您需要以下内容:

第 1 步 — 设置 Discord Webhook

打开 Discord 帐户后,您可以创建自己的私人 Discord 服务器。

首先,在浏览器中登录您的Discord帐户启动您的Discord应用程序并单击创建服务器按钮。

然后为您的服务器选择一个名称并单击 创建服务器 按钮。

接下来,您将配置 Discord Webhook。 Webhook 是可用于将服务链接在一起的唯一 URL。 Discord 的 webhook 允许您自动发送消息并将数据更新发送到 Discord 文本频道。

在本教程中,当您的服务器上的特定服务出现故障时,您将向您的 webhook 发送通知,Discord 将确保您在您的频道上收到这些消息。

要创建 webhook,您必须首先单击您的频道,然后单击频道名称旁边的 Edit Channel 按钮。

然后点击 Webhooks 选项卡并点击 Create Webhook 按钮。

之后,为您的 webhook 选择一个名称,在本教程中,我们将使用 Alerts,因为这是我们的 Bash 脚本将执行的操作 - 在我们的一个网站出现故障的情况下提醒我们。

复制您的 webhook URL 并保存以供以后使用。 最后点击【X19X】保存【X27X】按钮。

您现在拥有 Discord 帐户、服务器和 webhook。 您现在可以继续为您的脚本创建一个测试文件以进行监控。

第 2 步 — 创建测试文件(可选)

如果您还没有自己的网站要测试,请完成此步骤以添加测试文件以检查您的监控脚本将如何工作。 确保在您的 apache-server 上运行这些命令。

首先,使用以下命令创建测试文件:

nano /var/www/your_domain/test

将一些内容添加到您的文件中,以便您检查它是否正常工作:

测试

test

保存并退出文件。

现在在浏览器中导航到 http://your_domain/test 以确保您可以接收到 test 文件中的文本。

在下一步中,您将开始构建您的监控脚本。

第 3 步 - 创建您的监控脚本

现在您已经配置了 webhook,您将继续创建您的 Bash 脚本,该脚本将检查您网站的响应代码。 如果任何网站返回的状态与 200 OK 不同,您的脚本将向 Discord webhook 发送请求,以便您在 Discord 频道中收到通知。

注意: 您可以使用任何其他编程语言来构建这样的脚本。


首先通过 SSH 连接到您用来运行监控脚本的 monitor-server

首先在您的主文件夹中创建一个文件。 在本教程中,我们将调用文件 check_status.sh

使用您喜欢的文本编辑器打开文件:

nano ~/check_status.sh

为了让程序加载器将此可执行文件识别为 Bash 脚本,请将以下行添加到文件顶部:

~/check_status.sh

#!/bin/bash

所有以 # 开头的行都是注释。 注释是可选的,但在脚本中添加注释会让其他人更容易理解脚本的作用:

~/check_status.sh

#!/bin/bash

##
# Website status check script
# Author: Your Name
# Date: 01/01/2020
##
. . .

接下来,将 Discord Webhook 指定为变量。 添加您之前为 webhook 复制的 URL:

~/check_status.sh

. . .
##
# Discord webhook
# Change the 'your_discord_webhook_name' with your actual Discord Webhook
##
url="your_discord_webhook_name"
. . .

由于您可能会使用此脚本来检查多个网站的状态,因此请创建一个名为 websites_list 的变量并存储您要监控的网站的域名或 IP 地址。 如果您使用本教程中的可选测试文件,请确保在您的域名或 IP 地址后添加 /test

~/check_status.sh

. . .
##
# List of websites to check
##
websites_list="your_domain/test"
. . .

在监控多个网站的情况下,可以在 websites_list 变量中添加多个域名或 IP 地址,并使用空格作为分隔符:

~/check_status.sh

. . .
websites_list="your_domain1/test your_domain2 your_domain3"
. . .

现在您需要遍历网站列表并检查它们的状态。 为此,将以下 for 循环添加到您的文件中:

~/check_status.sh

. . .
for website in ${websites_list} ; do
        status_code=$(curl --write-out %{http_code} --silent --output /dev/null -L ${website})
        echo $status_code
done
. . .

这个 for 循环将遍历 websites_list 变量中的每个项目,并使用 curl 命令检查网站的状态。

echo $status_code语句会打印出curl命令的响应状态。 如果网站按预期运行,curl 命令将返回响应代码 200 OK,表示网站已启动并正在运行。 否则,您将收到另一个响应代码。

for 循环中,添加一条 if 语句来检查响应码是否为 200。 如果响应代码是 200 那么这意味着该网站正在运行并且您不需要 Discord 通知。 将以下条件块添加到您的文件中:

~/check_status.sh

. . .
        if [[ "$status_code" -ne 200 ]] ; then
            # POST request to Discord Webhook with the domain name and the HTTP status code
        else
            echo "${website} is running!"
        fi
. . .

如果网站有任何问题,那么您将收到不同的响应代码,在这种情况下,您将希望通过 Discord webhook 接收通知。

要发送通知,您可以使用 curl 命令向 Discord webhook URL 提交 POST 请求。

if 语句中添加以下 curl 请求:

~/check_status.sh

. . .
        if [[ "$status_code" -ne 200 ]] ; then
            # POST request to Discord Webhook with the domain name and the HTTP status code
            curl -H "Content-Type: application/json" -X POST -d '{"content":"'"${domain} returned: ${status_code}"'"}'  $url
        else
            echo "${website} is running!"
        fi
. . .

现在让我们检查不同的论点:

  • -H:告诉 curl 您想在请求中添加额外的标头。
  • "Content-Type: application/json":定义 webhook 应该期望的数据类型 (HTTP JSON)。
  • -X POST:指定要使用 POST 作为请求方法。
  • -d:将指定的 JSON 数据发送到 Discord Webhook。

这将是您脚本的最终版本:

~/check_status.sh

#!/bin/bash
##
# Website status check script
# Author: Your Name
# Date: 01/01/2020
##

##
# Discord webhook
# Change the 'your_discord_webhook_name' with your actual Discord Webhook
##
url="your_discord_webhook_name"

##
# List of websites to check
# To add more websites just use space as a separator, for example:
# websites_list="your_domain1 your_domain2 your_domain3"
##
websites_list="your_domain/test your_domain2"

for website in ${websites_list} ; do
        status_code=$(curl --write-out %{http_code} --silent --output /dev/null -L ${website})

        if [[ "$status_code" -ne 200 ]] ; then
            # POST request to Discord Webhook with the domain name and the HTTP status code
            curl -H "Content-Type: application/json" -X POST -d '{"content":"'"${domain} : ${status_code}"'"}'  $url
        else
            echo "${website} is running!"
        fi
done

该脚本将遍历此列表并检查每个网站的状态。

使用以下命令运行脚本以确保它按预期工作:

bash ~/check_status.sh

运行脚本后,您将在终端中收到以下输出,确认您的网站正在运行:

Outputyour_domain1 is running!
your_domain2 is running!

接下来,您将测试 Discord 通知。

第 4 步 — 测试您的 Discord 通知

现在是时候使用测试文件检查您的 webhook 是否按预期工作了。

apache-server 上运行以下命令以 关闭对该文件的访问权限

sudo chmod 000 /var/www/your_domain/test

接下来,返回您的 monitor-server 并运行脚本:

bash check_status.sh

移动到您的 Discord 应用程序并检查您的警报,您将收到 :403 错误。 这说明您没有正确设置权限,被禁止查看该文件。

现在,要测试不同的错误,请从 apache-server 中完全删除此文件:

sudo rm /var/www/your_domain/test

接下来,返回您的 monitor-server 并运行脚本:

bash check_status.sh

移至 Discord 应用程序并检查警报,您将收到 :404 错误。 这表明该文件不可用。

如果您在手机上安装了 Discord,您也会在那里收到警报。

您现在有一个脚本,可以在您的网站遇到任何问题时提醒您。 接下来让我们将脚本配置为每五分钟自动运行一次。

第 5 步 — 自动化流程

自动化检查的一种方法是创建一个 cron 作业 ,它将每 5 分钟左右运行一次。

首先,回到您的 监控服务器 。 那么在你可以自动运行脚本之前,你需要整理一下你的文件权限,并确保脚本是可执行的,否则它不会运行。 要使脚本可执行运行:

chmod u+x ~/check_status.sh

运行以下命令来编辑您的 crontab:

crontab -e

然后将以下内容添加到文件中:

*/5 * * * * /home/your_user/check_status.sh

然后保存 crontab,然后您的脚本将每 5 分钟执行一次。

结论

在本文中,您配置了自己的 Discord webhook 并创建了一个脚本,以在您的网站发生特定错误时通知您。 现在您可以使用自己喜欢的编程语言编写更复杂的机器人。

要了解有关设置监控基础设施的更多信息,请查看我们的 监控主题页面

而且,如果您有兴趣了解有关 shell 脚本的更多信息,请查看我们的 Shell 脚本简介教程系列

要了解更多关于 Discord webhooks 的信息,可以查看官方的 Discord Webhooks 文档