如何在 Ubuntu 18.04 上使用 Discord Webhooks 获取网站状态通知

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

介绍

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

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

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

先决条件

在开始本指南之前,您需要具备以下条件:

第 1 步 — 设置您的 Discord Webhook

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

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

创建服务器或加入服务器 Discord

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

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

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

要创建网络钩子,您必须先点击您的频道,然后点击您频道名称旁边的“编辑频道”按钮。

频道设置不和谐

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

创建 Webhook 按钮 Discord

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

复制您的 webhook URL 并保存以备后用。最后,点击保存按钮。

创建网络钩子 Discord

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

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

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

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

  • nano /var/www/your_domain/test

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

测试
test

保存并退出文件。

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

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

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

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

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

首先通过 SSH 连接到您用来运行监控脚本的监控服务器

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

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

  • nano ~/check_status.sh

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

~/check_status.sh
#!/bin/bash

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

~/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 地址。如果您使用本教程中的可选测试文件,请确保/test在您的域名或 IP 地址后添加

~/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 网络钩子接收通知。

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

curl在您的if语句中添加以下请求

~/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: 指定您要使用 aPOST作为请求方法。
  • -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

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

Output
your_domain1 is running! your_domain2 is running!

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

第 4 步 — 测试您的 Discord 通知

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

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

  • sudo chmod 000 /var/www/your_domain/test

接下来,返回您的监控服务器并运行脚本:

  • bash check_status.sh

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

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

  • sudo rm /var/www/your_domain/test

接下来,返回您的监控服务器并运行脚本:

  • bash check_status.sh

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

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

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

步骤 5 — 自动化流程

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

首先,回到你的monitor-server那么在你可以自动运行脚本之前,你需要整理你的文件权限并确保脚本是可执行的,否则它不会运行。要使脚本可执行运行:

  • 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 文档

觉得文章有用?

点个广告表达一下你的爱意吧 !😁