這是一篇 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)
```

* 完整複選
```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)
```

---
:::info
📢 **歡迎加入我的 Discord 伺服器**
https://discord.gg/Jtd3eVrFJs
:::
*Copyright © 2026 SmallShawn95. All rights reserved.*