2017年10月12日 星期四

[Python] 如何開發 Discord 機器人並且部屬至 Heroku



Discord是為了遊戲而生的通訊軟體,
他除了語音及聊天室,頁面簡單無廣告,帳號容易註冊,
支援markdown語法,訊息永久保存,
最大的賣點我想莫過於機器人替群組增添了很多樂趣XD
為鼓勵更多人開發相關discord 機器人,而且discord中文資源非常稀少,
所以來寫教學囉~


這邊沒有附上截圖,因為圖形化介面的東西會更新、改變
所以以指令說明為主
首先在實作以下步驟前,請先
1.安裝python3.6.2 (版本有差喔,語法不一樣)
2.安裝git
3.有discord帳號/heroku帳號
4.在linux環境下使用終端機 (不是必要但教學以 linux 指令為主)
使得你的終端機可以認得相關指令
然後我們就開始吧!!
我們開發時仰賴 discord.py 這個 lib
這個 lib 提供API給 python 去 call 相關功能
先安裝
python3 -m pip install -U discord.py
裝好之後就開始快速產生一個 discord bot
然而 discord.py 的文件裡也很佛心地幫我們準備了一個 sample
一開始先照貼,並存成 main.py 檔,
我們目的為求正確部屬到 heroku,之後再做成我們想要的樣子,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import discord
import asyncio
client = discord.Client()
@client.eventasync def on_ready():
print('Logged in as')
print(client.user.name)
print(client.user.id)
print('------')
@client.eventasync def on_message(message):
if message.content.startswith('!test'):
counter = 0
tmp = await client.send_message(message.channel, 'Calculating messages...')
async for log in client.logs_from(message.channel, limit=100):
if log.author == message.author:
counter += 1
await client.edit_message(tmp, 'You have {} messages.'.format(counter))
elif message.content.startswith('!sleep'):
await asyncio.sleep(5)
await client.send_message(message.channel, 'Done sleeping')
client.run('token')

記得 client.run('token') 要換成你從 discord 申請到的 token
到 Discord 官網找”開發人員”,進去後找 My Apps 的頁面按 new App。
就到了機器人設定頁面,相關的客製化設定就不說明了,重要的是Token那邊按 click to reveal
就會出現一組 token,這就是我們的機器人連到 Discord 需要的參數,
最後還有你要拿 client ID
使用此組URL,邀請你的機器人進到你的伺服器 (當然,你要先登入並且已經創建好伺服器)
https://discordapp.com/oauth2/authorize?permissions=301001759&scope=bot&client_id=你的機器人的clientID
此時在終端機其機器人的檔案路徑下使用
python3 main.py
就可以執行我們的機器人了,你會發現機器人上線了
然後你可以嘗試玩玩 !test !sleep 範例上的兩個指令看機器人會不會回答你
但是我們的終端機關掉,機器人也會下線。
變得其他人須等你上線開終端機打開再下一次指令才能玩到機器人。
這就是為什麼我們要部屬到heroku的原因了。
先下載 heroku
wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
登入你的 heroku


1
2
3
4
5
heroku login
Enter your Heroku credentials.
Email:<帳號>
Password <密碼>
Authentication successful.

切到你放機器人 CODE 資料夾
cd ~/myapp
在heroku建立一個新 app,buildpack 一定要是 python (執行後會顯示你的 git repo,記得先存起來)
heroku create myapp --buildpack heroku/python
在你的 ~/myapp 路徑下建立 requirements.txt,這是為了部屬時找的到該下載那些 lib
以下指令幫你建立好
echo discord.py==0.16.8 > requirements.txt
建立 python 應該用甚麼版本
echo python-3.6.2 > runtime.txt
建立你的程式要執行的類型,網路上查到很多都是 web: 開頭,那是部屬 web 用,
但我們這邊要的是機器人,worker 就可以
echo worker: python main.py > Procfile
此時在你的資料夾myapp裡有四個檔案,不可或缺

main.py runtime.txt requirements.txt Procfile
接下來就是讓你的資料夾引入 git 版控,好讓我們 push 到 heroku 的 repo

git init
git remote add heroku <repoURL> (去 heroku 後台 Setting 的 Heroku Git URL 即可找到)
git add .
git commit -m "Initial commit"
git push heroku master
然後部屬成功後,別忘了以下指令開始你的 worker

heroku scale worker=1

6 則留言:

  1. 請教一下大大
    怎麼讓discord機器人註冊一個google帳號?

    回覆刪除
    回覆
    1. 抱歉我在製作 discord 機器人時並沒有需要註冊 Google 帳號的流程,建議您找尋其他教學:)

      刪除
    2. 概念是去看 google document 有無提供 註冊的 API ,並讓機器人去 call Google 註冊(sign up) API

      刪除
  2. 請問一下
    只要照著上面的打完之後就好了嗎?
    因為我用好之後bot還是在離線狀態

    回覆刪除
    回覆
    1. 可能 python library 有些變化,要查一下文件,我太忙很久沒研究這塊了

      刪除