创建 Python Discord 机器人 – 如何获取数据进行分析

AI吧Python

从本文中,您将学习如何:

  • 创建一个 Discord 机器人并将其添加到服务器;
  • 从服务器获取完整的频道列表;
  • 获取 Discord 成员及其角色的快照。

如何创建 Discord Bot 帐户

这是用于创建 Discord Bot 帐户的简单 ABC 备忘单。

  1. 确保您已登录Discord网站.
  2. 导航到申请页面.
  3. 单击“新建应用程序”按钮
  4. 命名应用程序并单击“创建”按钮。
  1. 转到“机器人”选项卡,然后单击“添加机器人”。您必须通过单击“是的,执行此操作!”来确认操作。

保存 Public Bot(选中)和 Require OAuth2 Code Grant(未选中)的默认设置。

恭喜!您的机器人已创建。这很容易,不是吗?

下一步是复制令牌。

此令牌是您的机器人的私人密码,因此请不要与任何人共享它,并在必要时使用密码管理器。

您可以重新生成令牌以防意外共享。

  1. 在同一页面上,启用两个复选框并单击“保存更改”按钮。

如何邀请您的机器人加入服务器

现在你必须让你的机器人用户进入服务器。为此,您应该为其创建一个邀请 URL。

转到“OAuth2”选项卡。然后在“范围”部分下选择“机器人”。

现在选择您希望允许机器人执行的操作。我们的机器人将主要使用短信,所以我们不需要很多权限。

选择适当的权限后,单击权限下方的“复制”按钮。这样,您将复制用于将机器人添加到服务器的 URL。

将 URL 粘贴到浏览器中,选择要邀请机器人的服务器,然后单击“继续”。

点击“授权”。你几乎完成了!

要添加机器人,您的帐户需要允许“管理服务器”权限。

Python Bot

现在……我们进入了问题的核心!让我们开始用 Python 创建一个 Bot。

我们的主要目标是从服务器获取数据并进行分析。您可以在此处找到更多选项:https://discord.com/developers/docs/intro

我们需要的所有代码将如下所示。

# Import Libraries
import discord
import asyncio
import pandas as pd
from aiohttp import ClientConnectorError
intents = discord.Intents.all()
client = discord.Client(intents=intents)
token = "YOUR_TOKEN"
   

@client.event
async def on_ready():

    # Code to getting data

    await client.close()

try:
    loop = asyncio.get_event_loop()
    loop.run_until_complete(client.start(token))
except ClientConnectorError:
    print("Discord connection error try again")

让我们一步一步来!

首先,我们将尝试获取完整的频道列表。

@client.event
async def on_ready():

    channels_columns = ['channel_id', 'channel_name', 'server_name', 'server_id']
    list_channels = []
    for guild in client.guilds:
        for channel in guild.text_channels:
            try:
                # two lines to check access to the channel
                channelh = client.get_channel(channel.id)
                # trying to get last 10 messages from a channel
                messages = await channelh.history(limit=10).flatten()

                to_append_ch = [channel.id, channel.name, guild.name, guild.id]
                list_channels.append(to_append_ch)
            except discord.Forbidden:  # 403 Forbidden (error code: 50001): Missing Access
                print(f'channel {channel.name} has no access')
                continue

    df_channels = pd.DataFrame(list_channels, columns=channels_columns)
    print(df_channels)
    await client.close()

我们需要这两行来检查我们是否可以访问通道。如果您的机器人无权访问任何频道,这些行会返回错误“403 Forbidden (error code: 50001): Missing Access”,我们应该打印频道的名称。如果您需要完整的频道列表,只需删除以下行:

channelh = client.get_channel(channel.id)

messages = await channelh.history(limit=10).flatten()

让我们添加代码以获取成员的信息。

@client.event
async def on_ready():

    channels_columns = ['channel_id', 'channel_name', 'server_name', 'server_id']
    memders_columns = ['member_id', 'name', 'discriminator', 'joined_at',
                       'server_name', 'server_id']
    list_channels = []
    list_memders = []
    for guild in client.guilds:
        for channel in guild.text_channels:
            try:
                # two lines to check access to the channel
                channelh = client.get_channel(channel.id)
                # trying to get last 10 messages from a channel
                messages = await channelh.history(limit=10).flatten()

                to_append_ch = [channel.id, channel.name, guild.name, guild.id]
                list_channels.append(to_append_ch)
            except discord.Forbidden:  
                # 403 Forbidden (error code: 50001): Missing Access
                print(f'channel {channel.name} has no access')
                continue

        for member in guild.members:
            if not member.bot:

                to_append_mem = [str(member.id), member.name,
                                 member.discriminator, member.joined_at, 
                                 guild.name, guild.id]
                list_memders.append(to_append_mem)

    df_channels = pd.DataFrame(list_channels, columns=channels_columns)
    print(df_channels)
    df_memders = pd.DataFrame(list_memders, columns=memders_columns)
    print(df_memders)

    await client.close()

对于每个用户,我们得到一个成员拥有的角色列表:

# Import Libraries
import discord
import asyncio
import pandas as pd
from aiohttp import ClientConnectorError
intents = discord.Intents.all()
client = discord.Client(intents=intents)
token = "YOUR_TOKEN"

@client.event
async def on_ready():

    channels_columns = ['channel_id', 'channel_name', 'server_name', 'server_id']
    memders_columns = ['member_id', 'name', 'discriminator', 'joined_at',
                       'server_name', 'server_id']
    roles_columns = ['member_id', 'role_id', 'role_name', 'server_name', 'server_id']
    list_channels = []
    list_memders = []
    list_roles = []
    for guild in client.guilds:
        for channel in guild.text_channels:
            try:
                # two lines to check access to the channel
                channelh = client.get_channel(channel.id)
                # trying to get last 10 messages from a channel
                messages = await channelh.history(limit=10).flatten()

                to_append_ch = [channel.id, channel.name, guild.name, guild.id]
                list_channels.append(to_append_ch)
            except discord.Forbidden:  
                # 403 Forbidden (error code: 50001): Missing Access
                print(f'channel {channel.name} has no access')
                continue

        for member in guild.members:
            if not member.bot:
                to_append_mem = [str(member.id), member.name, 
                                 member.discriminator, member.joined_at, 
                                 guild.name, guild.id]
                list_memders.append(to_append_mem)

                us_member = guild.get_member(member.id)
                for us_role in us_member.roles:
                    to_append_rol = [str(member.id), us_role.id, 
                                     us_role.name, guild.name, guild.id]
                    list_roles.append(to_append_rol)


    df_channels = pd.DataFrame(list_channels, columns=channels_columns)
    print(df_channels)
    df_memders = pd.DataFrame(list_memders, columns=memders_columns)
    print(df_memders)
    df_roles = pd.DataFrame(list_roles, columns=roles_columns)
    print(df_roles)

    await client.close()

try:
    loop = asyncio.get_event_loop()
    loop.run_until_complete(client.start(token))
except ClientConnectorError:
    print("Discord connection error try again")

就是这样了!最困难的部分在我们身后!

并感谢您的关注。

在下一篇文章中,我们将分析如何在每个服务器的频道中获取消息和反应

再见!

creating-a-python-discord-bot-how-to-get-data-for-analysis

发表评论

邮箱地址不会被公开。 必填项已用*标注