如何在没有命令的情况下使用 discord.py 发送消息

新手上路,请多包涵
import discord
import asyncio

client = discord.Client()
@client.event
async def on_ready():
    print("I'm ready.")

async def send(message):
    await client.send_message(client.get_channel("123456789"), message)

client.run("token")

loop = asyncio.get_event_loop()
loop.run_until_complete(send("hello"))

你好,我想做一个GUI。当有人输入他的名字并按“确定”时,我的不和谐机器人应该会发送一条消息。基本上我以为我用它的名字来称呼异步,但没有用。然后我做了一个事件循环。使用 print(),但机器人不发送消息,所以我认为它还没有准备好,当我把 wait_until_ready() 放在那里时它什么也没执行,所以我想我必须把 client.run(“token “) 在事件循环之前,也没有用。

你们能帮帮我吗? :)

原文由 mauexe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

您的代码不工作的原因是因为 client.run 正在阻塞,这意味着它之后什么都不会执行。这意味着您的 loop 将永远无法访问。

要解决此问题,请使用 client.loop.create_task

discord.py 的 github 有一个后台任务的例子,可以 在这里 找到。您应该可以将其用作参考。目前,该任务每分钟向给定频道发送一条消息,但您可以轻松修改它以等待特定操作。

discord.py 版本

import discord
import asyncio

client = discord.Client()

async def my_background_task():
    await client.wait_until_ready()
    counter = 0
    channel = client.get_channel(id=123456789) # replace with channel_id
    while not client.is_closed():
        counter += 1
        await channel.send(counter)
        await asyncio.sleep(60) # task runs every 60 seconds

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

client.loop.create_task(my_background_task())
client.run('token')

较旧 discord.py 版本

import discord
import asyncio

client = discord.Client()

async def my_background_task():
    await client.wait_until_ready()
    counter = 0
    channel = discord.Object(id='channel_id_here')
    while not client.is_closed:
        counter += 1
        await client.send_message(channel, counter)
        await asyncio.sleep(60) # task runs every 60 seconds

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

client.loop.create_task(my_background_task())
client.run('token')

原文由 Benjin 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于响应式行为,您有两个选择:您可以编写 on_message 事件处理程序,或使用 discord.ext.commands 模块。我建议使用 commands ,因为它更强大并且不会将所有内容都放在一个协程中。

 from discord.ext.commands import Bot

bot = Bot(command_prefix='!')

@bot.event
async def on_ready():
    print("I'm ready.")
    global target_channel
    target_channel = bot.get_channel("412678093006831617")

@bot.command()
async def send(*, message):
    global target_channel
    await bot.send_message(channel, message)

这将被称为 !send Some message*, message 语法只是告诉机器人不要尝试进一步解析消息内容。

原文由 Patrick Haugh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题