Webhook 是 Discord 提供的一種簡單方式,讓你的程式或服務可以自動發送訊息到指定的頻道,不需要機器人
你只要建立 Webhook URL,然後用POST請求就能發送訊息、圖片或內嵌訊息 (Embed)。
這對於自動通知、日誌記錄、或與其他應用整合非常有用,因為只要簡單發送請求就好,而不需寫一個完整的機器人

你可以視為是一個半拋棄式的訊息,因為只接受請求而沒有其他資訊
所以一個Webhook訊息只包含頭像、名稱、內容而已
由於不是特定帳號發出的,所以如果改了頭像或名稱,前面發送的訊息也不會更改
但如果是一個使用者或機器人就會一並更改

但以此特性,我們也可以高度自訂頭像和名稱而不需要創建一個新的Discord帳號,而且可以隨時更換

建立Webhook

Webhook是綁定頻道的
點入一個頻道設定>右側欄「整合」>新Webhook>更換頭像與名稱
點擊複製網址即可取得url

網址應該會長這樣

plaintext
1
https://discord.com/api/webhooks/1301252464044933191/hMEKGjKwJmrh8Su47e3DYhSOcb7LH2EXCTNqPvqg5T2r75wnO0-hLCc2FZdGfaCITv3V

數字是ID,每一個Webhook都有自己的ID,僅代表辨識用的身份
後面一大串是Token,就像機器人的Token或API金鑰,擁有金鑰才能發送訊息

一般POST發送

首先,先準備一個字典,內容為

  • username: 發送的名稱
  • avatar_url: 發送的頭像圖片網址
  • content: 發送的訊息內容
  • embeds: 發送的嵌入訊息

其中usernameavatar_url若沒有指定,則會是預設的名稱跟頭像,也就是你創建時設定的
所以最後可以只有這樣

python
1
2
data = {"content":"哈囉"}
url = "Webhook網址"

這種方法有兩個好處

  • 如果確定只會有一個來源觸發,則可以不用另外填寫,這樣方便許多
  • 如果會有很多個來源,可以為每個來源設定不同的頭像跟名稱,但只需要一個Webhook網址就好了,不需要為每個外觀都設定一個Webhook

發送的話只需要發送時把json參數指定為剛剛的字典就好了
API回應的內容在成功時會是空的,只有錯誤時才會有內容

python
1
2
response = requests.post(url="Webhook網址", json=data)
requests.post(url=url, json=data) # 如果不需要回應的內容
Webhook 聊天室

機器人發送

如果是用機器人發送,則簡潔許多
很像取得頻道再發送的概念
而且機器人提供更多內容,比如說可以使用互動式介面、傳檔案等等
當然也可以指定名稱和頭像

取得Webhook

我們可以利用機器人來抓取Webhook物件,就像抓頻道、使用者或訊息一樣
此處的數字就是Webhook的ID
不需要金鑰是因為改為用機器人來發送時,有機器人的Token就可以確保安全性了,不用再驗證一次Webhook的

python
1
webhook = await bot.fetch_webhook(1301252464044933191)

第二個方法是直接創建一個Webhook物件,並且用from_url()方法來填充內容使其變成一個可用的Webhook 但這樣不僅需要貼上整個url,還需要指定取得的工具是機器人bot`,所以只有特殊用處才會使用,通常記得第一個就好了

python
1
webhook = discord.Webhook.from_url(["https://discord.com/api/webhooks/1301252464044933191/(保密部分)](https://discord.com/api/webhooks/1301252464044933191/hMEKGjKwJmrh8Su47e3DYhSOcb7LH2EXCTNqPvqg5T2r75wnO0-hLCc2FZdGfaCITv3V)", client=bot)

發送

跟頻道發送的方法也一樣,使用send()

python
1
2
3
4
5
6
await webhook.send("哈囉")
await webhook.send(
content="真是皂化弄人啊",
username="肥皂公司總裁",
avatar_url="https://image.net/soap.png"
)