如何制作一个侦听消息并将它们发送到另一台服务器的机器人?
Posted
技术标签:
【中文标题】如何制作一个侦听消息并将它们发送到另一台服务器的机器人?【英文标题】:How to make a bot that listens for messages and sends them to another server? 【发布时间】:2019-12-07 09:24:51 【问题描述】:我正在尝试制作一个机器人来侦听频道中的消息并将它们发送到我的私人服务器。我不完全了解编码的东西,所以我依赖一些在线资源。
我已经做了一个机器人,它可以在频道中获取新消息,然后将它们带到私人频道。自从我搬到另一个操作系统后,我找不到代码所在的 GitHub。现在已经不碍事了,我需要机器人将日志发送到我的私人服务器,以防我的一些员工不小心删除了其中一个日志/多个日志。然后我遇到了类似的问题:How to send a message to a different server | 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)。
【问题讨论】:
如果我理解的话,基本上你需要一个 python 服务器,监听特定的消息并将其存储在某个地方是吗?并且服务器是通过它的特定IP访问的? 我之前在这个网站上看到过一些问题,然后用代码得到了答案。不过,这些都是几年前制造的,我不知道它们是否还能工作。 您可以使用get_guild
获取您要发送消息的公会。
以防万一你感到困惑,我所说的“收听”,它会留意频道中的新消息 (Discord)。
【参考方案1】:
欢迎来到 ***,Cube!我最近写了一个简单的 Discord.py 机器人来做同样的事情,所以我将发布相关代码然后解释它:
@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 发布消息时可能出现无限循环),并且消息不是非常长。如果您对您的服务器接收这些庞大的帖子感到满意,请随意删除长度检查。接下来,我们检查消息是否在公会中发送;如果没有,那就去其他不相关的地方。
我更喜欢将消息和所有已发布消息的嵌入发送到不同的渠道。这就是SendHomeMML
和SendHomeEML
消息的作用。如果您好奇,它们代表“发送(到)家庭(服务器)消息/嵌入消息日志”。无论如何,它并不是很复杂——大部分代码只是格式化嵌入,看起来还不错。您可能需要的部分是这些功能的实现。
格式说明:不需要将它们分离成它们自己的函数,并且由于它延长代码的方式可能会引起一些反对。但是对于一个简单的机器人来说,事件/命令的可读性才是王道。这样,我可以将很多东西发送到我的机器人的“家庭服务器”(如您的私人服务器),而无需重写该行。这些也是放置更多错误处理的可靠位置,具体取决于传递这些消息的重要性。
代码要求:
-
您将(显然)必须
import discord
将您想要作为目标的频道 ID 放入 SendHome
函数中
您的 bot 必须位于您为第 2 步输入的渠道中,当然也必须位于您存储的消息发布的渠道中。
Protip:频道 ID 在 Discord 中是完全唯一的,因此 get_channel()
不需要 Guild
,只需要一个 ID。如果您的 bot 不在与您发布的 ID 对应的频道中,您将收到错误消息。
如果您有任何问题,请随时留下一些 cmets。干杯!
【讨论】:
以上是关于如何制作一个侦听消息并将它们发送到另一台服务器的机器人?的主要内容,如果未能解决你的问题,请参考以下文章