【问题标题】:get the name of a channel using discord.py使用 discord.py 获取频道名称
【发布时间】:2019-03-25 18:13:45
【问题描述】:

我如何获得频道的名称,以便此机器人可以在其放置的任何服务器上工作,而无需更改代码? (在我放“我在这里放什么”的代码中,我希望名称出现在变量中)谢谢

from discord.ext.commands import Bot
import time, asyncio

TOKEN = 'Its a secret'
BOT_PREFIX = ["!"]
client = Bot(command_prefix=BOT_PREFIX)




@client.event
async def on_message(message):
    if message.author == client.user:
        return




@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')
    await start()
    while True:
        currentTime = time.strftime("%M%S", time.gmtime(time.time()))
        if currentTime == "30:00":
            await start()
        await asyncio.sleep(1)


async def start():
    mainChannel = #What do i put here?
    print(mainChannel.name)
    await client.send_message(mainChannel, "Starting countdown", tts = True)



client.run(TOKEN)

【问题讨论】:

  • 当您只知道它的名称时,您是否正在尝试获取 Channel 对象?您如何选择要发送消息的服务器?你有这个频道的ID吗?
  • 我想把它发送到机器人所在的所有服务器的主频道,所以我没有任何 id。理想情况下,它会寻找名称为“一般”或“主频道”的频道

标签: python discord discord.py


【解决方案1】:

从 ID 获取频道(推荐)

首先,获取频道的ID (右键点击频道,选择“复制ID”)

其次,将ID放入以下代码:

client.get_channel("ID")

例如:

client.get_channel("182583972662")

注意:频道ID在discord.py async中为字符串,在rewrite中为整数

(感谢 Ari24 指出这一点)

从名称中获取频道(不推荐)

首先,使用以下任一方式获取服务器:

server = client.get_server("ID")

for server in client.servers:
    if server.name == "Server name":
        break

二、获取频道:

for channel in server.channels:
    if channel.name == "Channel name":
        break

什么不能做

尝试始终使用每个服务器的 ID,因为它更快、更高效。

尽量避免使用discord.utils.get,如:

discord.utils.get(guild.text_channels, name="Channel name")

虽然它确实有效,但这是一种不好的做法,因为它必须遍历整个频道列表。与使用 ID 相比,这可能会很慢并且需要更多时间。

来自 discord API 文档:

discord.utils.get 是一个帮助器,它返回第一个元素 满足 attrs 中传递的所有特征的迭代

【讨论】:

  • 您还应该包括,只有在 discord.py async 中,频道 ID 是一个字符串,而在重写时它是一个整数
  • @Ari24 感谢您指出这一点,我已将其添加到答案中
【解决方案2】:

现在重写有一个名为 discord.utils.get 的方法,您可以在其中实际获取具有特定参数的不和谐对象

在您的情况下使用频道名称:

import discord
channel = discord.utils.get(guild.text_channels, name="Name of channel")

如果 discord 找不到具有该名称的文本频道,则应为 None

【讨论】:

  • guild 分配给什么
  • @alper 这取决于你在哪里使用它
【解决方案3】:

其实很简单: 你可以简单地做message.channel.name

例子:

print(message.channel.name)

【讨论】:

    【解决方案4】:

    print(message.channel.name) 仅在您收到消息时才有效,但我想发送一个而不需要先接收一个。

    【讨论】:

    • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
    【解决方案5】:

    嗯,这很简单。但是,您的代码可以通过多种方式进行改进。阅读您的代码会更容易。

    要获取频道并向其发送消息,请使用此

    ch = client.get_channel(channel id)
    await ch.send("message")
    

    对您的代码的一些优化

    from discord.ext import commands
    import discord
    import time
    
    TOKEN = "token"
    client = commands.Client(command_prefix="!")
    
    @client.event
    async def on_ready():
        print(f"Logged in as {client.user}")
        print(f"ID: {client.id}")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-05
      • 2022-01-16
      • 2020-11-28
      • 2022-07-16
      • 1970-01-01
      • 2019-01-13
      • 2021-03-13
      相关资源
      最近更新 更多