lecturer: 乘一
~基本介紹與實作
其實就是Discord上的robot
為什麼需要Discord Bot?
有沒有想要每天一份問候?
有沒有想要在Discord裡聽音樂?
有沒有想要在Discord中玩RPG?
那麼 Discord Bot
將會成為你的好選擇!!!
主要還是因為它很好玩
我絕對沒有在推銷
各種Bot
音樂機器人
管理機器人
抓寶機器人
當然還有番號查詢機器人
為什麼要自己寫一個Bot?
都有那麼多強大的Bot了,幹嘛自己寫一個?
因為可以客製化自己的需求
e.g.
針對自己討厭的用戶
在別人裝弱的時候膜拜他
幫自己刷存在感
讓別人覺得你很厲害
本次使用之開發環境
創建一個機器人
然後就開始製作拉~~~
把機器人加進你的伺服器
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+'再見!')
或是驅逐他們
當然也可以弄得炫一點
然後做出一隻強大但沒什麼用的機器人
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)
結合昨天教的爬蟲
慘