@@ -11,29 +11,32 @@ tags: [HITCON 2024,SCAICT-uwu,中電喵]
11
11
要操控中電喵(或你的 bot) 的形象幫忙發訊息是一個很常見的需求,中電喵公告也是用相同的原理。Discord 提供了 API 讓我們呼叫,只要給 API bot token 和要傳送的訊息,就能達成我們的目的。本篇文章會用 python 的 request 套件示範
12
12
13
13
## 常數定義
14
- ```
14
+ ``` python
15
15
discord_token = " Discord Bot Token"
16
16
target_user_id = " 要送訊息的目標帳號 ID"
17
17
guild_id = " 伺服器 ID ,我們會希望私訓的對象和 bot 在同一個伺服器"
18
18
```
19
- <!-- 我沒有嘗試過如果沒有共同伺服器能不能發訊息 -->
20
19
## 步驟 0: 驗證該使用者是否存在
21
- ```
20
+ 這同時也是一個簡單且完整的 GET 請求示範,設定 header、url 和 payload並發出請求。我建議在發送 DM 訊息之前先檢查使用者是否在伺服器裡面。
21
+ <!-- 我沒有嘗試過如果沒有共同伺服器能不能發訊息 -->
22
+ ``` python
22
23
url = f " https://discord.com/api/v10/guilds/ { guild_id} /members/ { target_user_id} "
23
24
headers = {
24
25
" Authorization" : f " Bot { discord_token} " ,
25
26
" Content-Type" : " application/json" ,
26
27
}
27
-
28
28
response = requests.get(url, headers = headers, timeout = 10 )
29
29
user_data = response.json()
30
30
31
31
if response.status_code != 200 :
32
32
return jsonify({" error" : " Failed to fetch user information in tg id" }), response.status_code
33
33
```
34
+ ::: tip
35
+ requests.get 一定要設定 timeout,否則網路不穩定或對方沒有回應時會一直等待回應,非常占用資源 ~~ ,而且不這樣寫 pylint 也不會過~~
36
+ ::::
34
37
## 步驟 1: 設定 API 參數
35
38
36
- 首先,我們需要準備發送請求所需的 API 參數。這包括 API 的網址、請求標頭(headers) 和發送的內容 (payload)。
39
+ 我們需要準備發送訊息 API 需要的參數。包括 API 的網址、請求標頭(headers) 和發送的內容 (payload)。
37
40
38
41
``` python
39
42
url = f " https://discord.com/api/v10/channels/ { dm_room} /messages "
@@ -44,15 +47,15 @@ headers = {
44
47
```
45
48
46
49
- ** ` url ` ** : 用來指定發送訊息的目標頻道,這裡的 ` dm_room ` 是一個私訊頻道的 ID。
47
- - ** ` headers ` ** : 包含了機器人的授權 token 和內容類型 (JSON)。
50
+ - ** ` headers ` ** : 包含了機器人的 token 和內容類型 (JSON)。
48
51
49
- ## 步驟 2: 設計訊息內容
52
+ ## 步驟 2: 填入訊息內容
50
53
51
- 接下來,我們來設計訊息的內容,包括一個嵌入消息和一個按鈕 。
54
+ 接下來,我們來設計訊息的內容,你可以只塞字串做成純文字訊息,這裡我加入一個 embed 和一個 button 。
52
55
53
- ### Embeds 訊息
56
+ ### Embeds
54
57
55
- Embeds 訊息 是一種格式化的訊息,可以包含標題、描述、顏色等豐富的內容。在這個範例中,我們創建了一個簡單的嵌入消息來表示收到的禮物 。
58
+ Embeds 是一種格式化的訊息,可以包含標題、描述、顏色等豐富的內容。
56
59
57
60
``` python
58
61
embed = {
@@ -62,3 +65,80 @@ embed = {
62
65
}
63
66
```
64
67
68
+ ### 按鈕 (Components)
69
+
70
+ 按鈕是一個互動元件,當用戶點擊時可以觸發一個動作。在 Discord 中,按鈕可以有多種樣式 (style),例如:一次性按鈕、連結按鈕等等。
71
+
72
+ ``` python
73
+ button = {
74
+ " type" : 1 ,
75
+ " components" : [
76
+ {
77
+ " type" : 2 ,
78
+ " label" : " 前往確認" ,
79
+ " style" : 5 , # `5` 表示 Link Button
80
+ " url" : " https://store.scaict.org" , # 要導向的連結
81
+ }
82
+ ],
83
+ }
84
+ ```
85
+
86
+ - ** ` type ` ** : 表示這是一個互動元件的容器 (Action Row),` 1 ` 代表 Action Row。
87
+ - ** ` components ` ** : 是一個包含具體元件的列表,在這個範例中,我們有一個按鈕。
88
+ - ** ` type ` ** : ` 2 ` 表示這是一個按鈕。
89
+ - ** ` label ` ** : 按鈕上顯示的文字。
90
+ - ** ` style ` ** : 按鈕的樣式,` 5 ` 表示這是一個連結按鈕 (Link Button)。
91
+ - ** ` url ` ** : 按鈕的目標網址,點擊後將導向此連結。
92
+
93
+ #### 下表為 components 底下元素常用的屬性,更多內容可以參考(官方文檔)[ https://discord.com/developers/docs/interactions/message-components ]
94
+
95
+ | 屬性 | 類型 | 說明 |
96
+ | --------------| --------| ------------------------------------------------------------------------------------------|
97
+ | ` type ` | 整數 | 按鈕的類型。` 1 ` 表示 Action Row,用來包含多個按鈕;` 2 ` 表示按鈕本身。 |
98
+ | ` label ` | 字串 | 按鈕上顯示的文本。最多 80 個字元。 |
99
+ | ` style ` | 整數 | 按鈕的樣式。可選值包括 ` 1 ` (Primary)、` 2 ` (Secondary)、` 3 ` (Success)、` 4 ` (Danger)、` 5 ` (Link)。 |
100
+ | ` url ` | 字串 | 當 ` style ` 設為 ` 5 ` 時,需要設置此屬性,指定按鈕指向的 URL。 |
101
+ | ` custom_id ` | 字串 | 用於識別按鈕的唯一 ID(僅在 ` style ` 不為 ` 5 ` 時使用)。 |
102
+ | ` disabled ` | 布林值 | 是否禁用此按鈕。` True ` 為禁用,` False ` 為啟用。默認為 ` False ` 。 |
103
+
104
+
105
+ | ` style ` 數值 | 按鈕樣式 | 說明 |
106
+ | --------------| ------------------| --------------------------------------------|
107
+ | ` 1 ` | Primary Button | 藍色按鈕,用於主要操作。 |
108
+ | ` 2 ` | Secondary Button | 灰色按鈕,用於次要操作。 |
109
+ | ` 3 ` | Success Button | 綠色按鈕,用於表示成功或正面的操作。 |
110
+ | ` 4 ` | Danger Button | 紅色按鈕,用於表示危險或破壞性的操作。 |
111
+ | ` 5 ` | Link Button | 透明背景帶下劃線的文字按鈕,用開啟 URL 連結。 |
112
+ ## 步驟 3: 組裝請求的 JSON 資料
113
+
114
+ 最後,需要將 Embeds message 和按鈕組裝成一個 JSON 物件,並透過 API 發送請求。
115
+
116
+ ``` python
117
+ json_data = {
118
+ " embeds" : [embed],
119
+ " components" : [button],
120
+ " tts" : False , # Text-to-speech, 默認為 False
121
+ }
122
+ ```
123
+
124
+ 這裡我們將 Embeds message 放入 ` embeds ` 中,並將按鈕放入 ` components ` 中。
125
+
126
+ ## 步驟 4: 發送請求
127
+
128
+ 當所有的參數準備好後,我們可以使用 ` requests ` 模組來發送 POST 請求。
129
+
130
+ ``` python
131
+ import requests
132
+
133
+ response = requests.post(url, headers = headers, json = json_data)
134
+ if response.status_code == 200 :
135
+ print (" 訊息發送成功!" )
136
+ else :
137
+ print (f " 發送失敗,錯誤代碼: { response.status_code} " )
138
+ ```
139
+
140
+ ## 總結
141
+ 這篇 blog 教你先用 GET 看看用戶是否存在某伺服器,然後
142
+
143
+
144
+ 這樣就完成了!透過這個範例,你已經學會了如何使用 Discord API 發送帶有 Embeds message 和按鈕的 DM 訊息。這種互動性可以大大提升用戶體驗,讓你的機器人更加實用和有趣。
0 commit comments