如何创建一个Discord Bot,它可以接受Python的参数,将什么消息发送给谁,并能够关闭自身?
我想做一些很简单的事情。我只是希望Python能够调用一个快速函数,通过Discord发送直接消息。基本上是一个修改版本的。我希望另一个Python类启动Discord客户端并传递消息字符串和用户id。我希望Discord客户端只发送字符串,然后关闭并删除整个类。查看文档后,我做了以下修改:如何创建一个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
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实例来创建自己的客户端。