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")
Вот у меня есть кнопка и функция для Главных героев, но они не работают. Как можно правильно реализовать получение информации о главных героях аниме?