Webhook
Webhook 是 Discord 提供的一種簡單方式,讓你的程式或服務可以自動發送訊息到指定的頻道,不需要機器人
你只要建立 Webhook URL,然後用POST請求就能發送訊息、圖片或內嵌訊息 (Embed)。
這對於自動通知、日誌記錄、或與其他應用整合非常有用,因為只要簡單發送請求就好,而不需寫一個完整的機器人
你可以視為是一個半拋棄式的訊息,因為只接受請求而沒有其他資訊
所以一個Webhook訊息只包含頭像、名稱、內容而已
由於不是特定帳號發出的,所以如果改了頭像或名稱,前面發送的訊息也不會更改
但如果是一個使用者或機器人就會一並更改
但以此特性,我們也可以高度自訂頭像和名稱而不需要創建一個新的Discord帳號,而且可以隨時更換
建立Webhook
Webhook是綁定頻道的
點入一個頻道設定>右側欄「整合」>新Webhook>更換頭像與名稱
點擊複製網址即可取得url
網址應該會長這樣
1 | https://discord.com/api/webhooks/1301252464044933191/hMEKGjKwJmrh8Su47e3DYhSOcb7LH2EXCTNqPvqg5T2r75wnO0-hLCc2FZdGfaCITv3V |
數字是ID,每一個Webhook都有自己的ID,僅代表辨識用的身份
後面一大串是Token,就像機器人的Token或API金鑰,擁有金鑰才能發送訊息
一般POST發送
首先,先準備一個字典,內容為
username
: 發送的名稱avatar_url
: 發送的頭像圖片網址content
: 發送的訊息內容embeds
: 發送的嵌入訊息
其中username
和avatar_url
若沒有指定,則會是預設的名稱跟頭像,也就是你創建時設定的
所以最後可以只有這樣
1 | data = {"content":"哈囉"} |
這種方法有兩個好處
- 如果確定只會有一個來源觸發,則可以不用另外填寫,這樣方便許多
- 如果會有很多個來源,可以為每個來源設定不同的頭像跟名稱,但只需要一個Webhook網址就好了,不需要為每個外觀都設定一個Webhook
發送的話只需要發送時把json
參數指定為剛剛的字典就好了
API回應的內容在成功時會是空的,只有錯誤時才會有內容
1 | response = requests.post(url="Webhook網址", json=data) |
Webhook | 聊天室 |
---|---|
![]() |
![]() |
機器人發送
如果是用機器人發送,則簡潔許多
很像取得頻道再發送的概念
而且機器人提供更多內容,比如說可以使用互動式介面、傳檔案等等
當然也可以指定名稱和頭像
取得Webhook
我們可以利用機器人來抓取Webhook物件,就像抓頻道、使用者或訊息一樣
此處的數字就是Webhook的ID
不需要金鑰是因為改為用機器人來發送時,有機器人的Token就可以確保安全性了,不用再驗證一次Webhook的
1 | webhook = await bot.fetch_webhook(1301252464044933191) |
第二個方法是直接創建一個Webhook物件,並且用from_url()方法來填充內容使其變成一個可用的Webhook 但這樣不僅需要貼上整個url,還需要指定取得的工具是機器人
bot`,所以只有特殊用處才會使用,通常記得第一個就好了
1 | webhook = discord.Webhook.from_url(["https://discord.com/api/webhooks/1301252464044933191/(保密部分)](https://discord.com/api/webhooks/1301252464044933191/hMEKGjKwJmrh8Su47e3DYhSOcb7LH2EXCTNqPvqg5T2r75wnO0-hLCc2FZdGfaCITv3V)", client=bot) |
發送
跟頻道發送的方法也一樣,使用send()
1 | await webhook.send("哈囉") |