discord.py, Shikimori API, можно ли как-то получить информацию о главных героях аниме?

BASE_URL = "https://shikimori.one/api"


def search_anime_by_title(title):
    url = f"{BASE_URL}/animes"
    params = {"search": title, "limit": 25}
    headers = {"User-Agent": ""}
    response = requests.get(url, headers=headers, params=params)
    if response.status_code == 200:
        return response.json()
    else:
        return None


def clean_description(description):
    cleaned_description = re.sub(r'\[.*?\]', '', description)
    return cleaned_description


class AnimeSelect(Select):
    def __init__(self, anime_results):
        options = [
            discord.SelectOption(
                label=f"{anime['russian'][:97]}..." if len(anime['russian']) > 100 else anime['russian'],
                value=str(anime['id'])) for anime in anime_results[:25]]
        super().__init__(placeholder="Выберите аниме", options=options, min_values=1, max_values=1)

    async def callback(self, interaction: discord.Interaction):
        anime_id = self.values[0]
        anime_details = self.get_anime_details(anime_id)
        if anime_details and isinstance(anime_details, dict):
            image_url = "https://shikimori.one" + anime_details['image']['original']
            description = anime_details.get('description', 'Описание недоступно')
            cleaned_description = clean_description(description) if description else 'Описание недоступно'

            embed = discord.Embed(title=f"{anime_details.get('russian', 'Без названия')} "
                                        f"({anime_details.get('name', 'Без ориг. названия')})",
                                  description=cleaned_description, color=discord.Color.default())
            embed.add_field(name="Год выхода", value=anime_details.get('aired_on', 'Неизвестно'))
            embed.add_field(name="Статус", value=anime_details.get('status', 'Неизвестно'))
            embed.add_field(name="Количество эпизодов", value=anime_details.get('episodes', 'Неизвестно'))
            embed.set_thumbnail(url=image_url)
            button = discord.ui.Button(label="Главные герои", style=discord.ButtonStyle.primary)
            button.callback = lambda inter: self.show_characters(inter, anime_id)
            view = discord.ui.View()
            view.add_item(button)
            await interaction.response.edit_message(content="Информация о выбранном аниме:", embed=embed, view=view)
        else:
            await interaction.response.send_message(f"Не удалось получить информацию выбранного аниме. "
                                                    f"({anime['russian']})", ephemeral=True)

    def show_characters(self, interaction, anime_id):
        characters = self.get_animation_characters(anime_id)
        if characters and isinstance(characters, list):
            character_names = [char['name'] for char in characters]
            content = "Главные герои:\n" + "\n".join(character_names)
            view = discord.ui.View()
            for char in characters:
                button = discord.ui.Button(label=char['name'], style=discord.ButtonStyle.secondary)
                button.callback = lambda inter, name=char['name']: self.show_character_info(inter, name)
                view.add_item(button)
            return interaction.response.send_message(content=content, view=view, ephemeral=True)
        else:
            return interaction.response.send_message("Не удалось получить героев.", ephemeral=True)

    async def show_character_info(self, interaction, anime_title):
        anime_details = search_anime_by_title(anime_title)
        if anime_details and isinstance(anime_details, list) and len(anime_details) > 0:
            anime_detail = anime_details[0]
            characters = anime_detail.get('characters', [])
            if characters:
                embed = discord.Embed(
                    title=f"Главные герои аниме: {anime_detail['russian']} ({anime_detail['name']})",
                    color=discord.Color.default())
                for character in characters:
                    character_name = character.get('name', 'Без имени')
                    character_image = character.get('image', {}).get('original', None)
                    character_role = character.get('role', 'Неизвестно')
                    embed.add_field(name=character_name, value=f"Роль: {character_role}", inline=False)
                    if character_image:
                        embed.set_thumbnail(url=character_image)

                await interaction.response.send_message(embed=embed, ephemeral=True)
            else:
                await interaction.response.send_message("У этого аниме нет главных героев.", ephemeral=True)
        else:
            await interaction.response.send_message("Не удалось получить информацию о аниме.", ephemeral=True)

    def get_animation_characters(self, anime_id):
        url = f"{BASE_URL}/animes/{anime_id}/characters"
        headers = {"User-Agent": ""}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.json()
        return None

    def get_anime_details(self, anime_id):
        url = f"{BASE_URL}/animes/{anime_id}"
        headers = {"User-Agent": ""}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.json()
        return None


class AnimeSelectView(View):
    def __init__(self, anime_results):
        super().__init__(timeout=None)
        self.add_item(AnimeSelect(anime_results))


@bot.slash_command(name="anime", description="Поиск информации об аниме")
async def anime(ctx, name: discord.Option(str, description="Название аниме")):
    try:
        await ctx.response.defer(ephemeral=True)
        anime_results = search_anime_by_title(name)
        if anime_results and isinstance(anime_results, list) and len(anime_results) > 0:
            view = AnimeSelectView(anime_results)
            await ctx.followup.send("Выберите аниме из списка:", view=view, ephemeral=True)
        else:
            await ctx.followup.send("Аниме не найдено или произошла ошибка.", ephemeral=True)
    except Exception as e:
        await ctx.followup.send("Произошла неизвестная ошибка!", ephemeral=True)
        adm = bot.get_user(admin)
        if adm:
            await adm.send(f"Произошла ошибка:\n{e}\nСервер: {ctx.guild.name}\nПользователь: {ctx.author.mention} | "
                           f"`{ctx.author.id}`\nКоманда: anime")

Вот у меня есть кнопка и функция для Главных героев, но они не работают. Как можно правильно реализовать получение информации о главных героях аниме?


Ответы (0 шт):