Critério de Busca: O bot precisa buscar por produtos acima de R$ 150, mas no código o filtro está para valores abaixo de R$ 200. Como posso ajustar isso?
Erros Encontrados: Estou recebendo alguns erros relacionados à API e ao uso de asyncio para o bot. Como posso depurar e corrigir esses problemas?
Integração de API: A resposta da API nem sempre vem no formato esperado, e isso causa erros. Qual é a melhor prática para tratar respostas inesperadas da API?
import asyncio
import os
import requests
from apscheduler.schedulers.background import BackgroundScheduler
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
# URL da API
API_URL = 'https://dashskins.com.br/api/listing/prices'
# Definir as credenciais do Telegram
TOKEN = os.getenv('TELEGRAM_TOKEN', 'SEU_TOKEN_AQUI') # Substitua pelo seu token
all_deals = []
# Inicializa a aplicação globalmente
application = ApplicationBuilder().token(TOKEN).build()
# Inicia o agendador globalmente
scheduler = BackgroundScheduler()
scheduler.start()
def fetch_all_deals_from_site():
all_deals.clear()
try:
response = requests.get(API_URL)
response.raise_for_status()
deals_data = response.json()
if not isinstance(deals_data, dict):
print("Erro: O formato da resposta não é um dicionário.", deals_data)
return
for category, items in deals_data.items():
if isinstance(items, dict):
for name, price in items.items():
# Ajuste o critério de desconto aqui
if isinstance(price, (int, float)) and price < 200:
all_deals.append(f"{name}: R${price:.2f}")
else:
print(f"Formato inesperado para a categoria '{category}': {items}")
except requests.exceptions.HTTPError as http_err:
print(f"Erro HTTP: {http_err}")
except Exception as e:
print(f"Erro durante a requisição à API: {e}")
async def send_message_via_telegram(deals, chat_id):
if deals:
message_chunk = ""
for deal in deals:
if len(message_chunk) + len(deal) + 2 > 4096: # Limite de mensagem do Telegram
await application.bot.send_message(chat_id=chat_id, text=message_chunk)
message_chunk = ""
message_chunk += deal + "n"
if message_chunk:
await application.bot.send_message(chat_id=chat_id, text=message_chunk)
else:
await application.bot.send_message(chat_id=chat_id, text="Nenhuma oferta disponível.")
async def fetch_and_send_deals(chat_id):
fetch_all_deals_from_site()
await send_message_via_telegram(all_deals, chat_id)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
chat_id = update.message.chat.id
await update.message.reply_text("Bot iniciado! Você receberá ofertas com desconto a cada 10 minutos.")
if scheduler.get_job(str(chat_id)) is None:
scheduler.add_job(fetch_and_send_deals, 'interval', minutes=10, args=[chat_id], id=str(chat_id))
async def stop(update: Update, context: ContextTypes.DEFAULT_TYPE):
chat_id = update.message.chat.id
job = scheduler.get_job(str(chat_id))
if job:
scheduler.remove_job(str(chat_id))
await update.message.reply_text("Bot parado! Não enviando mais ofertas.")
else:
await update.message.reply_text("Nenhum job agendado para este chat.")
async def refresh(update: Update, context: ContextTypes.DEFAULT_TYPE):
chat_id = update.message.chat.id
fetch_all_deals_from_site()
await send_message_via_telegram(all_deals, chat_id)
async def main():
application.add_handler(CommandHandler('start', start))
application.add_handler(CommandHandler('stop', stop))
application.add_handler(CommandHandler('refresh', refresh))
async with application: # Usando gerenciador de contexto para iniciar o bot
await application.initialize()
await application.run_polling() # Inicia o bot
if __name__ == '__main__':
try:
# Check if the event loop is already running
loop = asyncio.get_event_loop()
if loop.is_running():
print("Event loop already running. Starting the bot without asyncio.run()")
asyncio.ensure_future(main())
else:
asyncio.run(main())
except (KeyboardInterrupt, SystemExit):
scheduler.shutdown()