""" TikTok Downloader Bot - Telegram Bot Only """ import os import asyncio import logging import tempfile import yt_dlp from pyrogram import Client, filters from pyrogram.enums import ParseMode logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) API_ID = os.getenv('API_ID') API_HASH = os.getenv('API_HASH') BOT_TOKEN = os.getenv('BOT_TOKEN') logger.info(f"Bot starting...") app = Client("TikTokDownloaderBot", api_id=API_ID, api_hash=API_HASH, bot_token=BOT_TOKEN) @app.on_message(filters.command("start") & filters.private) async def start_handler(client, message): await message.reply_text("šŸ‘‹ **Welcome!**\n\nSend TikTok link with `/tt `", parse_mode=ParseMode.MARKDOWN) @app.on_message(filters.command("help") & filters.private) async def help_handler(client, message): await message.reply_text("šŸ“– **Help:**\n\nSend `/tt ` to download video.", parse_mode=ParseMode.MARKDOWN) @app.on_message(filters.command("tt") & filters.private) async def download_handler(client, message): if len(message.command) < 2: await message.reply_text("āŒ Usage: `/tt `", parse_mode=ParseMode.MARKDOWN) return url = message.command[1] status_msg = await message.reply_text("šŸ” Searching...") try: await status_msg.edit("šŸ“” Fetching info...") ydl_opts = {'quiet': True, 'extract_flat': False} with yt_dlp.YoutubeDL(ydl_opts) as ydl: info = ydl.extract_info(url, download=False) title, views, duration = info.get('title','Video'), info.get('view_count',0), info.get('duration',0) await status_msg.edit("ā¬‡ļø Downloading...") out_file = tempfile.NamedTemporaryFile(suffix='.mp4', delete=False) out_file.close() ydl_opts = {"format": "mp4", "outtmpl": out_file.name, "quiet": True} with yt_dlp.YoutubeDL(ydl_opts) as ydl: ydl.download([url]) await status_msg.edit("ā¬†ļø Uploading...") dur = f"{int(duration//60)}:{int(duration%60):02d}" if duration else "N/A" caption = f"šŸŽµ {title}\nšŸ‘ļø {views:,} views\nā±ļø {dur}\nšŸ”— [Link]({url})" await message.reply_video(video=out_file.name, caption=caption, parse_mode=ParseMode.MARKDOWN) await status_msg.delete() os.remove(out_file.name) except Exception as e: logger.error(f"Error: {e}") await status_msg.edit(f"āŒ Error: {str(e)}", parse_mode=ParseMode.MARKDOWN) logger.info("šŸ¤– Starting Telegram bot...") app.run()