File size: 4,846 Bytes
ad4883e 6c65bc1 ad4883e 7b238fc 6c65bc1 ad4883e 6c65bc1 ad4883e 6c65bc1 |
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 |
import os
import logging
import asyncio
import nest_asyncio
import httpx
from telegram import Update
from telegram.ext import (
Application,
CommandHandler,
MessageHandler,
filters,
CallbackContext
)
# -------------------------
# Configure logging
# -------------------------
logging.basicConfig(
format="%(asctime)s - %(levelname)s - %(message)s", level=logging.INFO
)
logger = logging.getLogger(__name__)
# -------------------------
# Environment variables
# -------------------------
# Get the Telegram Bot Token
TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
if not TOKEN:
raise ValueError("Missing Telegram Bot Token. Please set TELEGRAM_BOT_TOKEN environment variable.")
# Get the domain for webhook (publicly accessible, e.g., your-space.hf.space)
WEBHOOK_DOMAIN = os.getenv("WEBHOOK_DOMAIN")
if not WEBHOOK_DOMAIN:
raise ValueError("Missing Webhook Domain. Please set WEBHOOK_DOMAIN environment variable.")
# -------------------------
# Webhook configuration
# -------------------------
# Define a unique webhook path using the bot token
# WEBHOOK_PATH = f"/{TOKEN}"
# Construct the full webhook URL (must be HTTPS as required by Telegram)
WEBHOOK_URL = f"https://{WEBHOOK_DOMAIN}" # {WEBHOOK_PATH}"
TELEGRAM_WEBHOOK = f"https://api.telegram.org/bot{TOKEN}/setwebhook"
# -------------------------
# API URL of the FastAPI server (running on Hugging Face)
# -------------------------
API_URL = "https://demaking-decision-helper-bot.hf.space/generate_response"
# -------------------------
# Function to fetch response from FastAPI (unchanged)
# -------------------------
async def fetch_response(user_text: str):
async with httpx.AsyncClient(timeout=45.0) as client:
try:
response = await client.post(API_URL, json={"text": user_text})
response.raise_for_status() # Raise exception for HTTP 4XX/5XX errors
return response.json()
except httpx.HTTPStatusError as e:
logger.error(f"HTTP Error: {e.response.status_code} - {e.response.text}")
return {"response": "Error: API returned an error."}
except httpx.RequestError as e:
logger.error(f"Request Error: {e}")
return {"response": "Error: Could not reach API."}
except Exception as e:
logger.error(f"Unexpected Error: {e}")
return {"response": "Error: Unexpected error occurred."}
# -------------------------
# Command handler for /start
# -------------------------
async def start(update: Update, context: CallbackContext):
# Respond to the /start command.
await update.message.reply_text("Hello! Tell me your decision-making issue, and I'll try to help.")
logger.info("Start command received.")
# -------------------------
# Message handler for incoming text messages
# -------------------------
async def handle_message(update: Update, context: CallbackContext):
user_text = update.message.text
logger.info(f"User message: {user_text}")
# Send the user text to the FastAPI server and get the response.
result = await fetch_response(user_text)
response_text = result.get("response", "Error generating response.")
logger.info(f"API Response: {response_text}")
await update.message.reply_text(response_text)
# -------------------------
# Main function to run the bot using Webhook mode
# -------------------------
async def main():
# Build the Application with the Telegram Bot Token
application = Application.builder().token(TOKEN).build()
# Add command and message handlers
application.add_handler(CommandHandler("start", start))
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
# Log: starting the bot in webhook mode.
logger.info("Starting bot in webhook mode...")
# Run the application using webhook mode.
# The bot will listen on all interfaces (0.0.0.0) at the specified port (5000 in this example).
# Make sure that the port you choose is allowed by your hosting environment.
await application.run_webhook(
listen="0.0.0.0", # Listen on all available interfaces
port=443, # Port to listen on
url_path=TELEGRAM_WEBHOOK, # The webhook path; here, we use the bot token
webhook_url=WEBHOOK_URL # The full webhook URL that Telegram will use to send updates
)
# -------------------------
# Run the main function
# -------------------------
if __name__ == "__main__":
# Apply nest_asyncio to support nested event loops if required.
nest_asyncio.apply()
# asyncio.run(main())
# Instead of asyncio.run(), which may try to close an already running loop,
# get the current loop and run main() until complete.
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
|