- 原文地址:How to write a Discord bot in Python
- 原文做者:Junpei Shimotsu
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:Starrier
- 校對者:mrcangye、IllllllIIl
在本教程中,您將學習如何使用 Python 建立一個簡單的 Discord 機器人。 也許您還不知道什麼是 Discord,本質上它是一項針對遊戲玩家的一種類 Slack(一個雲協做團隊工具和服務)的服務。前端
在 Discord 上,您能夠鏈接多個服務器,您必定也注意到這些服務器有許多機器人。 這些機器人能夠作不少事情,從爲您播放音樂到簡單的聊天。 我被這些機器人深深吸引,所以決定用 Python 寫一個屬於本身的機器人。 那麼讓咱們馬上開始吧!python
咱們首先要建立一個機器人帳號。 轉到 discordapp.com/developers/… 而後建立一個新的 app。 給您的機器人起一個好聽的名字,並給它配上一張我的資料圖片。android
向下滾動並點擊"Create Bot User"。 完成後您將獲得一個機器人的私密 token。ios
您也能夠點擊以顯示機器人的 toke。git
永遠不要和任何人分享您的 token,由於他們可能會以此來挾持您的機器人。 在寫完這篇文章後,我會更換 token。github
如今,開始享受吧。後端
如今咱們要安裝 discord.py 庫的重寫版本。 pip 上的 discord.py 沒有獲得積極維護,所以請安裝庫的重寫版本。bash
$ python3 -m pip install -U https://github.com/Rapptz/discord.py/archive/rewrite.zip
複製代碼
檢查您正在使用的 discord.py 版本,服務器
>>> import discord
>>> discord.__version__
'1.0.0a'
複製代碼
一切已經準備就緒,讓咱們開始寫機器人吧。app
import discord
from discord.ext import commands
複製代碼
若是它報 ModuleNotFoundError
或者 ImportError
那麼您的 discord.py 安裝有問題。
bot = commands.Bot(command_prefix='$', description='A bot that greets the user back.')
複製代碼
命令前綴是消息內容最初調用命令所必須包含的內容。
@bot.event
async def on_ready():
print('Logged in as')
print(bot.user.name)
print(bot.user.id)
print('------')
複製代碼
當客戶端準備好從 Discord 中接收數據時,就會調用 on_ready()
。 一般是在機器人成功登陸後。
如今讓咱們爲機器人添加一些功能。
@bot.command()
async def add(ctx, a: int, b: int):
await ctx.send(a+b)
@bot.command()
async def multiply(ctx, a: int, b: int):
await ctx.send(a*b)
@bot.command()
async def greet(ctx):
await ctx.send(":smiley: :wave: Hello, there!")
@bot.cmmands()
async def cat(ctx):
await ctx.send("https://media.giphy.com/media/JIX9t2j0ZTN9S/giphy.gif")
複製代碼
在運行它以前,必須將您的機器人添加到您的服務器。 這個 OAuth2 url 能夠從您的機器人 settings 頁面生成。 轉到 https://discordapp.com/developers,點擊您的機器人配置文件並生成 oAuth2 url。
這是您決定給機器人授予什麼權限的地方。 對於咱們如今的使用狀況,咱們只須要賦予發送消息的權限便可。
如今,讓咱們在命令行中運行如下命令來啓動機器人。
$ python bot.py
複製代碼
如今咱們開始測試機器人。
在建立一個 Discord 機器人時,應該遵循一系列優秀的實踐。 我建議您在這裏 github.com/meew0/disco… 閱讀整個文檔。
有個信息命令。 它應該提供關於機器人的信息,好比它使用的框架,框架用的是哪一個版本以及幫助命令,最重要的一點是,它的開發者是誰。
@bot.command()
async def info(ctx):
embed = discord.Embed(title="nice bot", description="Nicest bot there is ever.", color=0xeee657)
# 在這裏提供關於您的信息
embed.add_field(name="Author", value="<YOUR-USERNAME>")
# 顯示機器人所服務的數量。
embed.add_field(name="Server count", value=f"{len(bot.guilds)}")
# 給用戶提供一個連接來請求機器人接入他們的服務器
embed.add_field(name="Invite", value="[Invite link](<insert your OAuth invitation link here>)")
await ctx.send(embed=embed)
複製代碼
discord.py 會自動生成一個 help
命令。 因此要自定義時,咱們首先要刪除默認提供的。
bot.remove_command('help')
複製代碼
如今咱們能夠編寫自定義的 help
命令了。請在這裏描述您的機器人。
@bot.command()
async def help(ctx):
embed = discord.Embed(title="nice bot", description="A Very Nice bot. List of commands are:", color=0xeee657)
embed.add_field(name="$add X Y", value="Gives the addition of **X** and **Y**", inline=False)
embed.add_field(name="$multiply X Y", value="Gives the multiplication of **X** and **Y**", inline=False)
embed.add_field(name="$greet", value="Gives a nice greet message", inline=False)
embed.add_field(name="$cat", value="Gives a cute cat gif to lighten up the mood.", inline=False)
embed.add_field(name="$info", value="Gives a little info about the bot", inline=False)
embed.add_field(name="$help", value="Gives this message", inline=False)
await ctx.send(embed=embed)
複製代碼
恭喜!您剛剛用 Python 建立了一個 Discord 機器人。
目前,機器人只會在您運行腳本以前在線運行。 所以,若是您但願您的機器人一直運行,您必須在線託管它,或者您也能夠在本地託管它。好比在樹莓派(RaspberryPi)。 託管服務範圍很廣,從免費的(Heroku's free tier)到付費的(Digital Ocean)。 我在 Heroku's free tier 上運行個人機器人,到目前爲止尚未遇到任何問題。
import discord
from discord.ext import commands
bot = commands.Bot(command_prefix='$')
@bot.event
async def on_ready():
print('Logged in as')
print(bot.user.name)
print(bot.user.id)
print('------')
@bot.command()
async def add(ctx, a: int, b: int):
await ctx.send(a+b)
@bot.command()
async def multiply(ctx, a: int, b: int):
await ctx.send(a*b)
@bot.command()
async def greet(ctx):
await ctx.send(":smiley: :wave: Hello, there!")
@bot.command()
async def cat(ctx):
await ctx.send("https://media.giphy.com/media/JIX9t2j0ZTN9S/giphy.gif")
@bot.command()
async def info(ctx):
embed = discord.Embed(title="nice bot", description="Nicest bot there is ever.", color=0xeee657)
# give info about you here
embed.add_field(name="Author", value="<YOUR-USERNAME>")
# Shows the number of servers the bot is member of.
embed.add_field(name="Server count", value=f"{len(bot.guilds)}")
# give users a link to invite thsi bot to their server
embed.add_field(name="Invite", value="[Invite link](<insert your OAuth invitation link here>)")
await ctx.send(embed=embed)
bot.remove_command('help')
@bot.command()
async def help(ctx):
embed = discord.Embed(title="nice bot", description="A Very Nice bot. List of commands are:", color=0xeee657)
embed.add_field(name="$add X Y", value="Gives the addition of **X** and **Y**", inline=False)
embed.add_field(name="$multiply X Y", value="Gives the multiplication of **X** and **Y**", inline=False)
embed.add_field(name="$greet", value="Gives a nice greet message", inline=False)
embed.add_field(name="$cat", value="Gives a cute cat gif to lighten up the mood.", inline=False)
embed.add_field(name="$info", value="Gives a little info about the bot", inline=False)
embed.add_field(name="$help", value="Gives this message", inline=False)
await ctx.send(embed=embed)
bot.run('NDE0MzIyMDQ1MzA0OTYzMDcy.DWl2qw.nTxSDf9wIcf42te4uSCMuk2VDa0')
複製代碼
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。