我正在尝试制作一个机器人,它监听通道中的消息,并将它们发送到我的私人服务器。我不完全理解编码的东西,所以我依赖于一些网上的资源。
我已经做了一个机器人,它在一个通道中获取新消息,然后将它们带到一个私有通道。我找不到代码所在的GitHub,因为我搬到了另一个操作系统。现在,我需要机器人将日志发送到我的私人服务器,以防我的一些工作人员意外地删除了其中一个日志/多个日志。然后我遇到了类似的问题:如何向不同的服务器Discord Bot发送消息,但我意识到这是JavaScript而不是Python。尽管如此,我还是转到了那个JavaScript并进行了尝试。
这是我从GitHub得到的Python机器人。它创建它所侦听的消息的嵌入,并将它们发送到它指定的通道(#message-log)。还包括作者的头像和姓名
@client.event
async def on_message(message):
guild = message.guild
log_channel = discord.utils.get(guild.channels, name="message-log")
if log_channel is None:
await client.process_commands(message)
return
if not message.author.bot:
embed=discord.Embed(
color=0xffd700,
timestamp=datetime.datetime.utcnow(),
description="in {}:\n{}".format(message.channel.mention, message.content)
)
embed.set_author(name=message.author, icon_url=message.author.avatar_url)
embed.set_footer(text=message.author.id)
if len(message.attachments) > 0:
embed.set_image(url = message.attachments[0].url)
await log_channel.send(embed=embed)
await client.process_commands(message)
然后是JavaScript代码(这不是我的重点,但我决定包含它以备不时之需)。它获取被监听的服务器公会ID和通道。我不知道它是否真的能够发送到我的私人服务器,因为有错误。
client.guilds.get(<guild id>).channels.get(<channel id>).send(<message>)
出于隐私考虑,我也没有包括ID。
我预计JavaScript会像平常一样运行,但它返回了下面的错误。
TypeError: Cannot read property 'channels' of undefined
at Object.<anonymous> (C:\Users\SomethingCube\Desktop\ListenBot\ListenBot.js:12:40)
at Module._compile (internal/modules/cjs/loader.js:776:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:829:12)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
可能是因为我得到的代码(JavaScript)是在2018年制作的,在我发布这篇文章之前很多事情都发生了变化,或者我做错了什么(我猜我放错了ID的前缀和后缀(我不知道那叫什么),(“----------------”))。
再说一遍,这里我的重点不是JavaScript,而是Python。我正在寻找将消息发送到我的私人服务器的代码(用于Python)。
欢迎来到StackOverflow,Cube!我最近编写了一个简单的discord.py bot来做同样的事情,所以我将发布相关代码,然后解释它:
@bot.event
async def on_message(message):
if len(message.content) > 250 or message.author.bot:
return
if message.guild:
messageL = f"{message.author.name.replace(message.author.discriminator, '')} posted: '{message.content}'"
success1 = await SendHomeMML(messageL)
if success1 is None:
print("Message Log message failed.")
descE = f"{message.author.name.replace(message.author.discriminator, '')} posted: \n'{message.content}'\n" \
f"This was in a Guild titled '{message.guild.name}' within Channel '{message.channel.name}'\n"
MessageE = discord.Embed(title="Message Log", description=descE, colour=8421376)
MessageE.set_footer(text=f"Posted on: {message.created_at.isoformat(' ')}")
success2 = await SendHomeEML(MessageE)
if success2 is None:
print("Message Log embed failed.")
# and so on...
# Some time later... #
async def SendHomeEML(embedded):
return await bot.get_channel(123456789123456789).send(embed=embedded)
async def SendHomeMML(message):
return await bot.get_channel(123456789123456789).send(content=discord.utils.escape_mentions(message))
首先,on_message
位:我在做什么?长度和bot检查只是确定被分析的消息不是由bot发布的(这很重要,可以防止bot发布消息时可能出现无限循环),并且消息不是长得出奇。如果你不介意你的服务器获得那些庞大的帖子,请随意删除长度检查。接下来,我们检查消息是否是在公会中发送的;如果不是,那就去了其他不相关的地方。我更喜欢做的是发送一条消息和所有发布消息的嵌入,到不同的渠道。这就是SendHomeML
和SendHomeEML
消息所做的。如果您很好奇,它们代表“发送(到)家庭(服务器)消息/嵌入-消息日志”。无论如何,这并不是很复杂--大多数代码只是将嵌入式格式化得看起来很体面。您需要的部分可能是这些函数的实现。
格式化说明:将这些函数分离成它们自己的函数并不是必需的,而且由于这样会延长代码的长度,可能会招致一些反对意见。但是对于一个简单的bot来说,事件/命令的可读性才是王道。这样,我就可以发送很多东西到我的机器人的“家庭服务器”(像你的私人服务器),而不必重写那一行。这些也是放置更多错误处理的可靠位置,这取决于这些消息被传递的重要性。
代码要求:
导入不一致
SendHome
函数提示:通道ID在Discord中是完全唯一的,因此get_channel()
不需要guild
,只需要ID。如果您的bot不在与您发布的ID相对应的通道中,您将收到一个错误。
如果你有任何问题,请随时留言。干杯!