Discord Bot
lecturer: 乘一
~基本介紹與實作
Discord Bot是什麼?
其實就是Discord上的robot
為什麼需要Discord Bot?
有沒有想要每天一份問候?
有沒有想要在Discord裡聽音樂?
有沒有想要在Discord中玩RPG?
那麼 Discord Bot
將會成為你的好選擇!!!
主要還是因為它很好玩
我絕對沒有在推銷
各種Bot
音樂機器人
管理機器人
抓寶機器人
當然還有番號查詢機器人
為什麼要自己寫一個Bot?
都有那麼多強大的Bot了,幹嘛自己寫一個?
因為可以客製化自己的需求
e.g.
針對自己討厭的用戶
在別人裝弱的時候膜拜他
幫自己刷存在感
讓別人覺得你很厲害
本次使用之開發環境
事前準備
創建一個機器人
然後就開始製作拉~~~
把機器人加進你的伺服器
- OAuth2
- bot
- Administrator
- 獲得url
Bot基本架構
import discord #導入 Discord.py
from discord.ext import commands #導入 commands 雖然目前不會用到
import os
intents = discord.Intents.default()
intents.members = True
bot = commands.Bot(command_prefix='>', intents = intents)
#透過bot與dicord連結,並設定command的前綴
@bot.event #調用 event 函式庫
async def on_ready(): #當機器人完成啟動時
print('目前登入身份:', bot.user)
try:
bot.run('機器人TOKEN') #TOKEN 在剛剛 Discord Developer 那邊「BOT」頁面裡
except:
os.system("kill 1") #修正程式錯誤
訊息偵測與回答
讓機器人說話
@bot.event
async def on_message(msg): #當偵測到訊息
if msg.author == bot.user: #避免無限循環
return
if msg.content.startswith("say"): #偵測msg的開頭
tmp = msg.content.split(" ", 1) #將msg切開
if len(tmp)==1: #如果長度只有1,代表後面沒東西
await msg.channel.send("Pardon me?")
else:
await msg.channel.send(tmp[1])
當機器人被mention
import asyncio
@bot.event
async def on_message(message):
if bot.user.mentioned_in(message): #當Bot被提及
delmsg = await message.channel.send(message.author.mention+"tag尛")
#將訊息存入delmsg方便之後刪除
await asyncio.sleep(3) #停止3秒
await delmsg.delete() #刪除訊息
await message.channel.send(message.author.name+"對不起我不該這麼兇\n")
成員加入與離開
有沒有看過這個畫面?
沒錯我們被資訊社入侵ㄌ
使用機器人來打招呼
@bot.event
async def on_member_join(member): #當有成員加入
print(f'{member}join!')
joinchannel = bot.get_channel("channel ID") #獲得特定頻道ID
await joinchannel.send(member.mention+' 歡迎加入!') #在特定頻道發言
@bot.event
async def on_member_remove(member): #當有成員離開
print(f'{member}leave~')
leavechannel=bot.get_channel("channel ID")
await leavechannel.send(member.mention+'再見!')
或是驅逐他們
當然也可以弄得炫一點
Discord Bot還能做什麼?
還可以結合
- 爬蟲
- 後端處理
- 遊戲設計
然後做出一隻強大但沒什麼用的機器人
e.g.
import requests
from bs4 import BeautifulSoup
@bot.event
async def on_ready():
channel = bot.get_channel(***********)
url = "**********"
html = requests.get(url)
soup = BeautifulSoup(html.text, "html.parser")
results = soup.find_all("img", class_="post-item-img", limit=5)
image_links = list(result["src"] for result in results)
for link in image_links:
await erochannel.send(link)
await asyncio.sleep(24*60*60)
結合昨天教的爬蟲
THE END
慘
Discord Bot
By times1-chang
Discord Bot
- 172