關於 Discord 機器人資料保存,有幾個常見的方法:
使用資料庫 - 最常見的方法是透過資料庫像是 MySQL、MongoDB 等來儲存機器人資料。你可以建立資料表儲存使用者資料、設定資料等,然後在機器人程式碼中連接資料庫做資料的新增、修改、刪除、查詢。
使用檔案儲存 - 另一種方法是直接把資料寫入檔案,例如使用 JSON 格式檔案儲存設定和資料。較簡單,但如果資料量大會較慢。
使用物件導向 - 如果是純粹在記憶體中處理資料,可以建立各種物件類別儲存資料,不過機器人重新啟動時這些資料就會消失。
使用雲端儲存 - 也可以把資料儲存在雲端儲存空間如 AWS S3、Cloud Storage 等,優點是可靠且可擴展,但需要付費使用這些服務。
使用 Discord 平台提供的儲存空間 - Discord 也有提供少量的 key-value 儲存空間給機器人使用,可以用來儲存簡單的設定,但空間不大。
所以綜合來說,對於大多數機器人來說,使用資料庫是最好的選擇。當然也要根據實際情況如資料量大小、預算等來決定使用哪種儲存方法最適合。
以下我們就單純針對簡單的json儲存資料方式來演示。
先將機器人建置好
import discord
from discord.ext import commands
intents= discord.Intents.all()
bot = commands.Bot(command_prefix="^^", intents=intents)
#...功能
bot.run("Your token")
接著可以在同個資料夾底下建一個config.json檔案然後寫入想儲存的資料,例如:
{
"TOKEN":"Your token"
}
接著就可以使用python內建的套件去讀取json檔案
import json
# 儲存設定的檔案路徑
CONFIG_FILE = 'config.json'
# 取出設定檔案中的 Token
with open(CONFIG_FILE) as f:
config = json.load(f)
TOKEN = config['token']
bot.run(TOKEN)
儲存資料則是先建一個字典然後再將資料寫入至json檔中如下:
# 儲存所有使用者資料的字典
user_data = {}
# 用 user id 作為 key 儲存使用者資料
@client.event
async def on_message(message):
user_data[message.author.id] = {
'username': message.author.name,
'message_count': 0
}
# 計數使用者發送訊息數
user_data[message.author.id]['message_count'] += 1
# 儲存資料到檔案
with open('user_data.json', 'w') as f:
json.dump(user_data, f)
但以上方式會將新的檔案覆蓋掉原有的json,可以在每次都先讀取json檔後再做更新。
# 讀取原有的 user_data
with open('user_data.json','r') as f:
user_data = json.load(f)
# 更新 user_data
user_data[message.author.id] = {
'username': message.author.name,
'message_count': 0
}
# 如果 author_id 不存在就新增資料
if message.author.id not in user_data:
user_data[message.author.id] = {
'username': message.author.name,
'message_count': 0
}
# 寫入 user_data
with open('user_data.json','w') as f:
json.dump(user_data, f)
這樣就可以只修改異動部分,避免完全覆寫檔案。
JSON 模組在Python中提供了下列常用的方法:
json.dump(obj, fp) - 將Python物件序列化為JSON格式並寫入文件
json.dumps(obj) - 將Python物件序列化為JSON格式的str
json.load(fp) - 從文件讀取JSON資料並轉換為Python物件
json.loads(s) - 從str讀取JSON資料並轉換為Python物件
json.JSONEncoder - 自訂的Encoder用於序列化Python物件
json.JSONDecoder - 自訂的Decoder用於反序列化Python物件
這些方法可以讓我們方便的在Python和JSON格式之間轉換,用於處理資料的序列化和反序列化。
另外,JSON模組也提供了一些參數可以自定義JSON的生成格式,如縮排、分隔符號等等。
JSON 模組提供了以下幾個常用的參數來自定義生成的JSON格式:
indent - 縮排空格數。預設為None,設定為正整數時會產生縮排格式的JSON。
separators - 分隔符號。可以為二元組(item_separator, key_separator)指定自訂分隔符。
sort_keys - 是否排序key。設定為True時會按key alphabet 排序。
ensure_ascii - 是否將非ASCII字符轉為Unicode escape。預設為True。
舉例來說:
import json
data = {'name': 'John', 'age': 20}
json_str = json.dumps(data, indent=4, separators=(';', '='))
print(json_str)
輸出:
{
"name"; = "John",
"age"; = 20
}
我們設置了indent和separators參數,所以JSON串格式化了縮排和自訂分隔符號。
這些參數讓我們可以輕鬆生成美觀、可讀性好的JSON資料格式。