嵌入
在 Discord 中,Embed(嵌入訊息)是一種格式化訊息的方式,能讓機器人發送 更美觀、結構更清晰 的訊息。你可以用它呈現 標題與說明文字 超連結 欄位(Fields) 圖片與縮圖 作者資訊、時間戳與顏色等裝飾元素 這種結構化格式非常適合呈現資訊、狀態、排行榜、通知等內容。 事實上,對於大部分的超連結網址,Discord都會自動抓取網站的預覽內容並生成一個嵌入,可以自行貼一個Youtube影片來看看 基本語法一個嵌入訊息是discord.Embed組成的物件,可以用基本的物件初始化來達成: 12345678from datetime import datetimeembed = discord.Embed( title="這是標題", description="這是說明文字", color=discord.Color.blue(), # 可以是 Color.red(), Color.green()等顏色, 或16進位整數 timestamp =...
感謝各位
最後一堂課也結束了,我們一起回顧整年的課程吧沒有正經八百的知識,只有一起的時光順便補一點背後的小故事 當你閱讀這篇文字的時候,不論你中間是否跳過了一些課程,還是你整年都參與了,我都十分感激 下文超級長,不想讀的直接跳去最後吧 ->...
抓取學校公告
抓取學校公告涉及一些處理xml或是html格式的用法,所以我們先來簡單介紹一下BeautifulSoup4這個套件 BeautifulSoup4BeautifulSoup4(簡稱 bs4)是一個 Python 套件,用來解析 HTML 或 XML 文件。它可以幫助你從網頁中輕鬆提取資料,不需要處理複雜的字串操作。 不要問為什麼叫美麗湯,因為套件的作者爽這樣叫 初始化開始之前,請先安裝這個套件 1pip install beautifulsoup4 然後用這個方法建立一個解析器 12345678910111213141516from bs4 import BeautifulSoup# 範例資料html = """<html> <body> <h1>Hello World</h1> <p>這是一段<br/>文字</p> <p>這是第二段文字</p> ...
UI元件
UI元件是Discord提供的互動性元件有別於之前所學的,單純只有文字可用,此類別可以讓我們創造圖形化的按鈕和選單等等 此用法非常需要對於物件與類別的熟悉度,忘記的一定要加緊複習 範例資料請在資料夾內開一個檔案data.json並儲存以下內容如果你不記得如何讀取json資料,也可以在程式碼內貼上以下內容作為辭典儲存,或參考以下做法 資料 12345678910{ "fish": { "amount": 12, "price": 30 }, "pork": { "amount": 34, "price": 50 }} 讀取資料 123456import jsonwith open('data.json', 'r', encoding='utf8') as f: ...
播放音樂
discord允許我們提供音檔來讓機器人播放聲音如果音檔為音樂,則可以實現播放音樂的功能 環境準備播放音樂以及抓取音檔需要額外的套件,請一樣依照自己的電腦環境來替換開頭: 1pip install yt-dlp discord.py[voice] python-ffmpeg yt-dlp是提取Youtube影片資料的discord.py[voice]是discord.py的語音擴充python-ffmpeg可以把音檔轉換成二進制檔案供Discord使用 屬性介紹voice屬性之前我們講過使用者有許多屬性,其中voice沒有提到,今天簡單介紹我們需要用到的部分user.voice屬性本身屬於discord.VoiceState類別,代表目前該使用者的語音狀態,如果沒有在語音狀態則是None如果存在的話會有以下常用屬性(非全部) deaf: 是否拒聽 mute: 是否靜音 channel: 連線到的頻道 self_stream:...
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}") #...