-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot.py
More file actions
82 lines (67 loc) · 2.86 KB
/
Copy pathbot.py
File metadata and controls
82 lines (67 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import asyncio
import logging
import os
import aiohttp
from aiogram import Bot, Dispatcher, types, F
from aiogram.filters import Command
from dotenv import load_dotenv
from openai import OpenAI
# Загруженные переменные окружения
load_dotenv()
BOT_TOKEN = os.getenv('BOT_TOKEN')
KP_API_KEY = os.getenv('KP_API_KEY')
# Настройка логирования
logging.basicConfig(level=logging.INFO)
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
# Запрос к API kinopoisk.dev
async def get_movie_info(title):
url = "https://api.kinopoisk.dev/v1.4/movie/search"
headers = {
"X-API-KEY": KP_API_KEY,
"accept": "application/json"
}
params = {"query": title, "limit": 1}
async with aiohttp.ClientSession() as session:
try:
async with session.get(url, headers=headers, params=params) as response:
if response.status == 200:
data = await response.json()
if data.get('docs'):
return data['docs'][0]
return None
except Exception as e:
logging.error(f"Ошибка при запросе: {e}")
return None
# Обработчик команды /start
@dp.message(Command("start"))
async def start_handler(message: types.Message):
await message.answer("Привет! Напиши название фильма, и я найду информацию о нем.")
# Обработчик текстовых сообщений (поиск фильма)
@dp.message(F.text)
async def search_handler(message: types.Message):
# Сообщение о начале поиска
wait_message = await message.answer("Ищу в базе...")
movie = await get_movie_info(message.text)
if movie:
name = movie.get('name') or movie.get('alternativeName', 'Без названия')
year = movie.get('year', '????')
rating = movie.get('rating', {}).get('kp', 0)
desc = movie.get('shortDescription') or movie.get('description', 'Описания пока нет.')
poster_url = movie.get('poster', {}).get('url')
caption = (f"🎬 **{name}** ({year})\n"
f"⭐️ Рейтинг Кинопоиска: {rating:.1f}\n\n"
f"📝 {desc}")
if poster_url:
await message.answer_photo(photo=poster_url, caption=caption, parse_mode="Markdown")
else:
await message.answer(caption, parse_mode="Markdown")
else:
await message.answer("К сожалению, я не нашел такой фильм. Попробуй другое название.")
# Удаляем сообщение о поиске
await wait_message.delete()
# Запуск бота
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())