File size: 5,688 Bytes
ad4883e b38f32e ad4883e 6c65bc1 ad4883e 7b238fc 7d40f19 ad4883e b38f32e 7610140 b38f32e 7610140 b38f32e 7d40f19 7610140 3d0a57b f31a98c 641846a f31a98c ad4883e 641846a ad4883e 3d0a57b ad4883e 7610140 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 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
import os
import logging
import asyncio
import nest_asyncio
import httpx
from telegram import Update, Bot
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?url=https://{WEBHOOK_URL}"
# -------------------------
# 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)
# def webhook():
# bot.remove_webhook()
# bot.set_webhook(url=WEBHOOL_URL + TOKEN) # ืืืืจ ืืช ื-Webhook
# print("webhook set: ", WEBHOOL_URL + TOKEN)
# return "!", 200
# -------------------------
# Optional: Manually set webhook using bot.set_webhook()
# -------------------------
async def set_webhook():
bot = Bot(token=TOKEN)
bot.remove_webhook()
# This call will set the webhook to the given URL.
PATH = WEBHOOK_URL + TOKEN
try:
await bot.set_webhook(url=PATH)
logger.info(f"Webhook set successfully to: {WEBHOOK_URL}")
print("bot webhook success")
except Exception as e:
logger.error(f"Failed to set webhook manually. Error: {e}")
print(f"error setting bot webhook. Error: {e}")
# -------------------------
# Main function to run the bot using Webhook mode
# -------------------------
async def main():
await set_webhook()
# 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())
|