【Discord】 使用 Discord Webhooks 傳送 API 請求結果至 Discord 群組中教學

最近工作閒下來了就一直在思考有什麼新奇的東西可以玩,前不久公司同事用 Discord webhook 做了一個伺服器狀態通知bot,當伺服器一斷線或者連接後就會發送通知到 Discord 群組,非常方便,於是我就想著自己也來做一個,用途是當我發送請求的時候會在頻道中紀錄請求的內容。

本篇文章只教如何透過 Webhook API 傳送訊息到 Discord 群組,不教有什麼 API 可以用、怎麼用,所以不會說得很詳細,見諒。

效果

當我發送 API 請求時:

image 15 【Discord】 使用 Discord Webhooks 傳送 API 請求結果至 Discord 群組中教學

Discord webhook 會幫我把請求結果與時間記錄下來:

Discord webhook 1

新增 Webhook

1.首先在你想要添加 webhook 的頻道中點擊伺服器設定

create a discord webhook

2.選擇 整合 – Webhook – 建立 Webhook

create a discord webhook 2

3.填寫 Webhook 的名稱(bot名字)與選擇發送訊息的頻道,保存設定之後點下方的「複製 Webhook 網址」:

create a discord webhook 3

獲取 Webhook data

將剛剛複製的網址貼上到瀏覽器中,會得到這個 Webhook 的資料:

  • id:Webhook id
  • channel_id:Webhook 訊息發送的頻道 id
  • guild_id:Webhook 所在的伺服器 id
  • token: Webhook Token

我們只會用到 id 和 token。

discord webhook data

新建配置檔

在 node project 中新增 config.js,用於保存 webhook 的資料:

{
  "id": "944245322xxxxxxxxx",
  "channel_id": "94422615xxxxxxxxx",
  "guild_id": "9442261xxxxxxxxx",
  "token": "KsaQEvCt1Y9Al6pa0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
}

發送 Webhook 訊息

在 Discord 的 Webhook Documentation 有詳細說明傳送訊息的 API 用法:

  • 請求地址https://discord.com/api/webhooks/${webhook.id}/${webhook.token}
  • 發送訊息時,必須至少傳 content, embeds, file 三個參數中的一個。
discord webhook api

app.js 中將 id 和 token 解構賦值,新增一個 requestMsg 方法,用於 Webhook 傳送訊息至群組:

  • 只是為了演示用法,所以把 code 都寫在一起了
  • :在 embeds 中無法使用 Discord 的表情碼(ex: :white_check_mark:),但可以直接複製貼上 emoji
const express = require("express");
const axios = require("axios");
const moment = require("moment");
const bodyParser = require("body-parser");
const { id, token } = require("./config.json");
const app = express();
const baseURL = "https://discord.com/api";
const port = 5000;

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(bodyParser.raw());

app.get("/", (req, res) => {
  res.send("Hello World!");
});

const requestMsg = (obj) => {
  axios
    .post(
      baseURL + `/webhooks/${id}/${token}`,
      {
        content: `:bell: Bibo! New request!`,
        embeds: [
          {
            title: "Request Notification",
            fields: [
              {
                name: "Request url",
                value: `${obj?.method} ${obj.IP}${obj?.url}`,
              },
              {
                name: "Date",
                value: obj?.date,
              },
              {
                name: "Status",
                value: obj?.status,
              },
              {
                name: "Body",
                value: JSON?.stringify(obj.body),
              },
            ],
            footer: {
              text: "✔️ Bibo!",
            //   icon_url: "https://i.imgur.com/SLSq9zs.png",
            },
          },
        ],
      },
      {
        headers: {
          "Content-Type": "application/json",
        },
      }
    )
    .catch((e) => console.log(e.response?.data));
};

app.post("/test", (req, res) => {
  const date = moment().format("YYYY-MM-DD HH:mm:ss");

  const obj = {
    date,
    status: 200,
    body: req?.body,
    url: req?.url,
    method: req?.method,
    IP: req?.headers?.host,
  };

  requestMsg(obj);

  return res.json({
    status: 200,
    message: "OK!",
  });
});

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`);
});

如此一來,當你發送請求時,Webhook 就會在你指定的頻道中發送消息了!

discord webhook

Webhook 用處真的很廣,比如 Github commit、Gitlab merge request 的通知…等,還是先學起來好,萬一哪天突然就用上了呢?

因為我沒有學過後端,所以如果 code 的部分有更好的寫法歡迎一起交流!

參考資料

0 0 評分數
Article Rating
訂閱
通知
guest

0 Comments
在線反饋
查看所有評論