Skip to main content
 首页 » 编程设计

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

2025年05月04日14powertoolsteam

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")) 

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

你们能帮帮我吗? :)

请您参考如下方法:

您的代码无法运行的原因是 client.run 处于阻塞状态,这意味着它之后的任何内容都不会执行。这意味着您的 loop 永远不会到达。

要解决这个问题,请使用 client.loop.create_task。

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

新的 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')