如何在嵌入 discord.py 中将长字段作为页面发送?

Posted

技术标签:

【中文标题】如何在嵌入 discord.py 中将长字段作为页面发送?【英文标题】:How to send long fields as pages in embed discord.py? 【发布时间】:2021-02-22 11:19:50 【问题描述】:

例如这里的代码,它可以工作,但有一些名称,例如https://api.ashcon.app/mojang/v2/user/TonTon70 太长并给出此错误“长度必须为 1024 或更少” 所以我看到一些机器人将长字段作为带有左右箭头的页面发送

import discord
from discord.ext import commands
import requests
import json
from tabulate import tabulate

@client.command()
async def namehistory(ctx,*username):
    async with ctx.typing():
        embed = discord.Embed(
        discription = "discription",
        color = discord.Color.green()
        )
        if not username:
            embed.add_field(name="Name History", value="Username not supplied!", inline=False)
            await ctx.send(embed=embed)
            return

    nurl = "https://api.ashcon.app/mojang/v2/user/" + username[0]
    nr = requests.get(url=nurl)
    data = nr.json()

    if "username" in data and data.get("username") != 'null':
        nhistory = data['username_history']
        nhistory = tabulate(nhistory,headers="keys")
        embed.add_field(name="Name History", value=f"```nhistory```", inline=False)
        await ctx.send(embed=embed)
    else:
        await ctx.send("Wrong username!")

【问题讨论】:

嵌入字段本身有 1024 个字符的限制(您可以在 discord.com/developers/docs 的某处找到限制)。您应该尝试将它们拆分为多个字段或发送多条消息 【参考方案1】:

嵌入中的“页面”实际上只是带有message reaction collectors 的单独嵌入。消息反应收集器是在用户对消息做出反应时触发的事件。要了解如何使用消息反应收集器,请查看this question:

embed_message = msg.channel.send(your_embed)     # send the first page embed

embed_user = msg.author                          # get the msg user

await embed_message.add_reaction("⬅️")           # send the page back button
await embed_message.add_reaction("➡️")            # send the page next button

await asyncio.sleep(30)                          # user has 30 seconds to react to a msg, you can change the timings. Also don't forget to import asyncio

embed_message = await embed_message.channel.fetch_message(vote_msg.id) # after waiting 30 seconds, get the reactions for the msg

现在,反应信息在embed_message。您可以使用if 语句来读取选择的反应。另外,不要忘记通过将其与embed_user 进行比较来检查该反应是否来自正确的用户。如果您需要这方面的帮助,请随时查看documentation

for reaction in embed_message: # embed_message returns a list
    if reaction.users().flatten()[embed_message.index(reaction)] == embed_user: # test if the correct user reacted before performing checks
        if reaction.emoji == "⬅️":
            # code to send the previous page embed...
        elif reaction.emoji == "➡️":
            # code to send the next page embed...

祝你的机器人好运!

【讨论】:

以上是关于如何在嵌入 discord.py 中将长字段作为页面发送?的主要内容,如果未能解决你的问题,请参考以下文章

如何以更简洁的方式为 discord.py 编写嵌入代码?

Discord.py 如何从不和谐消息中读取 int 并将其作为变量发送到嵌入中

(discord.py) 有啥方法可以自动保存嵌入图像?

不和谐.py |使用嵌入时,如何使用 for 循环生成变量的字段值?

使用 discord.py 将已经存在的 json 文件作为嵌入发送

使用变量作为掩码链接; discord.py 嵌入通过 webhook 发布; Python