File size: 2,593 Bytes
36c8357
9636743
36c8357
 
9636743
36c8357
9636743
36c8357
 
 
 
 
 
 
aa32e01
 
 
36c8357
9636743
36c8357
9636743
36c8357
9636743
36c8357
9636743
36c8357
9636743
36c8357
9636743
36c8357
9636743
36c8357
 
aa32e01
36c8357
9636743
36c8357
 
9636743
36c8357
aa32e01
36c8357
 
 
aa32e01
9636743
aa32e01
 
 
9636743
aa32e01
36c8357
 
9636743
aa32e01
 
 
9636743
aa32e01
36c8357
aa32e01
9636743
36c8357
aa32e01
 
36c8357
9636743
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"""
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 <url>`", 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 <tiktok_url>` 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 <tiktok_url>`", 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()