通过discord.py发送嵌入内容

问题描述 投票:0回答:5

我做了很多工作,通过 JavaScript 和 Discord.js 使用 Discord API 创建 Discord 机器人。

我正在尝试使用 python 创建我的第一个不和谐机器人,通过discord.py使用discord api并通过requests.py发送请求。

我的目标是检查网站上的状态代码,当发送包含“状态代码”的消息时,它将在嵌入中回复网站的状态代码。

这是我执行此操作的代码:

import discord
import requests
r = requests.get('redactedurl')
test = r.status_code
class MyClient(discord.Client):
    async def on_ready(self):
        print('Logged on as {0}!'.format(self.user))

    async def on_message(self, message):
        if (message.channel.id == redacted):
                if "status code" in message.content:
                    print('Message from {0.author}: {0.content}'.format(message))
                    
                    embed = discord.Embed(color=0x00ff00)
                    embed.title = "test" 
                    embed.description = '**Status Code:** {r.status_code}'
                    await message.channel.send(embed=embed)


client = MyClient()
client.run('redacted')

以下是我希望有人能回答来帮助我的问题列表:)

  1. 正如您在这里看到的:https://gyazo.com/f6ae7082486cade72389534a05655fec,这只是在嵌入中发送“{r.status_code}”,而不是实际的状态代码,我做错了什么?

  2. 当我在大括号中看到 0 时,这是什么意思?例如,有人可以向我解释“('以{0}登录!'.format(self.user))”吗?由于我是 python 和discord.py 的新手,所以我对整行感到困惑。我知道结果是什么,但请原谅我的无知,这一切有必要吗?

  3. 在“send(embed=embed)”中,为什么我不能只放send(embed)?

  4. 最后,我还能做些什么来改进代码吗?

如果您能提供帮助,非常感谢!

python discord discord.py
5个回答
0
投票
  1. 在设置嵌入描述的行中,将

    r.status_code
    作为字符串而不是它包含的值输出。试试
    embed.description = '**Status Code:** {0}'.format(r.status_code)

  2. 0 类似于应该存在的值的索引。例如,

    '{1}'.format(10, 20)
    将打印出索引 1 处的值,在本例中为 20。

  3. 当您使用

    send(embed)
    时,机器人最终将以字符串形式发送嵌入,这看起来非常不合适,如果您尝试发送它,您就会明白我的意思。在这种情况下,我们必须指定要将值分配给哪个参数。此函数接受
    kwargs
    ,它们是关键字参数,在本例中,embed 是此
    kwargs
    函数中的
    send()
    之一。此函数也接受其他
    kwargs
    以及
    content, tts, delete_after, etc.
    它都已记录。

  4. 您可以通过传入

    kwargs
    来简化嵌入的创建,例如:
    discord.Embed(title='whatever title', color='whatever color')
    如果您查看文档,
    discord.Embed()
    可以支持更多参数。

这里是文档的链接:https://discordpy.readthedocs.io/en/latest/index.html 如果您搜索

TextChannel
,并查找
send()
函数,您可以找到更多受支持的参数以及
discord.Embed()


0
投票

好的,列出你的问题清单:

  1. 您没有格式化 {r.status_code} ,而只是将其作为字符串发送,这就是它显示为这样的原因。要修复它,您所要做的就是添加 1 个“f”。
embed.description = f'**Status Code:** {r.status_code}'

或者,如果您想使用一致的方式格式化字符串:

embed.description = '**Status Code:** {0}'.format(r.status_code)
  1. 在Python中,字符串中的大括号“{}”可用于格式化。这可以通过多种方式完成,包括如何在代码中执行此操作。如果您想格式化字符串中的不同值,str.format() 可以采用多个参数。 0 只是您要使用的参数的索引。
  2. 我对不和谐库不太熟悉,但快速查看了文档后,似乎如果您这样做,它将采用您的
    embed
    变量并将其作为
    content
    变量传递到 send 中。从而将其作为普通消息发送而不是嵌入它。
  3. 我个人更喜欢使用 f 字符串进行格式化,因为它使您的代码更易于阅读。我无法真正评论您对不和谐库的使用,但除此之外您的代码看起来不错!纯粹为了美观/可读性,我会在导入和定义变量之间以及变量和类之间放置一个空行。

0
投票

这是一个例子!

import discord

client = commands.Bot(command_prefix = '~')

@client.command()
async def embed(ctx):
   embed=discord.Embed(title="Hello!",description="Im a embed text!")
await ctx.send(embed=embed)

client.run("TOKEN")

0
投票
import discord
from discord.ext import commands

client = commands.Bot(command_prefix='>')

@client.event
async def on_ready():
    print("Log : "+str(client.user))

@client.command()
async def embed(ctx):
    em = discord.Embed(color=discord.Color.from_rgb(0,0,255),title="Your title",description="Your description")
    await ctx.send(embed=em)


client.run("token")

0
投票
embed=discord.Embed(title="hello", url="https://discord.com/channels/###/###/###")
embed.set_author(name="me", url="https://discord.com/api/webhooks/###/###", icon_url="https://discord.com/channels/###/###/###")
await ctx.send(embed=embed)
© www.soinside.com 2019 - 2024. All rights reserved.