Download app.py from Cxops/Push: direct link, hf CLI and curl.
- Browser
- Download file 5.66 kB
-
https://huggingface.co/spaces/Cxops/Push/resolve/main/app.py
- Command line
-
hf download hf://spaces/Cxops/Push/app.py
-
curl -L -o app.py https://huggingface.co/spaces/Cxops/Push/resolve/main/app.py
5.66 kB
| import os | |
| import tempfile | |
| import shutil | |
| import threading | |
| import time | |
| import requests | |
| from flask import Flask | |
| from pyrogram import Client, filters | |
| from pyrogram.types import InlineKeyboardMarkup, InlineKeyboardButton | |
| from huggingface_hub import HfApi, hf_hub_download | |
| # ========================= | |
| # CONFIG | |
| # ========================= | |
| API_ID = int(os.environ["API_ID"]) | |
| API_HASH = os.environ["API_HASH"] | |
| BOT_TOKEN = os.environ["BOT_TOKEN"] | |
| HF_TOKEN = os.environ["HF_TOKEN"] | |
| DATASET_REPO = "Cxops/Bzxv" | |
| # ✅ FIXED: correct Space runtime URL (IMPORTANT) | |
| KEEP_ALIVE_URL = "https://cxops-push.hf.space/" | |
| PING_INTERVAL = 300 # 5 minutes | |
| # ========================= | |
| # FLASK HEALTH SERVER | |
| # ========================= | |
| web = Flask(__name__) | |
| def home(): | |
| return "Bot Running..." | |
| def run_web(): | |
| web.run(host="0.0.0.0", port=7860) | |
| # ========================= | |
| # KEEP ALIVE PINGER | |
| # ========================= | |
| def keep_alive(): | |
| headers = { | |
| "User-Agent": "Mozilla/5.0 (KeepAliveBot)" | |
| } | |
| while True: | |
| try: | |
| r = requests.get(KEEP_ALIVE_URL, headers=headers, timeout=20) | |
| print(f"[KEEPALIVE] Pinged {KEEP_ALIVE_URL} | Status: {r.status_code}") | |
| except Exception as e: | |
| print(f"[KEEPALIVE ERROR] {e}") | |
| time.sleep(PING_INTERVAL) | |
| # ========================= | |
| # HUGGINGFACE | |
| # ========================= | |
| hf = HfApi(token=HF_TOKEN) | |
| # ========================= | |
| # PYROGRAM BOT | |
| # ========================= | |
| app = Client( | |
| "storage_bot", | |
| api_id=API_ID, | |
| api_hash=API_HASH, | |
| bot_token=BOT_TOKEN | |
| ) | |
| # ========================= | |
| # CLEANUP HELPER | |
| # ========================= | |
| def cleanup(path): | |
| try: | |
| if os.path.isdir(path): | |
| shutil.rmtree(path, ignore_errors=True) | |
| elif os.path.isfile(path): | |
| os.remove(path) | |
| except Exception: | |
| pass | |
| # ========================= | |
| # COMMANDS | |
| # ========================= | |
| async def start(_, message): | |
| await message.reply_text( | |
| "Send me a file.\n\n" | |
| "/files - List uploaded files" | |
| ) | |
| async def files(_, message): | |
| user_id = str(message.from_user.id) | |
| try: | |
| repo_files = hf.list_repo_files( | |
| repo_id=DATASET_REPO, | |
| repo_type="dataset" | |
| ) | |
| user_files = [ | |
| f for f in repo_files | |
| if f.startswith(f"{user_id}/") | |
| ] | |
| if not user_files: | |
| return await message.reply_text("You have no uploaded files.") | |
| buttons = [ | |
| [ | |
| InlineKeyboardButton( | |
| os.path.basename(path)[:60], | |
| callback_data=f"get:{path}" | |
| ) | |
| ] | |
| for path in user_files | |
| ] | |
| await message.reply_text( | |
| "Your uploaded files:", | |
| reply_markup=InlineKeyboardMarkup(buttons) | |
| ) | |
| except Exception as e: | |
| await message.reply_text(f"Error:\n{e}") | |
| # ========================= | |
| # DOWNLOAD FROM HF | |
| # ========================= | |
| async def get_file(_, query): | |
| path = query.data.replace("get:", "") | |
| temp_dir = tempfile.mkdtemp() | |
| try: | |
| await query.message.edit_text("Downloading from dataset...") | |
| local_file = hf_hub_download( | |
| repo_id=DATASET_REPO, | |
| repo_type="dataset", | |
| filename=path, | |
| token=HF_TOKEN, | |
| local_dir=temp_dir | |
| ) | |
| await query.message.reply_document( | |
| local_file, | |
| caption=os.path.basename(path) | |
| ) | |
| try: | |
| await query.message.delete() | |
| except Exception: | |
| pass | |
| except Exception as e: | |
| await query.message.reply_text(f"Error:\n{e}") | |
| finally: | |
| cleanup(temp_dir) | |
| # ========================= | |
| # FILE UPLOAD HANDLER | |
| # ========================= | |
| async def upload_file(_, message): | |
| temp_dir = tempfile.mkdtemp() | |
| try: | |
| status = await message.reply_text("Downloading file...") | |
| if message.document: | |
| media = message.document | |
| filename = media.file_name | |
| elif message.video: | |
| media = message.video | |
| filename = media.file_name or f"{media.file_unique_id}.mp4" | |
| elif message.audio: | |
| media = message.audio | |
| filename = media.file_name or f"{media.file_unique_id}.mp3" | |
| else: | |
| media = message.photo[-1] | |
| filename = f"{media.file_unique_id}.jpg" | |
| local_path = await message.download( | |
| file_name=os.path.join(temp_dir, filename) | |
| ) | |
| await status.edit_text("Uploading to Hugging Face...") | |
| repo_path = f"{message.from_user.id}/{filename}" | |
| hf.upload_file( | |
| path_or_fileobj=local_path, | |
| path_in_repo=repo_path, | |
| repo_id=DATASET_REPO, | |
| repo_type="dataset" | |
| ) | |
| await status.edit_text(f"Uploaded successfully.\n\n{filename}") | |
| except Exception as e: | |
| await message.reply_text(f"Upload failed:\n{e}") | |
| finally: | |
| cleanup(temp_dir) | |
| # ========================= | |
| # MAIN | |
| # ========================= | |
| if __name__ == "__main__": | |
| print("Starting Flask health server...") | |
| threading.Thread(target=run_web, daemon=True).start() | |
| print("Starting Keep-Alive Pinger...") | |
| threading.Thread(target=keep_alive, daemon=True).start() | |
| print("Starting Telegram bot...") | |
| app.run() |