iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0

關於 Discord 機器人資料保存,有幾個常見的方法:

  1. 使用資料庫 - 最常見的方法是透過資料庫像是 MySQL、MongoDB 等來儲存機器人資料。你可以建立資料表儲存使用者資料、設定資料等,然後在機器人程式碼中連接資料庫做資料的新增、修改、刪除、查詢。

  2. 使用檔案儲存 - 另一種方法是直接把資料寫入檔案,例如使用 JSON 格式檔案儲存設定和資料。較簡單,但如果資料量大會較慢。

  3. 使用物件導向 - 如果是純粹在記憶體中處理資料,可以建立各種物件類別儲存資料,不過機器人重新啟動時這些資料就會消失。

  4. 使用雲端儲存 - 也可以把資料儲存在雲端儲存空間如 AWS S3、Cloud Storage 等,優點是可靠且可擴展,但需要付費使用這些服務。

  5. 使用 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資料格式。


上一篇
[DAY19]Discord bot接受與發送消息
下一篇
[DAY21]Discord bot非同步處理
系列文
selenium爬蟲應用至discord bot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言