在 Python 中创建 Discord 机器人
在本教程中,我们将使用 Python 开发我们自己的 Discord 机器人。 这个机器人的源代码将存储在我的github 存储库 关于机器人 首先,我们将创建一个基本的不和谐机器人来迎接消息发送者,然后我们将创建一个 Minecraft 机器人,这将使我们能够执行以下操作: :: Bot Usage :: !mc help : shows help !mc serverusage : shows
在本教程中,我们将使用 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.
进入全屏模式 退出全屏模式
当我们输入hello
和goodbye
时,您可以看到我们的机器人对这些值做出响应:
[](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 服务器,目前并没有发生太多事情,但计划分享和分发技术内容以及一个供志同道合的人闲逛的地方。如果您对此感兴趣,请随时加入 此链接
更多推荐
所有评论(0)