這是一篇 Discord Bot 的進階教學,會使用 [Python Cog 架構](https://hackmd.io/@smallshawn95/python_discord_bot_cog)撰寫。 「今天要吃什麼?」、「下個月要去哪裡玩?」,每當群組裡七嘴八舌,每個人都有自己意見的時候,「投票」肯定是最簡單快速的解決方案。 在過去需要投票時,只能傳送一則訊息,然後叫大家點擊 Reactions 表情符號來計票。但現在 Discord 官方已經推出原生的投票功能,接下來的教學,將帶你學會如何撰寫 Poll 投票功能。 :::success :book: **更多 Python Discord Bot 教學系列和程式範例** https://github.com/smallshawn95/Python-Discord-Bot-Course.git ::: --- [TOC] --- ## 一、Poll 簡介: Discord Poll 是 Discord 原生的投票系統,提供了一個能讓使用者輕鬆發起決策或者意見調查的功能。在過去,開發者若要製作投票功能,通常依賴表情符號或按鈕來計算票數,不僅程式邏輯繁瑣,投票介面也雜亂不已。 隨著 [discord.py v2.4.0](https://discordpy.readthedocs.io/en/stable/whats_new.html#v2-4-0) 的更新,Discord Bot 正式引入了 discord.Poll 類別。一個 Poll 主要由「問題 Question」與「選項 Answers」組成,一個 Poll 最多包含 10 個選項,每個選項皆可包含文字或 Emoji。 更多資訊可參考 [Discord.py Poll 官方文檔](https://discordpy.readthedocs.io/en/stable/api.html#discord.Poll)。 ## 二、Poll 參數: ```python discord.Poll( question: Union[discord.PollMedia, str], duration: datetime.timedelta, multiple: bool = False, layout_type: discord.PollLayoutType = discord.PollLayoutType.default ) ``` * **question 問題 (必填)** Poll 的主題內容,最多 300 個字元。 * **duration 持續時間 (必填)** Poll 的有效時間,以整數小時為單位。 * **multiple 複選** Poll 是否允許使用者選擇多個選項,預設為單選。 * **layout_type 佈局類型** Poll 介面的排版樣式,目前只提供 default 可以選擇。 ## 三、Poll 撰寫: :::warning :bell: Poll 中 duration 參數需使用,需先導入 datetime 模組中的 timedalay 類別 ```python from datetime import timedelta ``` ::: * 基本單選 ```python= @app_commands.command(name="poll_base", description="投票基本") async def poll_base(self, interaction: discord.Interaction): # 宣告 Poll 類別,填入兩個必填參數 poll = discord.Poll( question="晚餐吃什麼?", duration=timedelta(hours=1) ) # 依序添加選項,text 和 emoji 參數自由選擇填寫 poll.add_answer(text="漢堡王") poll.add_answer(text="丹丹漢堡") poll.add_answer(text="麥當勞", emoji="🍟") poll.add_answer(text="肯德基", emoji="🍗") await interaction.response.send_message(poll=poll) ``` ![image](https://hackmd.io/_uploads/S16fKz-SZx.png) * 完整複選 ```python= @app_commands.command(name="poll_multiple", description="投票複選") async def poll_multiple(self, interaction: discord.Interaction): # duration 參數設為 31 天後截止 # multiple 參數設為 True 即可讓使用者複選選項 poll = discord.Poll( question="舉辦哪個運動項目賽事", duration=timedelta(hours=31 * 24), multiple=True, layout_type=discord.PollLayoutType.default ) poll.add_answer(text="籃球", emoji="🏀") poll.add_answer(text="排球", emoji="🏐") poll.add_answer(text="桌球", emoji="🏓") poll.add_answer(text="足球", emoji="⚽") poll.add_answer(text="棒球", emoji="⚾") poll.add_answer(text="壘球", emoji="🥎") poll.add_answer(text="撞球", emoji="🎱") poll.add_answer(text="網球", emoji="🎾") poll.add_answer(text="橄欖球", emoji="🏈") poll.add_answer(text="羽毛球", emoji="🏸") await interaction.response.send_message(poll=poll) ``` ![image](https://hackmd.io/_uploads/rJt8_GZBZg.png) --- :::info 📢 **歡迎加入我的 Discord 伺服器** https://discord.gg/Jtd3eVrFJs ::: *Copyright © 2026 SmallShawn95. All rights reserved.*