当前位置: 首页 > 知识库问答 >
问题:

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

濮冠宇
2023-03-14

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

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

如果我的bot被添加到另一台服务器上,我的服务器的通道id显然无法工作,那么有没有办法从它所在的服务器上自动获取常规通道id?或者是否有其他方法为不同的服务器创建通道ID列表?

共有1个答案

丁灿
2023-03-14

您可以使用on_guild_join事件获取该公会及其所有频道,也可以按id或名称查找公会,然后按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)

不和谐。乌提尔斯。查找文档

 类似资料:
  • 我想让我的机器人只读取DM消息,并将其发送到不和谐的渠道,但我的代码垃圾邮件消息无限,垃圾邮件5次,然后它暂停几秒钟,然后再次垃圾邮件,机器人也不只读取DM消息,并读取公会消息,所以如果我在公会里发送任何东西,它会发送垃圾邮件。 我到底想要什么?如果有人发送“你好!”(消息内容)到DM中的bot,bot需要发送'Hello!'(消息内容)到指定的频道(日志频道)。

  • 每次机器人被邀请到服务器时,我都想发送一条消息。然后它应该写这样的话:“你好,这是我的不和机器人” 到目前为止,我有这个代码,它不会产生错误,但也不会发送消息。

  • 我目前正在制作一个discord bot,并希望在服务器加入时在服务器的通道中发送一条消息,这是我到目前为止的代码。 当我运行这段代码时,什么都不会发生。我没有得到任何ERORR或输出。 如果有人能帮忙,那就太棒了。谢谢

  • 我有一个关于不和的问题。皮耶。我运行我的bot所在的两个独立服务器:测试服务器和主服务器。问题是,当我在测试服务器中发送消息时,bot会将其消息发送到主服务器,而不会将其发送回调用命令的服务器(仅在函数中)。 例如: 如果我在测试服务器中键入上述内容,我的bot将以“你好!”在测试服务器中。但是,如果我尝试将此代码放入函数并调用它: 通道ID显然设置为特定服务器。因此,假设我将ID“1234”作为

  • 我在写一个简单的信息管理程序的代码。我在Java swing GUI中遇到了麻烦。在这段代码中,我计划在Northpanel_center中使用JTextField字符串,以便在NorthPanel_East中使用。但我不能用它。 要补充的是,类似这样的搜索方法。

  • 我在discord.py做了一个机器人,希望我的机器人在网络钩子在特定频道发送消息时定位一个角色。有办法这么做吗?现在所有我有的是通道ID和我很确定这是一个客户端事件