如何使机器人监听消息并将其发送到另一台服务器?

时间:2019-07-30 03:38:38

标签: javascript python bots discord discord.py

我正在尝试创建一个机器人,以监听频道中的消息并将其发送到我的私人服务器。我不太了解编码方面的内容,因此我依赖一些在线资源。

我已经做过一个机器人,可以在频道中获取新消息,然后将其带到专用频道。自从移至另一个操作系统以来,我找不到代码所在的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)。

1 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow,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位:我在做什么?长度和漫游器检查仅确定正在分析的消息不是由漫游器发布的(这很重要,这是为了防止在您的漫游器发布消息时可能出现无限循环),并且该消息不会发疯。如果您对服务器收到大量邮件感到满意,请随时删除长度检查。接下来,我们检查消息是否是在公会中发送的;如果没有,那就是其他无关紧要的地方。 我更喜欢做的是将消息和所有嵌入消息的嵌入消息都发送到不同的渠道。这就是SendHomeMMLSendHomeEML消息的作用。如果您感到好奇,它们代表“发送(到)家庭(服务器)消息/嵌入消息日志”。无论如何,它并不是很复杂-大多数代码只是将嵌入文件格式化为看起来不错。您可能需要的部分是这些功能的实现。

格式化注释:不需要将这些注释分隔成各自的功能,并且由于其加长代码的方式,可能会引起一些反对。但是对于一个简单的机器人来说,事件/命令的可读性才是王道。这样,我可以将很多东西发送到我的机器人的“本地服务器”(如您的私有服务器),而无需重写该行。这些也是放置更多错误处理的可靠地方,具体取决于传递这些消息的重要性

代码要求:

  1. 您(显然)必须import discord
  2. SendHome函数中将您想要用作目标的频道ID
  3. 您的漫游器必须同时处于您为第2步输入的渠道中,并且自然要处于发布您存储的消息的渠道中。

Protip :频道ID在Discord中是完全唯一的,因此,为什么get_channel()不需要Guild,而只需要一个ID。如果您的漫游器不在与您发布的ID对应的频道中,则会收到错误消息。

如有任何疑问,请随时发表评论。干杯!