添加到其他人服务器的 Discord Bot 如何获取他们希望它发送消息的通道 ID?

Posted

技术标签:

【中文标题】添加到其他人服务器的 Discord Bot 如何获取他们希望它发送消息的通道 ID?【英文标题】:How does a Discord Bot that is added to someone else's server get the channel id of where they want it to send messages? 【发布时间】:2021-10-05 15:37:35 【问题描述】:

我目前有一个不和谐的机器人,可以在我自己的私人服务器上运行良好。我希望机器人能够加入其他人的服务器,如果他们选择添加它们,但我的机器人的一部分是它会每隔一段时间自动向特定频道发送消息。为此,我使用了我在服务器上使用的频道的频道 ID:

async def esportsdiscussions():
    await client.wait_until_ready()
    channel = client.get_channel([Channel Id])
    await channel.send('Hi!')

如果我的机器人被添加到另一台服务器,我的服务器的频道 ID 显然无法工作,那么有没有办法从它所在的服务器自动获取通用频道 ID?还是有其他方法可以为不同的服务器创建频道 ID 列表?

【问题讨论】:

【参考方案1】:

您可以使用on_guild_join 事件获取公会及其所有频道 或者也可以通过 id 或 name 找到公会,然后通过 id 或 name 找到频道

但是,如果您想保留频道 ID,即使在重新启动后,您也需要将它们保存到数据库或类似的东西中 您可以使用 MongoDB(就像我一样),或者如果它只是一个较小的项目 JSON、SQLite 或者只是一个 .txt 文件也可以使用

我将使用 python dict 作为示例,它与 JSON 或 MongoDB 输出非常相似

database =       # if this is in a .json file, only use everyting 
    "guilds": [   # behind "database = ", starting with the first  and the last 
        
            "guild_id": 1111,     # you can already set this to your guild 
            "channel_id": 1112    # and channel id
        
    ]



@bot.event
async def on_guild_join(guild):
    """
        You can try to find a channel with a specific name here and use this,
        but maybe the name does not exists, so i don't recommend this
    """
    # for example
    for channel in guild.text_channels:  
        if channel.name == "something":
            ...


@bot.command()
async def set_channel(ctx, channel: discord.TextChannel):
    """You can use a command so server admins kann set the channel by themself"""

    current_guild_ids = [guild["guild_id"] for guild in database["guild"]]
    if ctx.guild.id in current_guild_ids:  # check if the guild already exists in the db
        await ctx.send("You already set a channel")
    else:  # add the guild and channel to the db
        new_guild_data = "guild_id": ctx.guild.id, "channel_id": channel.id
        database["guilds"].append(new_guild_data)
        await ctx.send("Channel was added")


# and if you want to get the guild without a event or command you can do this:

async def some_function():
    guild_data = database["guilds"][0]  # the first guild in the db for example
    # prints: "guild_id": 1111, "channel_id": 1112
    guild = bot.get_guild(guild_data["guild_id"])
    channel = bot.get_channel(guild_data["channel_id"])
    # then you can send messages to it
    await channel.send("Hi!")


    # or find the by name with discord.utils.find()
    guild = discord.utils.find(lambda g: g.name == 'GuildName', client.guilds)
    channel = discord.utils.find(lambda c: c.name == 'ChannelName', guild.channels)

discord.utils.find 文档

【讨论】:

非常感谢您的回复!我真的很感激所有的东西都做得很好而且很详细!我将从这些东西中尝试一些东西,看看我想如何设置它,但我主要考虑使用命令来设置频道 ID。如果您要选择一种方式来实现这一点,您认为您会使用哪一种?【参考方案2】:

假设你的机器人加入的每台服务器都有#general,最简单的方法是使用discord.utils'get 函数。它将遍历公会的频道,如果找到#general 频道,则返回一个频道对象。

channel = discord.utils.get(ctx.guild.channels, name="general")

类似的其他问题:

Is it possible to get channel ID by name in discord.py get the name of a channel using discord.py Send a message when the bot joins a server(有点旧,需要调整)

有时,服务器可能会将它们的一般标记为#╚general#general? 等,这将能够绕过上述代码。在这种情况下,您可以使用这种稍长的方法。

for channel in ctx.guild.channels: # for every channel in this guild,
    if "general" in channel.name.lower() # if the word 'general' is in this channel's name (lowercase)
        channel = channel # the channel variable is now this channel
        break # stop the loop

总的来说,唯一的主要问题是如果公会没有任何类型的#general,例如更改字体或没有开始的频道。

【讨论】:

【参考方案3】:
for channel in ctx.guild.channels:
    print(channel.id)

此代码将列出该服务器中的所有频道。 如果你想要这个名字,请使用channel.name

或者您可以使用bot.get_all_channels(),它将返回列表中的所有频道

【讨论】:

这不是需要在命令函数中使用才能让 ctx.guilds 工作吗?有没有其他方法可以在不调用函数的情况下获取它? 如果您使用bot = discord.commands.Bot(),您可以在任何地方访问bot.get_all_channels()

以上是关于添加到其他人服务器的 Discord Bot 如何获取他们希望它发送消息的通道 ID?的主要内容,如果未能解决你的问题,请参考以下文章

Python Discord Bot:如何与用户交互?

如何向 discord.js bot v12 添加验证

检测何时在服务器上授权 Discord bot

Bot 未检测到服务器成员 (Discord.py)

最近我建立了discord bot,主要问题是,我不知道如何设置权限,所以我服务器的每个成员都可以踢和禁止其他人

如何在discord bot上删除所有角色并添加一个角色,然后删除添加的角色并恢复以前的角色