原神 & 星穹鐵道 Discord Bot
歡迎將本專案所有或部分程式碼放入你自己的機器人中,只需要在你專案的網頁、README 或任何公開的說明文件放入本專案的作者與連結
Feel free to take all or part of the code to your own bot, just put the author and URL of this project in your project's website, README or any public documentation.
邀請原神小幫手
https://bit.ly/原神小幫手邀請
點擊上圖或邀請連結:Discord 支援伺服器:https://discord.gg/myugWxgRjd
簡介
使用機器人直接在 Discord 聊天頻道內查看原神、星穹鐵道內各項資訊,包含:
- 查詢即時便箋
- 原神:包含樹脂、洞天寶錢、參數質變儀、探索派遣完成時間...等
- 星穹鐵道:包含開拓力、委託執行
- 每日早上 8 點開始 Hoyolab 自動簽到 (包含簽到崩壞3、星穹鐵道)
- 自動檢查即時便箋 (原神、星鐵)、樹脂 (開拓力)、寶錢、質變儀、探索派遣,當快額滿時發送提醒
- 查詢深境螺旋紀錄
- 查詢旅行者札記
- 個人紀錄卡片(遊戲天數、成就、神瞳、世界探索度...等等)
- 查詢任意玩家的原神/星穹鐵道角色展示櫃,顯示展示櫃內角色的面板、聖遺物詳情
- 查看原神遊戲內公告,包含活動、卡池資訊
- 採用新的斜線指令,輸入 / 自動彈出指令提示,不需要記憶任何指令的使用方式
使用方式
- 邀請到自己伺服器後,輸入斜線
/
查看各項指令 - 第一次請先使用指令
/cookie設定
,Cookie 取得方式:https://bit.ly/3LgQkg0 - 設定自動簽到與樹脂提醒,使用指令
/schedule排程
展示
更多展示圖片、GIF 請參考巴哈介紹文章:https://forum.gamer.com.tw/Co.php?bsn=36730&sn=162433
專案資料夾結構
Genshin-Discord-Bot
├── assets = 存放素材的資料夾
| ├── font = 畫圖所用到的字體
| └── image = 畫圖所用到的素材、背景圖
├── cogs = 存放 discord.py cog 資料夾,這裡有所有的機器人指令
├── cogs_external= 存放自訂的 discord.py cog 資料夾,你可以將自己指令的檔案放在這裡
├── configs = 存放設定檔的資料夾
├── database = SQLAlchemy ORM、資料庫操作相關的程式碼
| ├── dataclass = 自定義的 data class
| └── legacy = 以前的資料庫程式碼,用來遷移舊資料之外沒有用
├── enka_network = 與 Enka Network API 相關的程式碼
| └── enka_card = Submodule,與畫 Enka 圖片相關的程式碼
├── genshin_db = 與 genshin-db API 相關的程式碼
| └── models = 存放 genshin-db 資料的 pydantic 模型
├── genshin_py = 與 genshin.py 相關的程式碼
| ├── auto_task = 與自動排程任務 (例如:簽到) 相關的程式碼
| ├── client = 向 API 請求資料相關的程式碼
| └── parser = 將 API 的資料轉成 discord embed 格式
├── star_rail = 星穹鐵道展示櫃程式碼
└── utility = 一些本專案用到的設定、公用函數、Log、表情、Prometheus...等程式碼
自己安裝 & 架設機器人
網頁端
需要在此步驟取得:
- 機器人 Application ID
- 機器人 Bot token
- 自己的管理伺服器 ID
>>> 點此查看完整內容 <<<
- 到 Discord Developer 登入 Discord 帳號
- 點選「New Application」建立應用,輸入想要的名稱後按「Create」
- 在 Bot 頁面,按「Add Bot」新增機器人
- 在 OAuth2/URL Generator,分別勾選「bot」「applications.commands」「Send Messages」,最底下產生的 URL 連結就是機器人的邀請連結,開啟連結將機器人邀請至自己的伺服器
取得配置檔案所需 ID
- 在 General Information,取得機器人的 Application ID
- 在 Bot 頁面,按「Reset Token」來取得機器人的 Token
- 在自己的 Discord 伺服器名稱或圖示上按滑鼠右鍵,複製伺服器 ID(複製 ID 按鈕需要去 設定->進階->開發者模式 開啟)
本地端
第一次使用
- 安裝 Docker (不會安裝的請自行 Google 教學)
接下來沒特別說明都以 Windows、使用 Powershell 來說明
-
找到你想放資料的地方,建立機器人資料夾
Genshin-Discord-Bot
,然後進入 -
下載 docker-compose.yml 檔案,放在資料夾內
-
文字編輯器開啟
docker-compose.yml
檔案,基本上都不用動,只要把你剛剛在 #網頁端 拿到的三個資料填入底下三個欄位即可,其他設定可根據自己的需求再改,完成後保存- APPLICATION_ID=123456789
- TEST_SERVER_ID=123456789
- BOT_TOKEN=ABCD123456789
-
在此資料夾開啟 Powershell,輸入底下命令即可運行
docker-compose up
若你想要可以關掉 Powershell 在背景執行的話,則使用
docker-compose up -d
Windows 右下角的鯨魚圖示打開 Docker Desktop 可以隨時管理機器人運行的狀態
註1:當運行後看到 【系統】on_ready: You have logged in as XXXXX
表示參數設置正確並成功啟動,此時機器人會自動同步所有指令到你的測試伺服器,稱為「本地同步」。
註2:若你輸入斜線 / 後看不到指令的話,請嘗試 CTRL + R 重新整理或是完全關閉 Discord 軟體並重啟 Discord。
註3:若要在多個伺服器間使用,請在你機器人的私訊頻道內輸入 $jsk sync
,並等待(約幾分鐘)Discord 將指令推送,稱為「全域同步」。
從 v1.2.1 版升級上來
- 建立新的資料夾
Genshin-Discord-Bot
,一樣先照上面做到第 4 步驟 - 將舊版的
data
資料夾內的資料:bot.db
(emoji.json
),複製到新資料夾對應位置 - 所以現在新資料夾結構如下:
Genshin-Discord-Bot/
├── docker-compose.yml
└── data/
├── bot/
│ └── bot.db
├── app_commands.json
└── emoji.json
- 回到
Genshin-Discord-Bot
目錄,因為資料庫結構有變動,需要先執行指令- Windows (Powershell):
docker run -v ${pwd}/data:/app/data ghcr.io/kt-yeh/genshin-discord-bot:latest python main.py --migrate_database
- Linux:
sudo docker run -v $(pwd)/data:/app/data ghcr.io/kt-yeh/genshin-discord-bot:latest python main.py --migrate_database
- Windows (Powershell):
- 完成變更資料庫後,執行
docker-compose up
即可開始運行機器人
檔案說明 & 資料備份
成功運行機器人後,你的資料夾結構應該是這樣:
Genshin-Discord-Bot/
├── docker-compose.yml = docker 設定擋,啟動機器人相關設定都在此檔案
├── cogs_external/ = 你可以放自己寫的 discord.py cog 到此目錄
└── data/ = 機器人運行時產生的資料都放在此目錄
├── bot/
│ └── bot.db = 資料庫檔案
├── font/ = 存放字體資料夾
├── image/ = 存放圖片資料夾
├── _app_commands.json = 指令 mention 設定檔案
├── _emoji.json = 表情符號設定檔案
├── grafana_dashboard.json = grafana 面板設定檔案
└── prometheus.yml = prometheus 伺服器設定擋
資料都放在 data
資料夾內,備份整個資料夾即可
如何更新
當專案有更新時,到 Genshin-Discord-Bot
目錄開啟 Powershell
- 抓新版 image
docker-compose pull
- 重新啟動機器人
docker-compose up -d
表情符號配置說明 (data/emoji.json)
點此查看完整內容
非必要,不配置表情符號也能正常運行機器人
- 到
data
目錄將_emoji.json
重新命名為emoji.json
- 自行上傳相關的表情符號至自己的伺服器
- 將相對應的表情符號依照 Discord 格式填入到
emoji.json
檔案裡
註:
- Discord 表情符號格式:
<:表符名字:表符ID>
,例如:<:Mora:979597026285200002>
- 可以在 Discord 訊息頻道輸入
\:表符名字:
取得上述格式
Sentry 配置說明
點此查看完整內容
非必要,Sentry 是用來追蹤程式執行中沒接到的例外,並將發生例外當時的函式呼叫、變數、例外...等詳細資訊傳送到網頁上供開發者追蹤,若不需要此功能的話可以跳過此設定
- 到官網註冊帳號:https://sentry.io/
- 在帳號內建立一個 Python 專案,建立後可取得該專案的 DSN 網址(格式:
https://[email protected]/xxx
) - 將此 DSN 網址貼到
docker-compose.yml
檔案的SENTRY_SDK_DSN
欄位裡
註:
- 若沒有指定,Sentry 預設只發送沒有 try/except 的例外
- 若要將特定接到的例外發送到 Sentry 的話,請在該 except 內使用
sentry_sdk.capture_exception(exception)
Admin 管理指令說明
點此查看完整內容
管理指令只能在配置檔案設定的測試伺服器內才能使用
/status:顯示機器人狀態,包含延遲、已連接伺服器數量、已連接伺服器名稱
/system:立即開始每日簽到任務、下載 Enka 展示櫃新素材
/system precense 字串1,字串2,字串3,...:變更機器人顯示狀態(正在玩 ...),每分鐘隨機變更為設定的其中一個字串,字串數量不限
/maintenance:設定遊戲維護時間,在此時間內自動排程(簽到、檢查樹脂)不會執行
/config:動態改動部分設定的值
另外,機器人包含了 jsk
指令可以做到載入/重載模組、同步指令、執行程式碼...等等,請參考 jishaku 網站 說明。
要使用 jsk 指令,可以
- 在機器人私訊內使用,例如:
$jsk ping
- 在一般頻道 tag 機器人使用,例如:
@原神小幫手 jsk ping
Prometheus / Grafana 監控儀錶板說明
點此查看完整內容
儀表板展示圖
總共需要三步驟,分別是
- Grafana 官網辦帳號取得 API Key
- 設定 Prometheus 伺服器
- 在 Grafana 匯入儀表板 (Dashboard)
1. Grafana 帳號辦理
-
到 Grafana 官網 註冊帳號,途中會讓你選 Cloud 地區,直接預設就可以
-
辦完後回到 官網,右上角選 My Account,如下圖可以看到 GRAFANA CLOUD 裡面有 Grafana 與 Prometheus,在 Prometheus 上選擇 Send Metrics
-
滑到頁面中間,在 Password / API Key 這裡選擇 Generate now,然後下面的 Sending metrics 黑底部分很重要,先留在這個頁面
2. 設定 Prometheus
-
回到機器人資料夾,文字編輯器開啟
docker-compose.yml
檔案- 最下方
prometheus
整段取消註解 (注意欄位格式要對齊) - 機器人進階設定取消註解
- PROMETHEUS_SERVER_PORT=9091
- 最下方
-
到
data
資料夾,文字編輯器開啟prometheus.yml
檔案 -
回到剛才 Grafana 網頁,你會看到網頁上的
remote_write
欄位與prometheus.yml
檔案最底下相對應,將網頁上remote_write
的設定內容一一填入到prometheus.yml
內的對應欄位,然後存檔
remote_write:
- url: https://....(此行填入 Remote Write Endpoint)
basic_auth:
username: 123456(此行填入 Username / Instance ID)
password: XXXXXX(此行填入 Password / API Key)
- 重新運行機器人
docker-compose up -d
Grafana 匯入儀表板
有資料後,我們還需要讓資料顯示在儀表板上
-
與 1-2 步驟一樣,回到 官網,右上角選 My Account,這次我們在 Grafana 上按 Launch 啟動
-
到
data
資料夾,上傳grafana_dashboard.json
到 Grafana 上面,也可以複製貼上到 Grafana -
成功匯入儀表板後,即可在儀表板上看到機器人的各項資料,到此完成結束
致謝
- 原神 API 使用自: https://github.com/thesadru/genshin.py
- Discord API 使用自: https://github.com/Rapptz/discord.py
- Enka Network API 使用自: https://github.com/EnkaNetwork/API-docs
- Genshin-DB API 使用自: https://github.com/theBowja/genshin-db
- d.py-ext-prometheus: https://github.com/Apollo-Roboto/discord.py-ext-prometheus