--- title: Discord.py 機器人從0到1超詳細教學 tags: 教學文,Discord,Python --- # Discord.py 機器人從0到1超詳細教學 本教學相關教學綜合網上諸多教學及本人實際操作,歡迎參考及補充! 創建新的機器人 --- 1. 首先到 [Discord Developers](https://discord.com/developers/applications),登入你的 Discord 帳號後......! ![](https://i.imgur.com/VO3AYQC.png) 2. 點擊「New Application」,輸入完你想要的名稱後就按下「Create」,之後都還可以做更改這點不用擔心.w. ![](https://i.imgur.com/Z7SJ6zg.png) 3. 左上點擊後會出現側邊欄,點擊`Bot`,按下「Add Bot」就可以創造一隻機器人咯! ![](https://i.imgur.com/EvFJLzW.png) 4. 前往「OAuth2」, 在「SCOPES」中點選 bot,下方連接就是機器人邀請連結,就可以將機器人邀請進去你自己的群咯! ![](https://i.imgur.com/Pv0wWsQ.png) 安裝 Python --- 1. 前往官網下載(https://www.python.org/downloads/) 2. 安裝 安裝 pip 及 Discord&#46;py --- 第一種方法,可以參考(https://hackmd.io/@yizhewang/B1zdXG4br) 將 Python 加到系統路徑 第二種方式,可以開啟 CMD 直接用 cd 指令到 Python 所在資料夾 可以用 ```python= python --version ``` 來檢查是否可以正確執行。 最後,安裝 discord.py: ```python= python -m pip install -U discord.py ``` ![](https://i.imgur.com/aXMiOLj.png) 完成截圖 2022.12.9 更新 intents 性質性質 --- Discord.py 在定義 discord.Client 時需要額外帶入 intents 參數 ```python= #client 是我們與 Discord 連結的橋樑,intents 是我們要求的權限 client = discord.Client(intents=discord.Intents.default()) ``` 或是想帶入個別權可以使用以下寫法: ``` client = discord.Client(intents=discord.Intents(messages=True, guilds=True)) ``` 通常我會習慣用 default + message_content 的權限,讓機器人有講話的權利! ```python= #client 是我們與 Discord 連結的橋樑,intents 是我們要求的權限 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) ``` intents 可以用目前已經有的三種模板 - [discord.Intents.all()](https://discordpy.readthedocs.io/en/stable/api.html#discord.Intents.all) - [discord.Intents.default()](https://discordpy.readthedocs.io/en/stable/api.html#discord.Intents.default) - [discord.Intents.none()](https://discordpy.readthedocs.io/en/stable/api.html#discord.Intents.none) 其他 intents 可以從這邊查到,通常用 default 即可:https://discordpy.readthedocs.io/en/stable/api.html#intents 記得也要到 Discord Develop 頁面去修正 ![](https://i.imgur.com/P4NdMOh.png) 開始啟動機器人,讓他可以上線 --- ```python= #導入 Discord.py import discord #client 是我們與 Discord 連結的橋樑,intents 是我們要求的權限 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) #調用 event 函式庫 @client.event #當機器人完成啟動時 async def on_ready(): print('目前登入身份:', client.user) @client.event #當有訊息時 async def on_message(message): #排除自己的訊息,避免陷入無限循環 if message.author == client.user: return #如果包含 ping,機器人回傳 pong if message.content == 'ping': await message.channel.send('pong') client.run('你的機器人 TOKEN') #TOKEN 在剛剛 Discord Developer 那邊「BOT」頁面裡面 ``` event 函式庫 API 查詢:https://discordpy.readthedocs.io/en/latest/api.html#event-reference discord.py 官方API:https://discordpy.readthedocs.io/en/latest/api.html 讓他說你說的話 --- ```python= #導入Discord.py import discord #client 是我們與 Discord 連結的橋樑,intents 是我們要求的權限 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) #調用event函式庫 @client.event #當機器人完成啟動時 async def on_ready(): print('目前登入身份:',client.user) @client.event #當有訊息時 async def on_message(message): #排除自己的訊息,避免陷入無限循環 if message.author == client.user: return #如果以「說」開頭 if message.content.startswith('說'): #分割訊息成兩份 tmp = message.content.split(" ",2) #如果分割後串列長度只有1 if len(tmp) == 1: await message.channel.send("你要我說什麼啦?") else: await message.channel.send(tmp[1]) client.run('你的機器人TOKEN') #TOKEN在剛剛Discord Developer那邊「BOT」頁面裡面 ``` ![](https://i.imgur.com/YGKHjBv.png) 設定機器人狀態 --- ```python= #導入Discord.py import discord #client 是我們與 Discord 連結的橋樑,intents 是我們要求的權限 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) #調用event函式庫 @client.event #當機器人完成啟動時 async def on_ready(): print('目前登入身份:',client.user) game = discord.Game('努力學習py中') #discord.Status.<狀態>,可以是online,offline,idle,dnd,invisible await client.change_presence(status=discord.Status.idle, activity=game) @client.event #當有訊息時 async def on_message(message): #排除自己的訊息,避免陷入無限循環 if message.author == client.user: return #如果以「說」開頭 if message.content.startswith('說'): #分割訊息成兩份 tmp = message.content.split(" ",2) #如果分割後串列長度只有1 if len(tmp) == 1: await message.channel.send("你要我說什麼啦?") else: await message.channel.send(tmp[1]) if message.content.startswith('更改狀態'): #切兩刀訊息 tmp = message.content.split(" ",2) #如果分割後串列長度只有1 if len(tmp) == 1: await message.channel.send("你要改成什麼啦?") else: game = discord.Game(tmp[1]) #discord.Status.<狀態>,可以是online,offline,idle,dnd,invisible await client.change_presence(status=discord.Status.idle, activity=game) client.run('你的機器人TOKEN') #TOKEN在剛剛Discord Developer那邊「BOT」頁面裡面 ``` ![](https://i.imgur.com/EJciFhl.png) 輸入 ```更改狀態 啊啊啊啊好難啊``` ![](https://i.imgur.com/utZrYCP.png) 開始跟機器人互動吧 --- ```python= #導入Discord.py import discord import time #client 是我們與 Discord 連結的橋樑,intents 是我們要求的權限 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) #調用event函式庫 @client.event #當機器人完成啟動時 async def on_ready(): print('目前登入身份:',client.user) game = discord.Game('努力學習py中') #discord.Status.<狀態>,可以是online,offline,idle,dnd,invisible await client.change_presence(status=discord.Status.idle, activity=game) @client.event #當有訊息時 async def on_message(message): if message.content.startswith('跟我打聲招呼吧'): channel = message.channel #機器人叫你先跟他說你好 await channel.send('那你先跟我說你好') #檢查函式,確認使用者是否在相同頻道打上「你好」 def checkmessage(m): return m.content == '你好' and m.channel == channel #獲取傳訊息的資訊(message是類型,也可以用reaction_add等等動作) msg = await client.wait_for('message', check=checkmessage) await channel.send('嗨, {.author}!'.format(msg)) client.run('你的機器人TOKEN') #TOKEN在剛剛Discord Developer那邊「BOT」頁面裡面 ``` 我就是要嗆你 --- ```python= #導入Discord.py import discord #為了asyncio.sleep() import asyncio #client 是我們與 Discord 連結的橋樑,intents 是我們要求的權限 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event #當有訊息時 async def on_message(message): if message.content == '我好帥喔': #發送訊息,並將本次訊息資料存入tmpmsg,方便之後刪除 tmpmsg = await message.channel.send('你確定你帥嗎?') #停頓3秒 await asyncio.sleep(3) #刪除訊息 await tmpmsg.delete() client.run('你的機器人TOKEN') #TOKEN在剛剛Discord Developer那邊「BOT」頁面裡面 ``` 這樣下來我只要輸入「我好帥喔」,機器人就會回嗆我「你確定你帥嗎?」,但三秒後會自動刪除 我就是要嗆你-延伸版 --- ```python= #導入Discord.py import discord import time #client 是我們與 Discord 連結的橋樑,intents 是我們要求的權限 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event #當有訊息時 async def on_message(message): if message.content == '我好帥喔': #刪除傳送者的訊息 await message.delete() #然後回傳訊息 await message.channel.send('不好意思,不要騙人啦') client.run('你的機器人TOKEN') #TOKEN在剛剛Discord Developer那邊「BOT」頁面裡面 ``` 這樣下來我只要輸入「我好帥喔」,機器人就會直接刪除我的訊息,並且說「不好意思,不要騙人啦」 我人在哪? --- ```python= #導入Discord.py import discord import time #client 是我們與 Discord 連結的橋樑,intents 是我們要求的權限 intents = discord.Intents.default() intents.message_content = True client = discord.Client(intents=intents) @client.event #當有訊息時 async def on_message(message): if message.content == '群組': #獲取當前所在群組(極限150個,預設為100個),並用flatten將它全部移到guilds這個list裡面 guilds = await client.fetch_guilds(limit=150).flatten() #遍尋 guilds for i in guilds: #由於我們只要 guilds 的name 就好,當然也可以獲取 id~ await message.channel.send(i.name) client.run('你的機器人 TOKEN') #TOKEN 在剛剛 Discord Developer 那邊「BOT」頁面裡面 ``` 輸入「群組」後,機器人就會打出目前所在的群組 作者聯絡資訊 --- 個人網站:https://kangjw.me Email:hi@kangjw.me