在本教程中,我们将使用 Python 开发我们自己的 Discord 机器人。

这个机器人的源代码将存储在我的github 存储库

关于机器人

首先,我们将创建一个基本的不和谐机器人来迎接消息发送者,然后我们将创建一个 Minecraft 机器人,这将使我们能够执行以下操作:

:: Bot Usage ::
!mc help : shows help
!mc serverusage : shows system load in percentage
!mc serverstatus : shows if the server is online or offline
!mc whoisonline : shows who is online at the moment

进入全屏模式 退出全屏模式

让我们开始吧。

依赖项

创建python虚拟环境并安装依赖包:

$ python3 -m virtualenv .venv
$ source .venv/bin/activate
$ pip install discord
$ pip install python-dotenv

进入全屏模式 退出全屏模式

创建 Discord 应用程序

我们首先需要在 discord 上创建应用程序并检索我们的 python 应用程序需要的令牌。

在 discord 上创建应用程序:

  • https://discordapp.com/developers/applications

你应该看到:

单击“新建应用程序”并为其命名:

查看我们的最新产品 - 终极的 tailwindcss 页面创建者🚀

创建应用程序后,您将获得一个屏幕来上传徽标,提供描述,最重要的是获取您的应用程序 ID 以及您的公钥:

[图像](https://res.cloudinary.com/practicaldev/image/fetch/s--KOcEBylG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/567298/165911250-0fd11a0b-b851-4d65-a898-7049dd73aa60.png)

然后选择 Bot 部分:

然后选择“添加机器人”:

选择 OAuth2 并选择“bot”范围:

在页面底部,它将为您提供一个类似于以下内容的 URL:

https://discord.com/api/oauth2/authorize?client_id=xxxxxxxxxxx&permissions=0&scope=bot

进入全屏模式 退出全屏模式

将链接粘贴到浏览器中,并将机器人授权给您选择的服务器:

[图像](https://res.cloudinary.com/practicaldev/image/fetch/s--430vJay2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/567298/165917380-6e8fbbed-9237-4017-a8bd-c27d58bcdc6d.png)

然后单击授权,您应该会看到您的机器人出现在 Discord 上:

[图像](https://res.cloudinary.com/practicaldev/image/fetch/s--AlYERVgN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/567298/165917760-d8c132e9-18d4-4428-b551-c895d4a5102c.png)

开发 Discord 机器人

现在我们将构建我们的 python discord bot,返回“Bot”部分并选择“Reset Token”,然后将令牌值复制并存储到文件.env:

DISCORD_TOKEN=xxxxxxxxx

进入全屏模式 退出全屏模式

所以在我们当前的工作目录中,我们应该有一个文件.env,其内容如下:

$ cat .env
DISCORD_TOKEN=your-unique-token-value-will-be-here

进入全屏模式 退出全屏模式

对于这个演示,我将在 discord 中创建一个名为minecraft-test的私人频道,并将 botMinecraftBot添加到该频道(这仅用于测试,测试后您可以将您的 bot 添加到其他频道供其他人使用):

[图像](https://res.cloudinary.com/practicaldev/image/fetch/s--_XCbSRPy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/567298/166233812-2596960b-5142-4ad1-809e-96d884ea5c58.png)

对于我们的第一个测试,一个基本的机器人,我们想输入hello,机器人应该用我们的用户名迎接我们,在我们的mc_discord_bot.py文件中,我们将拥有:

import discord
import os
from dotenv import load_dotenv

BOT_NAME = "MinecraftBot"

load_dotenv()
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")

bot = discord.Client()

@bot.event
async def on_ready():
    print(f'{bot.user} has logged in.')

@bot.event
async def on_message(message):
    if message.author == bot.user:
        return
    if message.content == 'hello':
        await message.channel.send(f'Hey {message.author}')
    if message.content == 'goodbye':
        await message.channel.send(f'Goodbye {message.author}')

bot.run(DISCORD_TOKEN)

进入全屏模式 退出全屏模式

然后运行机器人:

$ python mc_discord_bot.py
MinecraftBot has logged in.

进入全屏模式 退出全屏模式

当我们输入hellogoodbye时,您可以看到我们的机器人对这些值做出响应:

[图像](https://res.cloudinary.com/practicaldev/image/fetch/s--FbQN18BC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/567298/166235388-7240a66c-2be4-4343-8f36-398077c4fcf6.png)

现在我们测试了我们的机器人,我们可以清除mc_discord_bot.py并编写我们的 Minecraft 机器人,这个机器人的要求很简单,但我们想要以下内容:

  • 使用命令!mc来触发我们的机器人和子命令以获得我们想要的东西

  • 可以看到现在谁在我们的服务器上玩我的世界

  • 如果我的世界服务器在线,可以获取状态

  • 能够获得服务器负载百分比(因为机器人在我的世界服务器上运行)

这是我们完整的mc_discord_bot.py:

import discord
from discord.ext import commands
import requests
import os
from dotenv import load_dotenv
import random
import multiprocessing

# Variables
BOT_NAME = "MinecraftBot"
load_dotenv()
DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")

minecraft_server_url = "lightmc.fun" # this is just an example, and you should use your own minecraft server

bot_help_message = """
:: Bot Usage ::
`!mc help` : shows help
`!mc serverusage` : shows system load in percentage
`!mc serverstatus` : shows if the server is online or offline
`!mc whoisonline` : shows who is online at the moment
"""

available_commands = ['help', 'serverusage', 'serverstatus', 'whoisonline']

# Set the bot command prefix
bot = commands.Bot(command_prefix="!")

# Executes when the bot is ready
@bot.event
async def on_ready():
    print(f'{bot.user} succesfully logged in!')

# Executes whenever there is an incoming message event
@bot.event
async def on_message(message):
    print(f'Guild: {message.guild.name}, User: {message.author}, Message: {message.content}')
    if message.author == bot.user:
        return

    if message.content == '!mc':
        await message.channel.send(bot_help_message)

    if 'whosonline' in message.content:
        print(f'{message.author} used {message.content}')
    await bot.process_commands(message)

# Executes when the command mc is used and we trigger specific functions
# when specific arguments are caught in our if statements
@bot.command()
async def mc(ctx, arg):
    if arg == 'help':
        await ctx.send(bot_help_message)

    if arg == 'serverusage':
        cpu_count = multiprocessing.cpu_count()
        one, five, fifteen = os.getloadavg()
        load_percentage = int(five / cpu_count * 100)
        await ctx.send(f'Server load is at {load_percentage}%')

    if arg == 'serverstatus':
        response = requests.get(f'https://api.mcsrvstat.us/2/{minecraft_server_url}').json()
        server_status = response['online']
        if server_status == True:
            server_status = 'online'
        await ctx.send(f'Server is {server_status}')

    if arg == 'whoisonline':
        response = requests.get('https://api.mcsrvstat.us/2/{minecraft_server_url}').json()
        players_status = response['players']
        if players_status['online'] == 0:
            players_online_message = 'No one is online'
        if players_status['online'] == 1:
            players_online_username = players_status['list'][0]
            players_online_message = f'1 player is online: {players_online_username}'
        if players_status['online'] > 1:
            po = players_status['online']
            players_online_usernames = players_status['list']
            joined_usernames = ", ".join(players_online_usernames)
            players_online_message = f'{po} players are online: {joined_usernames}'
        await ctx.send(f'{players_online_message}')

bot.run(DISCORD_TOKEN)

进入全屏模式 退出全屏模式

现在我们可以启动我们的机器人了:

$ python mc_discord_bot.py

进入全屏模式 退出全屏模式

我们可以运行我们的帮助命令:

!mc help

进入全屏模式 退出全屏模式

这将提示我们的帮助信息,然后测试其他信息:

[图像](https://res.cloudinary.com/practicaldev/image/fetch/s--Z34fKdJU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://user-images.githubusercontent .com/567298/166237617-c2df1dd1-99bc-4558-8eb8-b1159e850836.png)

资源

感谢以下作者,他们真的帮助我做到了这一点:

  • www.freecodecamp.org

  • 更好的编程.pub

  • dev.to/codesphere

谢谢

感谢阅读,如果您喜欢我的内容,请查看我的 网站,阅读我的 时事通讯 或在 Twitter 上关注我的 @ruanbekker

该机器人的源代码将存储在我的 github 存储库中:

  • github.com/ruanbekker

我已经启动了一个全新的 Discord 服务器,目前并没有发生太多事情,但计划分享和分发技术内容以及一个供志同道合的人闲逛的地方。如果您对此感兴趣,请随时加入 此链接

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐