import os import asyncio from telethon.sync import TelegramClient from telethon.sessions import StringSession from fastapi import FastAPI, UploadFile, File, HTTPException from fastapi.responses import FileResponse import uvicorn import tempfile # Import the tempfile module # --- Configuration from environment variables --- # Your Telegram session string SESSION_STRING = os.environ.get('SESSION_STRING') # You MUST get your own API ID and HASH from my.telegram.org API_ID = os.environ.get('API_ID') API_HASH = os.environ.get('API_HASH') # The Telegram channel you want to upload files to TARGET_CHANNEL = 'https://t.me/TestNAI01' # --- FIX: Use the system's temporary directory --- # This directory is guaranteed to be writable and avoids permission errors. UPLOAD_DIR = tempfile.gettempdir() app = FastAPI() async def upload_to_telegram(file_path: str): """ Uploads a file to the specified Telegram channel using a session string. """ if not all([SESSION_STRING, API_ID, API_HASH]): raise ValueError("SESSION_STRING, API_ID, and API_HASH must be set as environment variables.") # Initialize the client async with TelegramClient(StringSession(SESSION_STRING), API_ID, API_HASH) as client: try: await client.send_file(TARGET_CHANNEL, file_path) except Exception as e: raise HTTPException(status_code=500, detail=f"Failed to upload to Telegram: {e}") @app.post("/v1/upload") async def upload_file(file: UploadFile = File(...)): """ Receives a file, saves it to the temp directory, and uploads it to the Telegram channel. """ # Create a secure path in the temporary directory file_location = os.path.join(UPLOAD_DIR, file.filename) try: # Save the uploaded file temporarily with open(file_location, "wb+") as file_object: file_object.write(file.file.read()) # Upload the file to Telegram await upload_to_telegram(file_location) return {"message": f"File '{file.filename}' uploaded successfully to Telegram."} finally: # Clean up the local file after uploading to save space if os.path.exists(file_location): os.remove(file_location) @app.get("/v1/download/{filename}") async def download_file(filename: str): """ Serves a file for download. NOTE: This endpoint is for demonstration. It looks for files in the temp directory, but files uploaded in previous requests will have been deleted. A production system would need a proper way to retrieve files from Telegram. """ file_path = os.path.join(UPLOAD_DIR, filename) if os.path.exists(file_path): return FileResponse(file_path) raise HTTPException(status_code=404, detail="File not found. Files are only stored temporarily during upload.") if __name__ == "__main__": if not all([SESSION_STRING, API_ID, API_HASH]): print("FATAL ERROR: The environment variables SESSION_STRING, API_ID, and API_HASH must be set.") else: uvicorn.run(app, host="0.0.0.0", port=8000)