import logging import os import sys from typing import Any from telegram import Update from telegram.ext import Application, ApplicationBuilder, CommandHandler, ContextTypes from dotenv import load_dotenv from src.financial_news_requester import fetch_comp_financial_news from fastapi import FastAPI, Request import uvicorn import asyncio logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) load_dotenv() TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN") if not TELEGRAM_TOKEN: logger.error("TELEGRAM_TOKEN not found! Please add it in Space Settings > Repository secrets") raise ValueError("TELEGRAM_TOKEN not found in environment variables") SPACE_ID = os.environ.get('SPACE_ID', 'ResearchEngineering/news_sentiment_analyzer') PORT = int(os.environ.get('PORT', 7860)) def format_news_for_telegram(news_json: list[dict[str, Any]]) -> str: message = "" for item in news_json: message += ( f"📰 {item.get('headline')}\n" f"📝 {item.get('summary')}\n" f"🏷️ Source: {item.get('source')}\n" f"🔗 Read more\n\n" ) return message async def start(update: Update, context: ContextTypes.DEFAULT_TYPE): await update.message.reply_text("Hello! I'm your Financial Bot.") async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE): """Handle /help command""" await update.message.reply_text("🤖 Available commands:\n/start - Start the bot\n/help - Show this help") async def run_crew(update: Update, context: ContextTypes.DEFAULT_TYPE): await update.message.reply_text("Running ...") try: feed = fetch_comp_financial_news() logging.info(f"processed: {feed} news") await update.message.reply_text(f"Result:\n{format_news_for_telegram(feed)}", parse_mode='HTML') except Exception as e: await update.message.reply_text(f"Error: {e}") app = FastAPI() @app.post(f"/{TELEGRAM_TOKEN}") async def webhook(request: Request): """Handle incoming webhook from Telegram""" try: # Get the update from Telegram json_data = await request.json() update = Update.de_json(json_data, application.bot) # Process the update await application.process_update(update) return {"status": "ok"} except Exception as e: logger.error(f"Error processing update: {e}") return {"status": "error", "message": str(e)} @app.get("/") async def root(): """Health check endpoint""" return {"status": "Bot is running!", "webhook_url": f"https://{SPACE_ID}.hf.space/{TELEGRAM_TOKEN}"} @app.get("/set_webhook") async def set_webhook(): """Manually set the webhook (call this once after deployment)""" try: webhook_url = f"https://{SPACE_ID}.hf.space/{TELEGRAM_TOKEN}" # Use a simple HTTP request to set webhook instead of bot.set_webhook() import httpx set_webhook_url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/setWebhook" async with httpx.AsyncClient() as client: response = await client.post(set_webhook_url, json={"url": webhook_url}) result = response.json() if result.get("ok"): return {"status": "success", "webhook_url": webhook_url, "result": result} else: return {"status": "error", "result": result} except Exception as e: logger.error(f"Error setting webhook: {e}") return {"status": "error", "message": str(e)} def func(): logging.basicConfig(level=logging.INFO) app = ApplicationBuilder().token(TELEGRAM_TOKEN).build() app.add_handler(CommandHandler("start", start)) app.add_handler(CommandHandler("run", run_crew)) app.run_polling() def test_func(): application = Application.builder().token(TELEGRAM_TOKEN).build() application.add_handler(CommandHandler("start", start)) PORT = int(os.environ.get('PORT', 8000)) # Run webhook (better for HF Spaces) application.run_webhook( listen="0.0.0.0", port=PORT, url_path=TELEGRAM_TOKEN, webhook_url=f"https://{os.environ.get('SPACE_ID', SPACE_ID)}.hf.space/{TELEGRAM_TOKEN}" ) if __name__ == "__main__": # Create telegram application WITHOUT initializing application = Application.builder().token(TELEGRAM_TOKEN).build() application.add_handler(CommandHandler("start", start)) application.add_handler(CommandHandler("help", help_command)) logger.info(f"Starting bot on port {PORT}") logger.info(f"Webhook URL will be: https://{SPACE_ID}.hf.space/{TELEGRAM_TOKEN}") logger.info("After deployment, visit /set_webhook to configure the webhook") uvicorn.run(app, host="0.0.0.0", port=PORT)