-
Notifications
You must be signed in to change notification settings - Fork 0
/
imdBot.py
151 lines (125 loc) · 6.31 KB
/
imdBot.py
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import os
import sys
import uuid
import time
import asyncio
import requests
from dotenv import load_dotenv
from telegram.ext import filters, Application, CommandHandler, InlineQueryHandler, MessageHandler, CallbackContext
from telegram import Update, InlineQueryResultArticle, InputTextMessageContent, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.error import BadRequest
load_dotenv()
TMDB_API_KEY = os.getenv("TMDB_API_KEY")
SEARCH_MOVIE = 1
async def restart(update: Update, context: CallbackContext):
message = "🔄 Para reiniciar o bot, por favor, clique /start novamente."
await update.message.reply_text(message)
async def tools(update: Update, context: CallbackContext):
message = "🔎 Escolha uma ferramenta:"
keyboard = InlineKeyboardMarkup(
[
[InlineKeyboardButton("🎬 Pesquisar filmes ou séries", switch_inline_query_current_chat="")],
[InlineKeyboardButton("👨🏻💻 Contato", "https://links.tifodao.com")],
]
)
await update.message.reply_text(message, reply_markup=keyboard)
async def send_info(update: Update, context: CallbackContext):
message = "📤 Informações do desenvolvedor\n\n<b>👤 Nome</b>: Diego Melo - @tifodao\n<b>🛅 Linguagens de programação</b>: TypeScript, C#, Node.JS, PHP, Python, React.JS\n<b>🛄 Bancos de dados/servidores</b>: MySQL, Apache\n<b>🛗 Frameworks e bibliotecas</b>: Laravel, Angular.JS, Vue.JS\n\n<b>📝 Sobre mim</b>:\n\n Sou um desenvolvedor full-stack e hacker ético do Brasil com mais de uma década de experiência, especializado em desenvolvimento Web e Windows/Linux Desktop. Tenho experiência trabalhando como desenvolvedor individual e, às vezes, como cooperador de equipe em muitos projetos, proporcionando-me as habilidades de comunicação com os clientes para satisfazer suas necessidades.\n\n<i>Por curiosidade, trabalhei com diversas ferramentas para diferentes plataformas e sempre buscando aprender novas tecnologias</i>."
await update.message.reply_text(message, parse_mode='HTML')
async def send_photo(update: Update, context: CallbackContext, photo_url: str):
chat_id = update.message.chat_id
await context.bot.send_photo(chat_id=chat_id, photo=photo_url)
async def inline_search_movies(update: Update, context: CallbackContext):
query = update.inline_query.query
if not query:
return
url = f"https://api.themoviedb.org/3/search/movie"
params = {
'api_key': TMDB_API_KEY,
'query': query,
'language': 'pt-BR',
}
try:
response = requests.get(url, params=params)
response.raise_for_status()
data = response.json()
results = []
for movie in data.get('results', []):
try:
thumb_url = f"https://image.tmdb.org/t/p/w500/{movie['poster_path']}"
article = InlineQueryResultArticle(
id=str(movie['id']),
title=movie['title'],
input_message_content=InputTextMessageContent(
f"{movie['id']}",
),
)
results.append(article)
except Exception as e:
print(f"Erro ao criar InlineQueryResultArticle: {e}")
await update.inline_query.answer(results, cache_time=60)
except requests.RequestException as e:
print(f"Erro na solicitação da API: {e}")
await update.inline_query.answer([], cache_time=60)
except BadRequest as e:
if "Query is too old" not in str(e):
raise e
async def display_movie_details(update: Update, context: CallbackContext):
try:
movie_id = update.message.text.split()[-1]
movie_id = int(movie_id)
except (ValueError, IndexError):
await update.message.reply_text("Por favor, forneça um ID válido.")
return
chat_id = update.message.chat_id
url = f"https://api.themoviedb.org/3/movie/{movie_id}"
params = {
'api_key': TMDB_API_KEY,
'language': 'pt-BR',
}
try:
response = requests.get(url, params=params)
response.raise_for_status()
data = response.json()
details = (
f"🎬 *Título:* {data['title']}\n"
f"📅 *Ano de lançamento:* {data['release_date'].split('-')[0]}\n\n"
f"📖 *SINOPSE:*\n\n{data['overview']}"
)
photo_url = f"https://image.tmdb.org/t/p/w500/{data['poster_path']}"
try:
await context.bot.send_photo(
chat_id=chat_id,
photo=photo_url,
caption=details,
parse_mode='Markdown'
)
if details.strip():
pass
else:
await context.bot.send_message(chat_id=chat_id, text="ℹ️ Sem informações disponíveis.")
except BadRequest as e:
print(f"Erro ao enviar a foto: {e}")
await context.bot.send_message(chat_id=chat_id, text="ℹ️ Ocorreu um erro ao enviar a foto.")
await asyncio.sleep(3)
except requests.RequestException as e:
print(f"Erro na solicitação da API: {e}")
await context.bot.send_message(
chat_id=chat_id, text="🚫 Erro ao obter detalhes do filmes ou séries.")
async def start(update: Update, context: CallbackContext):
message = "Seja bem-vindo(a) dedicado a filmes e séries! 🍿🎬 \n\nAqui, você pode explorar e compartilhar suas recomendações favoritas. \n\nClique no botão abaixo 🎥✨"
keyboard = InlineKeyboardMarkup(
[[InlineKeyboardButton("🎬 Pesquisar filmes ou séries", switch_inline_query_current_chat="")]]
)
await update.message.reply_text(message, reply_markup=keyboard)
instructions = "Para obter informações sobre um filme ou série, digite @ seguido pelo nome do filme ou série desejado."
await update.message.reply_text(instructions)
if __name__ == "__main__":
app = Application.builder().token("API_TOKEN").build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("tools", tools))
app.add_handler(CommandHandler("info", send_info))
app.add_handler(CommandHandler("restart", restart))
app.add_handler(InlineQueryHandler(inline_search_movies))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, display_movie_details))
app.run_polling()