搜尋此網誌

2022年10月3日 星期一

Discord.js 初始設定

緣起:


    我之前有稍微用 python 測試 discord 機器人,有成功在群組裡讀取使用者的輸入並回應,現在要改用 Node.js 來做,想說順便紀錄一下那時是怎麼設定 Discord API 的。

今天協理生日,他請我們飲料


Disocrd Developer:


    官方的連結在這,用你的 Discord 帳號登入,有點忘了登入完後還要再填哪些資料,應該就認證電子信箱之類的,印象中我在這裡沒花什麼時間。註冊成功後,可以到 Developer Portal 的頁面,在 Application 那頁可以新增自己的應用程式。


    點選後輸入應用程式的名字,記得勾同意那些條款


    再來進入應用程式後,選擇 Bot,然後 Add Bot

    
    yes,反正弄錯的話再建一個 APP 就是了
    

    完成後,在 Bot 那頁就可以設定你的機器人


    然後到 OAuth2 的 Url Generator 那邊,選擇 bot (第二個 column 的第四個)


    它會跳出機器人可以使用的權限給我們選,這裡就先選 Administor,這樣就什麼都能做了


    然後在最下面的是邀請的網址,你可以在瀏覽器輸入,登入自己 Discord 後,可以把機器人拉到你要的群組,你必須是群組的管理員才行


    完成後,就可以看到機器人進了你的 Server



Node.js Discord API:


    這篇的目標是讓我的機器人先送段文字,我是參考這個文章來做。首先,新增一個你專案的資料夾,然後在資料夾開啟 cmd,輸入 npm init,然後依序輸入它要求的資料,大部份都照著它預設的打就好,不知要打啥的也可以直接按 enter 留白,完成後,你的資料夾下就會多一個 package.json 檔,用來描述你的專案。


用 VS Code 開起來看是長這樣 (我會執行的 js 檔叫 bot)

    再來輸入 npm install discord.js,它會把那些 Node.js 寫 Discord 需要用到的那些套件給裝在你的專案資料夾


    這時,你的資料夾下會多個 node_modules 的資料夾,裡面放的就是那些套件,還會有個 package-lock.json 檔,看來是用來描述那些 dependency 用的 (我猜)


    這時你再看一下你的 package.json 檔,它會多一些東西


    我在專案資料夾下加入一個 bot.js 檔,然後 require discord.js,執行程式如果沒錯的話,就代表剛剛的環境設定是成功的

OK 沒問題


機器人上線:


    使用 Discord API 寫程式最重要的是,你要有你 APP 的 AccessToken 才能使用 APP,所以我們要先拿到 APP 的 AccessToken。到 Discord Developer,你的 APP 下,選 Bot,一開始應該只有 Reset Token 可以按,按下去後它會生成一個 AcccessToken,把它給記起來


    官方是建議我們弄個 auth.json 檔,把我們的 token 值放裡面,再把值從程式裡引入

像這樣,value 是 AccessToken

    網路上有些 Nodejs Discord API 的教學都有些過時了,我在跑程式時遇到錯誤,最後只好去看官方的文件,看官方的文件比較準。首先是在 GateWay Intent,你在 create 一個 Client 時要指定它監聽的功能,這裡有介紹,然後這個是每種 intent 有的權限。

    如果單純只是要接收到訊息後,回傳固定的文字,那 Client 給這些 Intent 就夠了

我們的 AccessToken 是放在 client.login 裡

    再來是事件的監聽,我輸入 client.on('message,打到一半時發現


    有這幾個 message 開頭的事件可以選,我的直覺告訴我,我要用的是 messageCreate,程式寫到目前是長這樣


    忘了在哪看到的,messageCreate 部份的 callback founction,它傳入的參數有一個欄位叫 channel,我們可以從它來取得發送訊息的那個頻道,然後再呼叫 channel 的 send 方法來傳送訊息


     實際跑程式時,出了一個問題,那就是,我明明只傳了一次文字,它卻回應很多次



    我在找解決辦法時,發現這個文章,他問的問題雖然跟我遇到的不一樣,但我注意到他程式碼有這部份


    我看到這行的當下就明白,機器人自己回復的話也會被自己偵測到,所以才會無止盡的回覆下去。看來,我們還能從 message.author 來取得傳訊息的人是誰,那個 bot 是一個 boolean,如果訊息是機器人傳的,那它的值就會是 true。完整程式現在是這樣


    測試結果


    看來沒問題了,這篇就告一段落了,接下來還要研究更多其它的功能。


1 則留言: