用萬能的樹莓派實現24h Discord Bot(Python)

前言

從我開始寫 Discord Bot 的時候,就一直缺少一個能讓程式 24h 運行的平台。由於 Bot 功能較多,沒辦法在雲端服務上部屬,最後只好找上樹莓派當作主機,因此近期購買了 4B 版本來實現我的需求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Raspberry Pi 4 model B 4GB ver《技術規格》
* Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.5GHz
* 4GB LPDDR4-3200 SDRAM
* CYW43455 2.4 GHz/5.0 GHz IEEE 802.11ac wireless, Bluetooth 5.0, BLE
* Gigabit Ethernet
* 2x USB 3.0 ports; 2x USB 2.0 ports.
* Raspberry Pi standard 40 pin GPIO header
* 2 × micro-HDMI ports (up to 4kp60 supported)
* 2-lane MIPI DSI display port
* 2-lane MIPI CSI camera port
* 4-pole stereo audio and composite video port
* 265 (4kp60 decode), H264 (1080p60 decode, 1080p30 encode)
* OpenGL ES 3.0 graphics
* Micro-SD card slot for loading operating system and data storage
* 5V DC via USB-C connector (minimum 3A*)
* 5V DC via GPIO header (minimum 3A*)
* Power over Ethernet (PoE) enabled (requires separate PoE HAT)
* Operating temperature: 0 – 50 degrees C ambient


From 維基百科

正文

開機前的準備

由於樹莓派本身沒有自帶儲存裝置,所以我們會需要 mircoSD 卡作為他的儲存裝置(插槽在電路板背面),而在插入前必須先格式化並灌入作業系統(可參考這裡)。

在安裝 OS 這方面,我是利用樹莓派官網給的 Imager 跟 Raspberry Pi OS(Raspbian)做安裝,如果不想這麼麻煩也可以用 NOOBS,基本上結果是差不多的,但是用前者方法會快得多。

補充:Raspberry Pi OS 是基於 Debian 的作業系統,把他想成 Linux(Unbutu)就可以了,當中預裝了一些程式,像是 Python 跟輕量化版本的 Chromium,使用起來算非常順暢

用久了以後發現瀏覽器常常讓系統崩潰,使用順暢這句話就當作我沒說過

上述作業完成後,就可以接上螢幕和鍵盤滑鼠準備開機(螢幕接口在這代改用 micro HDMI,我只好跑去黃色鬼屋買一條 1M 的 micro HDMI to HDMI,一條就將近 500 元.... )

環境的建置

開機確認過狀況以後,先到樹莓派設定中開啟 ssh,再到 cmd 輸入

sudo apt-get install xrdp

來安裝 xrdp,之後我們就可以利用這 ssh 和 Windows 的遠端桌面連線來操作樹莓派了(遠端桌面連線控制起來延遲感嚴重,如果需要長期操作建議乖乖接螢幕),另外,預設的使用者(pi)的密碼是 raspberry,建議在一開始就改掉。 最後執行

1
2
sudo apt-get update
sudo apt-get upgrade

執行完以後發現 Python 版本還在 3.7.3,那就只能接受他了。 再來安裝 Visual Studio Code 時會出現問題,目前找到最快的解決方法是這個,只要兩條指令就能解決,缺點是更新不像一般 VS Code 一樣方便,但是不影響我的使用,所以我還是裝了(只靠 Vim 對我來說實在是太難了)。

後來發現 OS 裡面已經裝好了 Nano,作為輕量的 console 文字編輯器相當方便,視窗下方也會提示按鍵快捷,若是 Vim 用的很不習慣可以考慮使用 Nano

MySQL(MariaDB)與 phpmyadmin 安裝

參考這裡有非常詳盡的介紹,可配合程式儲存資料。

重灌過後我把 phpmyadmin 替換成Adminer,Web server 則是從 Apache 換成NGINX

部屬 Discord Bot

感覺環境都弄的差不多了,接下來就使用 Git 把原始碼 pull 下來就好,找個不錯的位置執行(自行替換 repository URL)

git clone https://github.com/ppodds/Yue.git

接下來進入該資料夾把該弄的設定和雜務做完(我的路徑為~/Documents/Yue,請依上個步驟放置程式碼的路徑自行替換),再建立 Python 虛擬環境(Windows 跟 Linux 的虛擬環境應該是不一樣的,推薦上傳時不要把 venv 的資料夾上傳上去)。

為了建立 Python 虛擬環境,要執行以下指令(自行替換路徑)

1
2
cd ~/Documents/Yue
python3 -m venv venv

稍等一下後就會在程式的目錄建立名稱為venv的虛擬環境資料夾。

補充:第二個venv可自行替換,影響虛擬環境資料夾的名稱。

若要執行程式時,要使用虛擬環境的 Python,需要先啟動虛擬環境。執行(路徑自行替換)

source ~/Documents/Yue/venv/bin/activate

之後就會發現 cmd 的前面多了(venv),代表虛擬環境啟動中(如果是在 VS Code 中執行 Python,如果設定正確就會自動進入 venv)。

接下來就該開始安裝需要的套件了,這裡就用 pip 完成就好

1
2
3
4
python -m pip install discord.py
python -m pip install PyNaCl
...
...

如果你有放requirements.txt的話也可以直接用

python -m pip install -r requirements.txt

最後測試執行(路徑自行替換為自己的 Bot 主程式)

python Bot/Yue.py

如果測試執行無誤的話就可以進行下一步。

隨時隨地的控制樹莓派!

說到隨時隨地都在用的電子產品,常常會想到手機,於是我想到要用手機控制樹莓派(有申辦固定 IP 使用起來會方便的多)。為了不受區域網路限制,要先調整好路由器設定,基本上要動以下兩項。

  1. 固定樹莓派的區網 ip
  2. 設定外部連入時指向到樹梅派(ip forwarding , 虛擬伺服器設定)

補充:預設的 ssh port 是 22,沒有特別需求的話就設定 22 -> 22

第二項和 Minecraft 等其他遊戲伺服器設定差不多,可以參考相關文章。

接下來需要在手機安裝 ssh 軟體,我採用 JuiceSSH(軟體繁多大同小異,隨便選一個就好了)。

啟動 JuiceSSH,選取快速連線,輸入

pi@ip位址

並輸入密碼就可以用 pi 的身分連入,使用狀況和 cmd 沒什麼差別,之後就可以利用 ssh 對樹莓派做操作了。

補充:在 ssh 執行的程式,只要 ssh 中斷連線就會被終止。

補充: 上面這些登入 ssh 的操作其實風險極高,公網上有非常多人會嘗試使用暴力破解登入 ssh。如果不小心被猜到密碼就會導致主機淪為肉雞。 除了更改預設的使用者名稱再加上複雜密碼外,可以再搭配Fail2ban來防止密碼暴力破解。 最安全的方法就是直接關閉密碼驗證,改用全面公鑰登入。有興趣的人可以參考這篇文章

編寫 Shell Script 來快速啟動 Bot

由於 Python 的 venv 啟動起來很麻煩,因此可以編寫腳本來解決問題,執行以下指令(自行替換名稱及路徑)

1
2
touch YueLauncher.sh
chmod +x YueLauncher.sh

解釋:建立名為YueLauncher.sh的檔案,並更改為可執行檔

接下來用 Vim 或是文字編輯器在檔案中加入以下內容(自行替換名稱及路徑)

1
2
3
source ~/Documents/Yue/venv/bin/activate
cd ~/Documents/Yue/
nohup python -W ignore Bot/Yue.py &> Log.txt &

解釋:啟動虛擬環境,在背景下利用 Python 執行 Yue.py,且使用者登出時不關閉程式(包含 ssh)

最後,啟動這個腳本來啟動程式(如果已經在家目錄下,不須執行 cd,因此可以在剛登入 ssh 後就立刻執行)

1
2
cd ~
./YueLauncher.sh

之後 cmd 不會有任何提示,但是 Bot 就會默默啟動了,並且在關閉以後把紀錄丟到目錄裡面的 Log.txt 裡面。如果要關閉 Bot 可以從 cmd 用指令 kill 掉處理程序,或是在 Discord Bot 加入關閉或重啟的指令,就可以從 Discord 客戶端控制。

結語

樹莓派有非常多玩法,用來掛 Discord Bot 只是其中一種,各位有空也可以來玩玩看樹莓派喔!