|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
SESSION_STRING = os.environ.get('SESSION_STRING') |
|
|
|
|
|
|
|
|
API_ID = os.environ.get('API_ID') |
|
|
API_HASH = os.environ.get('API_HASH') |
|
|
|
|
|
|
|
|
TARGET_CHANNEL = 'https://t.me/TestNAI01' |
|
|
|
|
|
|
|
|
|
|
|
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.") |
|
|
|
|
|
|
|
|
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. |
|
|
""" |
|
|
|
|
|
file_location = os.path.join(UPLOAD_DIR, file.filename) |
|
|
try: |
|
|
|
|
|
with open(file_location, "wb+") as file_object: |
|
|
file_object.write(file.file.read()) |
|
|
|
|
|
|
|
|
await upload_to_telegram(file_location) |
|
|
return {"message": f"File '{file.filename}' uploaded successfully to Telegram."} |
|
|
finally: |
|
|
|
|
|
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) |