TikTok Video Downloader Bot Это Telegram-бот, который позволяет скачивать видео из TikTok, отправляя ссылку на пост. Бот обрабатывает ссылки вида https://vt.tiktok.com/... или https://www.tiktok.com/... и возвращает видео прямо в чат. Функциональность скачивания фотографий из TikTok не поддерживается. Возможности Скачивание видео из TikTok по прямой ссылке. Возможность добавления своих функций в код. Ограничения Бот не поддерживает скачивание фотографий из TikTok. Требования Python 3.8+ Библиотеки: aiogram, requests, beautifulsoup4 Установите зависимости с помощью: pip install aiogram requests beautifulsoup4 Конфигурация Создайте бота через @BotFather в Telegram и получите токен. Вставьте токен в файл config.py , заменив пустую строку в переменной TOKEN: TOKEN = "ВАШ_ТОКЕН" Использование Найдите видео в TikTok и скопируйте ссылку. Отправьте ссылку боту в Telegram. Бот ответит сообщением "Downloading..." и отправит видео если у него получится его скачать. Если ссылка некорректна или видео не найдено, бот сообщит об ошибке. GitHub страница Сам код main.py import asyncio from aiogram import Bot, Dispatcher from aiogram.enums import ParseMode from config import TOKEN from handlers import register_handlers async def main(): bot = Bot(token=TOKEN, parse_mode=ParseMode.HTML) dp = Dispatcher() register_handlers(dp) await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main()) Python import asyncio from aiogram import Bot, Dispatcher from aiogram.enums import ParseMode from config import TOKEN from handlers import register_handlers async def main(): bot = Bot(token=TOKEN, parse_mode=ParseMode.HTML) dp = Dispatcher() register_handlers(dp) await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main()) utils.py from bs4 import BeautifulSoup import requests import logging def extract_media_urls(tiktok_url: str, headers: dict) -> tuple[str | None, list[str]]: try: response = requests.post( "https://ssstik.io/abc?url=dl", headers=headers, data={"id": tiktok_url, "locale": "en", "tt": "123"}, timeout=10 ) if response.status_code != 200: logging.warning(f"Bad response from ssstik.io: {response.status_code}") return None, [] soup = BeautifulSoup(response.text, "html.parser") video_link = soup.find("a", class_="pure-button") if video_link and "href" in video_link.attrs: href = video_link["href"] video_url = "https://ssstik.io" + href if href.startswith("/") else href return video_url, [] photo_div = soup.find("div", class_="image-cards") if photo_div: photo_urls = [img["src"] for img in photo_div.find_all("img") if "src" in img.attrs] return None, photo_urls return None, [] except Exception as e: logging.exception("Error extracting media URLs") return None, [] Python from bs4 import BeautifulSoup import requests import logging def extract_media_urls(tiktok_url: str, headers: dict) -> tuple[str | None, list[str]]: try: response = requests.post( "https://ssstik.io/abc?url=dl", headers=headers, data={"id": tiktok_url, "locale": "en", "tt": "123"}, timeout=10 ) if response.status_code != 200: logging.warning(f"Bad response from ssstik.io: {response.status_code}") return None, [] soup = BeautifulSoup(response.text, "html.parser") video_link = soup.find("a", class_="pure-button") if video_link and "href" in video_link.attrs: href = video_link["href"] video_url = "https://ssstik.io" + href if href.startswith("/") else href return video_url, [] photo_div = soup.find("div", class_="image-cards") if photo_div: photo_urls = [img["src"] for img in photo_div.find_all("img") if "src" in img.attrs] return None, photo_urls return None, [] except Exception as e: logging.exception("Error extracting media URLs") return None, [] handlers.py from aiogram import Dispatcher, F from aiogram.types import Message from config import TIKTOK_LINK_PATTERN, HEADERS from utils import extract_media_urls from downloader import download_and_send_media def register_handlers(dp: Dispatcher): @dp.message(F.text.regexp(TIKTOK_LINK_PATTERN)) async def tiktok_handler(message: Message): tiktok_url = message.text.strip() await message.reply("Downloading...") video_url, photo_urls = extract_media_urls(tiktok_url, HEADERS) if not video_url and not photo_urls: await message.reply("Cannot find media") return await download_and_send_media(video_url, photo_urls, message, HEADERS) @dp.message() async def fallback_handler(message: Message): await message.reply("Send a TikTok link") Python from aiogram import Dispatcher, F from aiogram.types import Message from config import TIKTOK_LINK_PATTERN, HEADERS from utils import extract_media_urls from downloader import download_and_send_media def register_handlers(dp: Dispatcher): @dp.message(F.text.regexp(TIKTOK_LINK_PATTERN)) async def tiktok_handler(message: Message): tiktok_url = message.text.strip() await message.reply("Downloading...") video_url, photo_urls = extract_media_urls(tiktok_url, HEADERS) if not video_url and not photo_urls: await message.reply("Cannot find media") return await download_and_send_media(video_url, photo_urls, message, HEADERS) @dp.message() async def fallback_handler(message: Message): await message.reply("Send a TikTok link") downloader.py import requests from aiogram.types import BufferedInputFile, InputMediaPhoto import logging async def download_and_send_media(video_url: str | None, photo_urls: list[str], message, headers: dict): try: if video_url: response = requests.get(video_url, headers=headers, timeout=15) if response.status_code == 200: video_data = response.content await message.reply_video( video=BufferedInputFile(video_data, filename="tiktok.mp4"), caption="Разработано devai.digital" ) else: await message.reply(f"Cannot download video (code: {response.status_code})") elif photo_urls: media_group = [] for url in photo_urls: response = requests.get(url, headers=headers, timeout=10) if response.status_code == 200: photo_data = response.content media_group.append( InputMediaPhoto(media=BufferedInputFile(photo_data, filename="tiktok.jpg")) ) if media_group: await message.reply_media_group(media_group) await message.reply("Разработано devai.digital") else: await message.reply(" Не удалось скачать фотографии") else: await message.reply(" Медиа не найдено") except Exception as e: logging.exception("Error downloading media") await message.reply(f" Ошибка: {str(e)}") Python import requests from aiogram.types import BufferedInputFile, InputMediaPhoto import logging async def download_and_send_media(video_url: str | None, photo_urls: list[str], message, headers: dict): try: if video_url: response = requests.get(video_url, headers=headers, timeout=15) if response.status_code == 200: video_data = response.content await message.reply_video( video=BufferedInputFile(video_data, filename="tiktok.mp4"), caption="Разработано devai.digital" ) else: await message.reply(f"Cannot download video (code: {response.status_code})") elif photo_urls: media_group = [] for url in photo_urls: response = requests.get(url, headers=headers, timeout=10) if response.status_code == 200: photo_data = response.content media_group.append( InputMediaPhoto(media=BufferedInputFile(photo_data, filename="tiktok.jpg")) ) if media_group: await message.reply_media_group(media_group) await message.reply("Разработано devai.digital") else: await message.reply(" Не удалось скачать фотографии") else: await message.reply(" Медиа не найдено") except Exception as e: logging.exception("Error downloading media") await message.reply(f" Ошибка: {str(e)}") config.py import logging import re logging.basicConfig(level=logging.INFO) TOKEN = "" HEADERS = { "User-Agent": ( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/91.0.4472.124 Safari/537.36" ) } TIKTOK_LINK_PATTERN = re.compile(r"https?://(vt\.tiktok\.com|www\.tiktok\.com)/\S+") Python import logging import re logging.basicConfig(level=logging.INFO) TOKEN = "" HEADERS = { "User-Agent": ( "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/91.0.4472.124 Safari/537.36" ) } TIKTOK_LINK_PATTERN = re.compile(r"https?://(vt\.tiktok\.com|www\.tiktok\.com)/\S+")