Spaces:
Runtime error
Runtime error
Update main.py
Browse files
main.py
CHANGED
@@ -1,92 +1,94 @@
|
|
1 |
import os
|
2 |
import requests
|
3 |
import logging
|
|
|
|
|
4 |
from hydrogram import Client, filters
|
5 |
-
from hydrogram.types import Message
|
6 |
|
7 |
# --- Configuration ---
|
8 |
-
# Set up basic logging
|
9 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
10 |
logger = logging.getLogger(__name__)
|
11 |
|
12 |
-
# Retrieve secrets from Hugging Face secrets (environment variables)
|
13 |
-
# These MUST be set in your Hugging Face Space/Repo secrets settings
|
14 |
API_ID = os.environ.get('API_ID')
|
15 |
API_HASH = os.environ.get('API_HASH')
|
16 |
BOT_TOKEN = os.environ.get('BOT_TOKEN')
|
17 |
-
|
18 |
-
# Your "Permanent Template" URL
|
19 |
TEMPLATE_URL = "https://mediaflare.adasin.workers.dev/dl/4AmNTDcYQSPNQS"
|
20 |
|
21 |
-
# --- Helper Function to Fetch Template ---
|
22 |
def fetch_template(url):
|
23 |
-
"""Fetches content from the template URL."""
|
24 |
logger.info(f"Fetching template from {url}")
|
25 |
try:
|
26 |
-
response = requests.get(url, timeout=10)
|
27 |
-
response.raise_for_status()
|
28 |
-
logger.info("Template fetched successfully.")
|
29 |
-
#
|
30 |
-
return response.
|
31 |
except requests.exceptions.RequestException as e:
|
32 |
logger.error(f"Error fetching template from {url}: {e}")
|
33 |
-
return None
|
34 |
|
35 |
# --- Initialization ---
|
36 |
-
# Check if essential secrets are loaded
|
37 |
if not all([API_ID, API_HASH, BOT_TOKEN]):
|
38 |
logger.error("Missing required environment variables (API_ID, API_HASH, BOT_TOKEN). Ensure they are set in Hugging Face secrets.")
|
39 |
-
exit(1)
|
40 |
|
41 |
try:
|
42 |
-
# Convert API_ID to integer
|
43 |
API_ID = int(API_ID)
|
44 |
except ValueError:
|
45 |
logger.error("API_ID environment variable is not a valid integer.")
|
46 |
exit(1)
|
47 |
|
48 |
-
# Fetch the template content
|
49 |
-
|
50 |
-
if
|
51 |
-
logger.warning("Proceeding without template
|
52 |
-
# You might want to exit(1) here or use a default fallback template
|
53 |
-
# template_content = "Default template: An error occurred fetching the primary one."
|
54 |
|
55 |
# Initialize the Hydrogram (Pyrogram) client
|
56 |
-
#
|
57 |
logger.info("Initializing Hydrogram Client...")
|
58 |
try:
|
59 |
-
# When using bot_token, api_id and api_hash are used to authorize the bot owner's actions (if needed)
|
60 |
-
# or simply required by the library structure.
|
61 |
app = Client(
|
62 |
-
name="my_bot",
|
63 |
api_id=API_ID,
|
64 |
api_hash=API_HASH,
|
65 |
-
bot_token=BOT_TOKEN
|
66 |
-
#
|
67 |
-
# plugins=dict(root="plugins") # Example if you have a 'plugins' folder
|
68 |
)
|
69 |
logger.info("Hydrogram Client initialized.")
|
70 |
except Exception as e:
|
71 |
-
|
|
|
72 |
exit(1)
|
73 |
|
74 |
# --- Bot Event Handlers ---
|
75 |
@app.on_message(filters.command("start"))
|
76 |
async def start_handler(client: Client, message: Message):
|
77 |
-
"""Handler for the /start command."""
|
78 |
sender_name = message.from_user.first_name if message.from_user else "User"
|
79 |
sender_id = message.from_user.id if message.from_user else "Unknown ID"
|
80 |
logger.info(f"Received /start command from {sender_name} (ID: {sender_id})")
|
81 |
|
82 |
-
|
83 |
-
|
84 |
-
if
|
85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
else:
|
87 |
-
|
|
|
88 |
|
89 |
-
await message.reply_text(start_message) # Use reply_text for text messages
|
90 |
|
91 |
@app.on_message(filters.command("help"))
|
92 |
async def help_handler(client: Client, message: Message):
|
@@ -94,29 +96,29 @@ async def help_handler(client: Client, message: Message):
|
|
94 |
sender_id = message.from_user.id if message.from_user else "Unknown ID"
|
95 |
logger.info(f"Received /help command from {sender_id}")
|
96 |
await message.reply_text(
|
97 |
-
"This is a sample bot (Hydrogram).\nCommands:\n/start - Show welcome message and template\n/help - Show this help message"
|
98 |
)
|
99 |
|
100 |
-
# Add more handlers as needed
|
101 |
-
# @app.on_message(filters.private & ~filters.command(["start", "help"])) # Example: handle other private messages
|
102 |
-
# async def message_handler(client: Client, message: Message):
|
103 |
-
# """Handles any other message."""
|
104 |
-
# sender_id = message.from_user.id if message.from_user else "Unknown ID"
|
105 |
-
# logger.info(f"Received message from {sender_id}: {message.text}")
|
106 |
-
# # Process the message...
|
107 |
-
# await message.reply_text(f"You said: {message.text}")
|
108 |
-
|
109 |
-
|
110 |
# --- Main Execution ---
|
111 |
if __name__ == '__main__':
|
112 |
-
if
|
113 |
-
|
|
|
114 |
else:
|
115 |
-
logger.warning("Template content is not available.")
|
116 |
|
117 |
logger.info("Starting bot...")
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import os
|
2 |
import requests
|
3 |
import logging
|
4 |
+
import io # Import io for BytesIO
|
5 |
+
|
6 |
from hydrogram import Client, filters
|
7 |
+
from hydrogram.types import Message
|
8 |
|
9 |
# --- Configuration ---
|
|
|
10 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
|
11 |
logger = logging.getLogger(__name__)
|
12 |
|
|
|
|
|
13 |
API_ID = os.environ.get('API_ID')
|
14 |
API_HASH = os.environ.get('API_HASH')
|
15 |
BOT_TOKEN = os.environ.get('BOT_TOKEN')
|
|
|
|
|
16 |
TEMPLATE_URL = "https://mediaflare.adasin.workers.dev/dl/4AmNTDcYQSPNQS"
|
17 |
|
18 |
+
# --- Helper Function to Fetch Template (Handles Binary Content) ---
|
19 |
def fetch_template(url):
|
20 |
+
"""Fetches binary content (like an image) from the template URL."""
|
21 |
logger.info(f"Fetching template from {url}")
|
22 |
try:
|
23 |
+
response = requests.get(url, timeout=10)
|
24 |
+
response.raise_for_status()
|
25 |
+
logger.info(f"Template fetched successfully (Content-Type: {response.headers.get('Content-Type')}).")
|
26 |
+
# Return the raw binary content
|
27 |
+
return response.content
|
28 |
except requests.exceptions.RequestException as e:
|
29 |
logger.error(f"Error fetching template from {url}: {e}")
|
30 |
+
return None
|
31 |
|
32 |
# --- Initialization ---
|
|
|
33 |
if not all([API_ID, API_HASH, BOT_TOKEN]):
|
34 |
logger.error("Missing required environment variables (API_ID, API_HASH, BOT_TOKEN). Ensure they are set in Hugging Face secrets.")
|
35 |
+
exit(1)
|
36 |
|
37 |
try:
|
|
|
38 |
API_ID = int(API_ID)
|
39 |
except ValueError:
|
40 |
logger.error("API_ID environment variable is not a valid integer.")
|
41 |
exit(1)
|
42 |
|
43 |
+
# Fetch the template image content (bytes)
|
44 |
+
template_image_bytes = fetch_template(TEMPLATE_URL)
|
45 |
+
if template_image_bytes is None:
|
46 |
+
logger.warning("Proceeding without template image due to fetch error.")
|
|
|
|
|
47 |
|
48 |
# Initialize the Hydrogram (Pyrogram) client
|
49 |
+
# *** Add workdir='.' to explicitly use the current directory for the session file ***
|
50 |
logger.info("Initializing Hydrogram Client...")
|
51 |
try:
|
|
|
|
|
52 |
app = Client(
|
53 |
+
name="my_bot", # Session file will be my_bot.session
|
54 |
api_id=API_ID,
|
55 |
api_hash=API_HASH,
|
56 |
+
bot_token=BOT_TOKEN,
|
57 |
+
workdir="." # <--- Explicitly set workdir to the current directory
|
|
|
58 |
)
|
59 |
logger.info("Hydrogram Client initialized.")
|
60 |
except Exception as e:
|
61 |
+
# Log the specific exception
|
62 |
+
logger.error(f"Failed to initialize Hydrogram Client: {type(e).__name__} - {e}")
|
63 |
exit(1)
|
64 |
|
65 |
# --- Bot Event Handlers ---
|
66 |
@app.on_message(filters.command("start"))
|
67 |
async def start_handler(client: Client, message: Message):
|
68 |
+
"""Handler for the /start command. Sends the template image if available."""
|
69 |
sender_name = message.from_user.first_name if message.from_user else "User"
|
70 |
sender_id = message.from_user.id if message.from_user else "Unknown ID"
|
71 |
logger.info(f"Received /start command from {sender_name} (ID: {sender_id})")
|
72 |
|
73 |
+
start_message_caption = f"Hello {sender_name}!" # Caption for the photo
|
74 |
+
|
75 |
+
if template_image_bytes:
|
76 |
+
logger.info("Attempting to send template image...")
|
77 |
+
try:
|
78 |
+
# Send the image bytes directly using io.BytesIO
|
79 |
+
await message.reply_photo(
|
80 |
+
photo=io.BytesIO(template_image_bytes),
|
81 |
+
caption=start_message_caption + "\n\nHere's the template image."
|
82 |
+
)
|
83 |
+
logger.info("Template image sent successfully.")
|
84 |
+
except Exception as e:
|
85 |
+
logger.error(f"Failed to send template image: {e}")
|
86 |
+
# Fallback to text message if sending photo fails
|
87 |
+
await message.reply_text(start_message_caption + "\n\n(Could not send the template image due to an error.)")
|
88 |
else:
|
89 |
+
# If template wasn't loaded, just send text
|
90 |
+
await message.reply_text(start_message_caption + "\n\n(Could not load the template image.)")
|
91 |
|
|
|
92 |
|
93 |
@app.on_message(filters.command("help"))
|
94 |
async def help_handler(client: Client, message: Message):
|
|
|
96 |
sender_id = message.from_user.id if message.from_user else "Unknown ID"
|
97 |
logger.info(f"Received /help command from {sender_id}")
|
98 |
await message.reply_text(
|
99 |
+
"This is a sample bot (Hydrogram).\nCommands:\n/start - Show welcome message and template image\n/help - Show this help message"
|
100 |
)
|
101 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
102 |
# --- Main Execution ---
|
103 |
if __name__ == '__main__':
|
104 |
+
if template_image_bytes is not None:
|
105 |
+
# Log that we have image bytes, maybe length
|
106 |
+
logger.info(f"Template image content loaded ({len(template_image_bytes)} bytes).")
|
107 |
else:
|
108 |
+
logger.warning("Template image content is not available.")
|
109 |
|
110 |
logger.info("Starting bot...")
|
111 |
+
try:
|
112 |
+
app.run()
|
113 |
+
except sqlite3.OperationalError as e:
|
114 |
+
# Catch the specific error again if setting workdir didn't help
|
115 |
+
logger.error(f"Caught sqlite3 error during app.run(): {e}. Check filesystem permissions for '.' directory.")
|
116 |
+
# You might try workdir='/data' if '.' doesn't work on HF Spaces specifically
|
117 |
+
logger.error("Consider trying workdir='/data' in Client initialization if '.' is not writable.")
|
118 |
+
except Exception as e:
|
119 |
+
# Catch any other exception during startup/runtime
|
120 |
+
logger.error(f"An unexpected error occurred during app.run(): {type(e).__name__} - {e}")
|
121 |
+
finally:
|
122 |
+
# This might not be reached if app.run() blocks indefinitely,
|
123 |
+
# but good practice if it were to exit cleanly.
|
124 |
+
logger.info("Bot stopped or encountered a fatal error.")
|