Webhook
Webhook 是 Discord 提供的一種簡單方式,讓你的程式或服務可以自動發送訊息到指定的頻道,不需要機器人你只要建立 Webhook URL,然後用POST請求就能發送訊息、圖片或內嵌訊息...
頻道歷史
函數內容取得歷史訊息可以使用channel.history(),其中channel的來源不限如何取得channel請參考頻道物件 channel.history()這個函數會返回頻道的所有歷史訊息,可以有以下參數 limit=100: 最大數量,填入None則會返回所有 before=None/after=None: 限定時間範圍,需要是datetime.datetime類別的物件 around=None: 返回這個日期左右的訊息,需要是datetime.datetime類別的物件 oldest_first=None: 是否從最舊的開始抓,如果有指定after的話就會自動設為True 這個函數返回的結果是一個可以被迭代的物件可以想像成特殊的陣列,用for迴圈來取用 範例範例,印出50則訊息的內容 123#用async for迴圈來取得內容,取出來的會是一個訊息物件async for msg in channel.history(limit=50): ...
Gemini API
Gemini直翻為雙子座,是Google的大型語言模型它提供免費的API使用,並且把API包裝成一個套件,讓我們不用手動request 安裝套件1pip install google-genai 一樣視編譯器而更改開頭,但套件名稱就是google-genai 送出一個prompt首先到Google AI Studio申請一個API金鑰登入帳號後同意使用條款,然後Create API key生成的代碼跟機器人的token一樣,請用生命保護它 送出一個prompt並拿到回應需要3個變數 client: 建立一個連線,告訴Gemini我等等會用你 prompt: 提示詞 response: 回應的內容,包含這次使用的模型、微調數據等,也包含回應文字本體 首先引入套件 1from google import genai 然後建立一個用戶端Client,以及想說的prompt 123client = genai.Client(api_key="剛剛拿到的金鑰")prompt =...
工作循環
工作循環是一個裝飾器,可以在固定時間或固定間隔執行工作包括但不限於抓取API、發訊息等等,也可以做與機器人完全不相干的事 設定先引入tasks,該模組位於discord.ext下,所以可以與commands合併寫成 1from discord.ext import commands, tasks 固定間隔對一個函數使用裝飾器@tasks.loop()括號內填入參數 hours minutes seconds可以不必三個都填,選擇需要的即可 123@tasks.loop(hours=11, minutes=45, seconds=14)async def myfunction(): # 內容 固定時間固定時間需要引入datetime模組來進行操作指定時區則需要pytz,或是用原生的時區 12345678910111213141516171819202122import datetimeimport pytz# 指定時區 (tz是timezone的縮寫)# 以下做法擇一即可# 1tz = datetime.timezone(timedelta(hours=8)) #...
Cog擴充
Cog是Discord機器人的模組可以像Python一樣將不同功能分開管理最後引入機器人內即可完成也可以做到群組指令 主檔案bot.py首先,在根目錄建立一個資料夾用來存放cog檔案,此處以cogs為例先引入os模組,接著在main()函數上方貼上以下內容(非常重要,一定要在main()前面): 12345async def load_ext(): for filename in os.listdir("./cogs"): # 遍歷一次每個檔案 if filename.endswith(".py"): # 如果該檔案是.py結尾 await bot.load_extension(f"cogs.{filename[:-3]}") # 載入"cogs.檔案" print(f"Loaded {filename}") #...
型別標註
型別標注可以標注函數、參數與變數的結果使開發時更容易 有些編輯器會自動辨識型別標注,在用法錯誤時自動指出錯誤減少錯誤的機率 但需注意的是,型別標注只是為了開發方便,可以清楚看出每一項變數或函數是什麼類別實際上型別標注錯誤並不會在執行時有問題除非像Discord機器人有特殊要求 印出型別可以透過以下函數印出該內容的型別以下功能測試時可使用 12content = #內容print(type(content)) 變數變數的標注方法,是在定義時加上冒號與類別不經常用到,因為可以透過內容來辨識型別若變數為函數結果,也可以透過函數的型別標注來辨認除非該函數沒有型別標注 123a:int = 1b:str = "hello"c:list = process(a) 函數參數此用法之前就用過,此處當複習 1234567# 印出n次訊息# 此處透過標注來限定number是整數,message是字串def func(number:int, message:str): print(message * number, end="\n")func(3,...
裝飾器
裝飾器是一種特別的用法,可以在不改變原始函數的前提下新增內容就像是在原始的內容下包了一層特殊的能力 裝飾器的本質裝飾器其實就是一個可以接收函數作為參數的函數Python是一個物件導向的程式語言,意即所有東西都是一個物件就連函數也不例外 只要是一個物件就可以當成參數 12345678910111213141516def my_decorator(func): def wrapper(): print("裝飾器正在執行一些事情...") func() print("裝飾器完成執行!") return wrapper@my_decoratordef say_hello(): print("Hello, world!")say_hello()# 裝飾器正在執行一些事情...# Hello, world!#...
讀寫檔案
Open函數open函數可以讓我們開啟檔案,並以各種方式存取 1file = open("result.txt", mode='r', encoding='utf8') 第一個參數放檔案名稱,需要加副檔名 第二個參數指定為mode r (read)只讀取 w (write)只寫入(任何寫入會直接覆蓋掉所有內容) r+ 讀取後會需要重新寫入 (會加在檔案結尾,原本內容會保留) w+ 寫入後需要重新讀取 (任何寫入也會覆蓋原本內容) 第三個參數指定為encoding,若沒有其他特殊編碼需求一律填utf8 file會變成一個物件,內含檔案的資訊,還有檔案的內容但不能直接print出來,需要用內建的方法讀取但檔案會一直保持開啟,為了良好的電腦資源管理,結束操作需要關閉 1file.close() 自動關閉檔案如果你覺得每次都要手動關閉檔案很麻煩,而且你開啟檔案也只做一兩個動作,可以像這樣寫: 123with open("result.txt", mode='r',...
參數進階應用
參數選單Choice物件在上方引入物件與套件,方便我們操作而不需加太多前綴不然原本須使用app_commands.Choice()這麼長一串但引入後只需使用Choice() 12from discord.app_commands import Choicefrom discord import app_commands Choice物件通常會使用兩個參數:name 跟value name是在Discord內實際使用時會顯示的名稱,value是後台取得的值,可以是字串或數字,例如 12Choice(name='宇宙無敵霹靂超級棒', value='supercalifragilisticexpialidocious')Choice(name='最高分', value=10) 基本語法12345678910@bot.tree.command()@app_commands.choices( color=[ Choice(name="紅色",...
頻道物件
頻道有屬於自己的物件,與使用者一樣,記載許多相關資訊 頻道有分很多種,而最常拿來操作的是文字頻道所以此文以discord.TextChannel 來當作範例,這是文字頻道所屬的類別 建議閱讀使用者物件 輸入頻道此處方法跟輸入使用者一樣,不多做贅述 取得頻道數字ID此處跟取得使用者不同,需要使用await 1channel = await bot.fetch_channel(頻道ID) 指令頻道也可以取得使用者輸入指令的頻道 1channel = interaction.channel 常用屬性name頻道的名稱頻道的名稱跟使用者不一樣,只有一個,所以不需要擔心取到哪一個 guild / id這是頻道所屬伺服器與頻道本身id此處可以注意到,Discord的物件間都是環環相扣的,每一個物件都可以與另一個物件有關聯 mention與使用者的概念一樣,當訊息送出時可以提及該頻道 send()這個方法我們之前有學過了,就是ctx.channel.send()在該頻道送出一個訊息 1234@bot.tree.command()async def...