---
# System prepended metadata

title: 從零開始開發discord機器人
tags: [python, nextcord]

---

# 從零開始開發discord機器人

###### tags: `python` `nextcord`

> 此教程適合給已知python基礎及物件導向概念的人使用
> 若不熟也沒關係，筆者在需要時會特別提及

## 什麼是discord bot 與 nextcord
discord bot 是專門在discord伺服器上運行的機器人，而 nextcord 是別人寫好的函式庫，用來與 discord 伺服器對接的一個橋樑。

### Step 1: 建立一隻機器人

- [ ] 建立discord帳號及bot的註冊
- [ ] 下載nextcord module
- [ ] 讓機器人上線

#### 建立discord帳號及bot的註冊
首先到 https://discord.com/login 且先建立discord帳號。
再來到 https://discord.com/developers/applications 並在左上角找到 **new application** 的按鈕，點下去。

之後會進到取名的介面，這裡就是幫你的機器人取名的時間啦~~

取名完後到左側找到bot的選項，再來點選add bot(應該會在右上角)，按 yes,do it!
然後把下面所有有關intent的選項都打勾，這樣日後比較好操作
最後在這個介面的最上面，username的下方找到TOKEN的選項，按copy貼到記事本就可以進行下一個步驟了。

在左側找到OAuth2的選項，點開之後按URL Generator，找到bot的部分打勾(應該在中間的位置)，之後會看到bot permission，這裡是用來告訴伺服器你的機器人需要甚麼權限，初學者我建議選Administrator就好，選完之後下方會出現一個連結，那就是用來邀請你的機器人的連結，注意，一定要有伺服器的"管理者"權限才可以邀機器人。

這麼一來，你就可以在伺服器中看到機器人的身影嘍。

#### 下載nextcord module

在下載之前，我想推薦一個方便管理code及架設機器人的地方，那就是repl.it https://replit.com/~
repl是一個線上環境，可以用來架設機器人(但不怎麼安全就是了)，所以我推薦初學者可以在這裡寫你的機器人喔。(以下筆者將以repl為主要的coding環境)。
首先，註冊帳號之後，在介面上找到create repl的按鈕，之後選擇python然後為你的專案命名，進去之後在左側的終端機的上面選擇shell後打上 
``` py
pip install nextcord
```
等它一下，這樣就好嘍。

又或者是在repl的做邊找到package的按鍵，搜尋nextcord案下載就好了喔(這方法在等下執行機器人之後會少一個步驟所以也可以用這個方法，但因為不是每個人都會用repl作為自己主力編寫程式的環境，所以筆者主要還是教一般的方法w
(btw 在本機要操作的話，打開cmd，再打上述的指令就行嘍)


#### 讓機器人上線

在這之前，先提一下async/await的概念
async(異步執行)，指讓程式模擬cpu中多執行緒的概念，在等待網站回應的同時先做別的指令，白話文講，就是可以同時做很多件事情，discord bot也是以這個概念完成的。

**API**
所謂API其實就是官方文件，讓我們可以查相關指令語法的地方，阿因為事全英文的，所以看不懂就沒辦法啦。
以下是nextcord的官方文件
https://nextcord.readthedocs.io/en/latest/api.html


進入正題吧，要讓機器人上線了，那下面是我寫的ㄐ處功能，日後都可以再新增，也請各位看完之後試著自己寫出來(不要直接抄la)

1. 首先，我們先import必要的模組首先，我們先import必要的模組。
2. 接著，當機器人準備好時，會觸發event的on_ready事件，因此我們在on_ready底下print一個>> Bot is online 來告訴我們機器人已經上線了。
3. 在下面是一個檢視API有沒有被call太多次的一個小function，讀者可以直接抄過去，因為要解釋裡面的原理會讓篇幅過長w。(如果API被call太多次，他會告訴你要等幾分鐘)
4. 接下來我們來測試一下機器人，event的on_message會偵測discord裡的**每一則訊息**，對你沒聽錯w，他會將偵測到訊息放到一個msg的變數裡面，其中msg是nextcord其中的一個class。msg.content可以傳出這則訊息的內容，我們要做的就是判斷這個訊息，如果msg.content == ping，那機器人就會在這個msg所在的channel傳送一個pong訊息。
5. 最後我們要讓機器人上線啦，在先前應該有存下一串TOKEN，那我們在repl的左側找到一個鎖的圖案，他可以儲存這個專案的一些不可被公開的資料(因為repl的code是公開的)。那我們把key命名為TOKEN，並將剛剛那串複製到value的部分，add new secret之後就好了喔。
6. 那我們在code裡面輸入 
    ``` py
    import os
    TOKEN = os.environ['TOKEN']
     ``` 
     就可以把剛剛那串從repl上存到TOKEN這個變數了喔。
     最後我們讓client在這個TOKEN上運行，也就是 
     ```py
     client.run(TOKEN)
     ```
     就可以讓屬於自己的機器人在repl上運行了喔，是不是很棒！
最後補充(欸原諒筆者屁話有點多)
```py
if __name__ == "__main__":
```
是在py中運行main函式的方法，即使py不需要 main function也能運作，但這依舊是寫程式的好習慣喔。
``` py
import nextcord
from nextcord.ext import commands
import os
import requests

intents = nextcord.Intents.all()
client = commands.Bot(command_prefix='--', intents=intents)
client.remove_command('help')
TOKEN = os.environ['TOKEN']

@client.event
async def on_ready():
  print('>> Bot is online ')
  r = requests.head(url="https://discord.com/api/v1")
  try:
      print(f"Rate limit {int(r.headers['Retry-After']) / 60} minutes left")
  except:
      print("No rate limit")
      

@client.event
async def on_message(msg):
  if msg.content == "ping":
    await msg.channel.send("pong") 

if __name__ == "__main__":
  client.run(TOKEN)
```

好了，現在你已經寫出一隻屬於自己的機器人了，之後我們再來詳細介紹機器人的其他功能。

筆者的dc: https://discord.gg/tfaFhg2u
有問題都可以在這裡找我喔。
