[譯] 如何用 Python 寫一個 Discord 機器人

你的可嚶已上線發表於2018-04-02

如何用 Python 寫一個 Discord 機器人

在本教程中,您將學習如何使用 Python 建立一個簡單的 Discord 機器人。 也許您還不知道什麼是 Discord,本質上它是一項針對遊戲玩家的一種類 Slack(一個雲協作團隊工具和服務)的服務。

在 Discord 上,您可以連線多個伺服器,您一定也注意到這些伺服器有許多機器人。 這些機器人可以做很多事情,從為您播放音樂到簡單的聊天。 我被這些機器人深深吸引,因此決定用 Python 寫一個屬於自己的機器人。 那麼讓我們立刻開始吧!

設定

我們首先要建立一個機器人賬號。 轉到 discordapp.com/developers/… 然後建立一個新的 app。 給您的機器人起一個好聽的名字,並給它配上一張個人資料圖片。

[譯] 如何用 Python 寫一個 Discord 機器人

向下滾動並點選"Create Bot User"。 完成後您將得到一個機器人的私密 token。

[譯] 如何用 Python 寫一個 Discord 機器人

您也可以點選以顯示機器人的 toke。

[譯] 如何用 Python 寫一個 Discord 機器人

永遠不要和任何人分享您的 token,因為他們可能會以此來挾持您的機器人。 在寫完這篇文章後,我會更換 token。

程式碼

現在,開始享受吧。

準備環境

Discord.py (重寫)

現在我們要安裝 discord.py 庫的重寫版本。 pip 上的 discord.py 沒有得到積極維護,因此請安裝庫的重寫版本。

$ python3 -m pip install -U https://github.com/Rapptz/discord.py/archive/rewrite.zip
複製程式碼

檢查您正在使用的 discord.py 版本,

>>> import discord
>>> discord.__version__
'1.0.0a'
複製程式碼

一切已經準備就緒,讓我們開始寫機器人吧。

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 寫一個 Discord 機器人

這是您決定給機器人授予什麼許可權的地方。 對於我們現在的使用情況,我們只需要賦予傳送訊息的許可權即可。

現在,讓我們在命令列中執行以下命令來啟動機器人。

$ python bot.py
複製程式碼

[譯] 如何用 Python 寫一個 Discord 機器人

現在我們開始測試機器人。

[譯] 如何用 Python 寫一個 Discord 機器人

[譯] 如何用 Python 寫一個 Discord 機器人

在建立一個 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)
複製程式碼

[譯] 如何用 Python 寫一個 Discord 機器人

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 機器人

恭喜!您剛剛用 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')
複製程式碼

掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章