如何创建一个Discord Bot,它可以接受Python的参数,将什么消息发送给谁,并能够关闭自身?

如何创建一个Discord Bot,它可以接受Python的参数,将什么消息发送给谁,并能够关闭自身?,python,discord,discord.py,Python,Discord,Discord.py,我想做一些很简单的事情。我只是希望Python能够调用一个快速函数,通过Discord发送直接消息。基本上是一个修改版本的。我希望另一个Python类启动Discord客户端并传递消息字符串和用户id。我希望Discord客户端只发送字符串,然后关闭并删除整个类。查看文档后,我做了以下修改: import discord class MyClient(discord.Client): async def on_ready(self): print('Logged on a

我想做一些很简单的事情。我只是希望Python能够调用一个快速函数,通过Discord发送直接消息。基本上是一个修改版本的。我希望另一个Python类启动Discord客户端并传递消息字符串和用户id。我希望Discord客户端只发送字符串,然后关闭并删除整个类。查看文档后,我做了以下修改:

import discord
class MyClient(discord.Client):
    async def on_ready(self):
        print('Logged on as {0}!'.format(self.user))
        user = await self.fetch_user(self.destination_user)
        await user.send(self.message)
        await self.close()
    def __init__(self, user_id, user_message):
        self.destination_user = user_id
        self.message = user_message

client = MyClient(desired_id, desired_message)
client.run('My Client ID')
#wait for client to end and then continue
然而,我遇到了两个问题。这看起来有点不协调。客户端不允许使用
\uuuu init\uuu()
函数,当我尝试执行async def
\uuuu init\uuu()
时,也出现了一个错误。是否有其他方法通过Python向其传递参数,而不是对不一致的消息作出反应?另外,
self.close()
会导致
“RuntimeError:无法关闭正在运行的事件循环”
。等待\u ready()上的
完成然后关闭它的正确方法是什么


我可以通过硬编码用户ID和消息,消除
\uuuu init\uuuu()
并简单地不关闭类来实现它。但是,由于某种原因,即使是
self.get\u user()
也不起作用,只有
self.fetch\u user()
。文档中说要使用
get\u user()
,所以我更喜欢这样,但我不知道我做错了什么。我的bot与目标用户在同一台服务器上,我给了它两个特权意图,但是
get\u user()
继续返回“None”,而
fetch\u user()
正确地向用户发送消息,并使用相同的参数。

我找到了运行
discord的正确方法。客户端以这种方式:

import discord
import nest_asyncio
import asyncio
nest_asyncio.apply()

class DiscordClient(discord.Client):
    async def on_ready(self):
        user = await self.fetch_user(self.send_user)
        await user.send(self.message)

    async def on_message(self, message):
        #Pause so there's no warning about operations not finishing when class closes
        await asyncio.sleep(0.1)
        await DiscordClient.close(self)
        
    async def parameters(self, user, message):
        self.send_user = user
        self.message = message

async def send_discord(user, message):
    print("Sending Discord message")
    client = DiscordClient()
    await client.parameters(user, message)
    await client.start('Private Key')
    print("Discord message sent")

asyncio.run(send_discord(user_id, "Test message contents"))

即使是发送消息的bot也会运行
on_message
,因此它会快速关闭自身。我不得不添加等待,或者在每次关闭时都有一些竞争条件或导致警告的东西。

“只希望Python能够调用通过Discord发送直接消息的快速函数”在这种情况下,您的
MyClient
类应该有(或继承)一个执行此操作的方法,在客户端类构造上发送消息是没有意义的。@ChristianH,因此我应该添加一个通过Python调用的自定义函数来发送消息。但是,在docs或Github示例中没有显示如何调用实现
discord.Client
的类的自定义函数的案例。一旦我调用
client.run()
,这行代码就会阻塞,我不知道还能做什么。据我所知,客户端对象可以/应该有一个发送消息的方法。实现一个类需要一个接口,我不认为是这样,我认为您是在扩展/重写一个类。我从未使用过python discord模块,我很快检查了代码,发送私人消息的方法是
send_private_message
,您可以在这里找到它:。
fetch\u user
方法中还有一个注释,您可以检查。据我所知,由于您希望创建自己的类,我将使用其中的discord.client实例来创建自己的客户端。