├── requirements.txt ├── start.bat ├── img ├── xlr.jpg ├── images_xlr.JPG ├── video_xlr.JPG └── inline_example.jpg ├── README.md ├── LICENSE ├── tt_download_bot.py ├── tt_video.py └── settings.py /requirements.txt: -------------------------------------------------------------------------------- 1 | aiogram==2.25.2 2 | httpx==0.28.1 3 | Pillow 4 | yt-dlp 5 | -------------------------------------------------------------------------------- /start.bat: -------------------------------------------------------------------------------- 1 | pip install -r requirements.txt 2 | py tt_download_bot.py 3 | 4 | pause -------------------------------------------------------------------------------- /img/xlr.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sero01000/tiktok-downloader-bot/HEAD/img/xlr.jpg -------------------------------------------------------------------------------- /img/images_xlr.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sero01000/tiktok-downloader-bot/HEAD/img/images_xlr.JPG -------------------------------------------------------------------------------- /img/video_xlr.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sero01000/tiktok-downloader-bot/HEAD/img/video_xlr.JPG -------------------------------------------------------------------------------- /img/inline_example.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sero01000/tiktok-downloader-bot/HEAD/img/inline_example.jpg -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # yt-dlp version 2 | auto download yt-dlp if not installed 3 | 4 | [![XLR](/img/xlr.jpg)](https://t.me/XLR_TT_BOT) 5 | # tiktok-downloader-bot 6 | A Telegram bot to download videos or images from tiktok without watermark. Try it https://t.me/XLR_TT_BOT 7 | Bot translated into these languagess: ru, en, cn, hi, es, fr, ar, pt, id, pl, cs, de, it, tr, he, uk 8 | 9 | ## Configure and launch bot 10 | - Download or run `git clone https://github.com/sero01000/tiktok-downloader-bot/` 11 | - Edit settings.py - add your `API_TOKEN` 12 | - Run `pip install -r requirements.txt` 13 | - Run `python3 tt_download_bot.py` 14 | 15 | ## Features 16 | ### Inline mode 17 | [![Example](/img/inline_example.jpg)](https://t.me/XLR_TT_BOT) 18 | In inline mode you can pick one(statisctic, music or video) 19 | 20 | ### Default mode 21 | Just send link of tiktok video or image to get video or media group of images 22 | ![ExampleVideo](/img/video_xlr.JPG) 23 | ![ExampleImages](/img/images_xlr.JPG) 24 | 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 sero01000 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tt_download_bot.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import time 3 | import os 4 | 5 | from aiogram import Bot, Dispatcher, executor, types 6 | from aiogram.contrib.fsm_storage.memory import MemoryStorage 7 | from aiogram.types import InlineQuery, InputTextMessageContent, InlineQueryResultArticle, InlineQueryResultVideo, InlineQueryResultAudio 8 | 9 | from re import findall 10 | from httpx import AsyncClient 11 | from hashlib import md5 12 | 13 | from tt_video import tt_videos_or_images, convert_image, divide_chunks, yt_dlp, get_url_of_yt_dlp 14 | from settings import languages, API_TOKEN 15 | 16 | storage = MemoryStorage() 17 | logging.basicConfig(level=logging.INFO) 18 | 19 | # Initialize bot and dispatcher 20 | bot = Bot(token=API_TOKEN) 21 | dp = Dispatcher(bot, storage=storage) 22 | 23 | def is_tool(name): 24 | from shutil import which 25 | 26 | return which(name) is not None 27 | 28 | def get_user_lang(locale): 29 | user_lang = locale.language 30 | if user_lang not in languages: 31 | user_lang = "en" 32 | return user_lang 33 | 34 | 35 | @dp.message_handler(commands=['start', 'help']) 36 | @dp.throttled(rate=2) 37 | async def send_welcome(message: types.Message): 38 | user_lang = get_user_lang(message.from_user.locale) 39 | await message.reply(languages[user_lang]["help"]) 40 | 41 | 42 | @dp.message_handler(regexp='https://\w{1,3}?\.?\w+\.\w{1,3}/') 43 | @dp.throttled(rate=3) 44 | async def tt_download2(message: types.Message): 45 | user_lang = get_user_lang(message.from_user.locale) 46 | 47 | await message.reply(languages[user_lang]["wait"]) 48 | link = findall(r'\bhttps?://.*\w{1,30}\S+', message.text)[0] 49 | 50 | try: 51 | response = await yt_dlp(link) 52 | if response.endswith(".mp3"): 53 | await message.reply_audio(open(response, 'rb'), caption='@XLR_TT_BOT', title=link) 54 | # video 55 | else: 56 | logging.info(f"VIDEO: {response}") 57 | await message.reply_video(open(response, 'rb'), caption='@XLR_TT_BOT',) 58 | os.remove(response) 59 | 60 | except Exception as e: 61 | logging.error(e) 62 | await message.reply(f"error: {e}") 63 | os.remove(response) 64 | 65 | 66 | @dp.message_handler() 67 | @dp.throttled(rate=3) 68 | async def echo(message: types.Message): 69 | user_lang = get_user_lang(message.from_user.locale) 70 | 71 | await message.answer(languages[user_lang]["invalid_link"]) 72 | 73 | 74 | if __name__ == '__main__': 75 | if is_tool("yt-dlp"): 76 | logging.info("yt-dlp installed") 77 | executor.start_polling(dp, skip_updates=True) 78 | else: 79 | logging.error("yt-dlp not installed! Run: sudo apt install yt-dlp") 80 | 81 | -------------------------------------------------------------------------------- /tt_video.py: -------------------------------------------------------------------------------- 1 | from httpx import AsyncClient 2 | 3 | from re import findall 4 | from io import BytesIO 5 | from PIL import Image 6 | from subprocess import check_output, Popen, TimeoutExpired, PIPE 7 | import time 8 | import asyncio 9 | import platform 10 | 11 | 12 | def divide_chunks(list, n): 13 | for i in range(0, len(list), n): 14 | yield list[i:i + n] 15 | 16 | 17 | def convert_image(image, extention): # "JPEG" 18 | byteImgIO = BytesIO() 19 | byteImg = Image.open(BytesIO(image)).convert("RGB") 20 | byteImg.save(byteImgIO, extention) 21 | byteImgIO.seek(0) 22 | return byteImgIO 23 | 24 | def get_url_of_yt_dlp(): 25 | download_url="https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp" 26 | 27 | os = platform.system().lower() 28 | arch = platform.machine().lower(); 29 | if os == None or arch == None: 30 | print(f"Cant detect os({os}) or arch({arch})") 31 | else: 32 | print(os,arch) 33 | if os == "darwin": 34 | return f"{download_url}_macos" 35 | elif os == "windows": 36 | if arch in ["amd64","x86_64"]: 37 | arch=".exe" 38 | elif arch in ["i386","i686"]: 39 | arch="_x86.exe" 40 | else: 41 | return None 42 | return f"{download_url}{arch}" 43 | elif os == "linux": 44 | if arch in ["aarch64","aarch64_be", "armv8b", "armv8l"]: 45 | arch = "_linux_aarch64" 46 | elif arch in ["amd64","x86_64"]: 47 | arch = "_linux" 48 | elif arch == "armv7l": 49 | arch="_linux_armv7l" 50 | else: 51 | return None 52 | return f"{download_url}{arch}" 53 | 54 | # only video or music 55 | # async 56 | async def yt_dlp(url): 57 | proc = await asyncio.create_subprocess_exec( 58 | 'yt-dlp', url, "--max-filesize", "50M", "--max-downloads", "1", "--restrict-filenames",#, "-o", "%(title)s.%(ext)s", 59 | stdout=asyncio.subprocess.PIPE, 60 | stdin=asyncio.subprocess.PIPE, 61 | ) 62 | try: 63 | stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=30) 64 | except asyncio.exceptions.TimeoutError: 65 | try: 66 | proc.kill() 67 | except OSError: 68 | print("timeout no such process") 69 | # Ignore 'no such process' error 70 | pass 71 | raise Exception('timeout') 72 | 73 | for line in stdout.decode("utf-8").splitlines(): 74 | print(line) 75 | filename = findall(r" Destination: (.*?)$", line) 76 | if len(filename) == 0: 77 | filename = findall(r" (.*?) has already been downloaded$", line) 78 | if len(filename) > 0: 79 | filename = filename[0] 80 | print("FOUND") 81 | break 82 | else: 83 | filename = filename[0] 84 | print("FOUND") 85 | break 86 | else: 87 | print("file not found") 88 | raise Exception('file not found') 89 | return filename 90 | 91 | 92 | async def tt_videos_or_images(url): 93 | video_id_from_url = findall('https://www.tiktok.com/@.*?/video/(\d+)', url) 94 | user_agent = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0" 95 | if len(video_id_from_url) > 0: 96 | video_id = video_id_from_url[0] 97 | else: 98 | headers1 = { 99 | "User-Agent": user_agent, 100 | "Accept": "text/html, application/xhtml+xml, application/xml; q=0.9, image/avif, image/webp, */*; q=0.8" 101 | } 102 | 103 | async with AsyncClient() as client: 104 | r1 = await client.get(url, headers=headers1) 105 | print("r1", r1.status_code) 106 | if r1.status_code == 301: 107 | video_id = findall( 108 | 'a href="https://\w{1,3}\.tiktok\.com/(?:@.*?/video|v)/(\d+)', r1.text)[0] 109 | elif r1.status_code == 403: 110 | video_id = findall("video/(\d+)", r1.text)[0] 111 | else: 112 | # raise BaseException('Unknown status code', r1.status_code) 113 | return BaseException('Unknown status code', r1.status_code) 114 | 115 | print("video_id:", video_id) 116 | url2 = f"http://api16-normal-useast5.us.tiktokv.com/aweme/v1/aweme/detail/?aweme_id={video_id}" 117 | async with AsyncClient() as client: 118 | r2 = await client.get(url2, headers={"User-Agent": user_agent}) 119 | print("r2", r2.status_code) 120 | print("r2_headers:", r2.headers) 121 | print("r2_text:", r2.text) 122 | # resp = r2.json() 123 | resp = r2.json().get("aweme_detail") 124 | if resp == None: 125 | # raise BaseException('No video here') 126 | return BaseException('No video here') 127 | 128 | is_video = len(resp["video"]["bit_rate"]) > 0 129 | print("is_video", is_video) 130 | 131 | nickname = resp["author"]["nickname"] 132 | desc = resp["desc"] 133 | statistic = resp["statistics"] 134 | music = resp["music"]["play_url"]["uri"] 135 | if is_video: 136 | cover_url = resp["video"]["origin_cover"]["url_list"][0] 137 | 138 | for bit_rate in resp["video"]["bit_rate"]: 139 | height = bit_rate["play_addr"]["height"] 140 | width = bit_rate["play_addr"]["width"] 141 | data_size = int(bit_rate["play_addr"]["data_size"]) 142 | 143 | url_list = bit_rate["play_addr"]["url_list"] 144 | quality_type = bit_rate["quality_type"] 145 | 146 | if data_size > 19999999: 147 | print("to_large_for_tg", height, "x", width, data_size / 148 | 1000000, "MB", "quality_type:", quality_type) 149 | else: 150 | print("good_for_tg", height, "x", width, data_size / 151 | 1000000, "MB", "quality_type:", quality_type, 152 | "url:", url_list[0]) 153 | videos_url = url_list 154 | large_for_tg = False 155 | break 156 | else: 157 | videos_url = resp["video"]["bit_rate"][0]["play_addr"]["url_list"] 158 | large_for_tg = True 159 | return {"is_video": True, "large_for_tg": large_for_tg, "cover": cover_url, "items": videos_url, "nickname": nickname, "desc": desc, "statistic": statistic, "music": music} 160 | 161 | else: 162 | images_url = [] 163 | images = resp["image_post_info"]["images"] 164 | for i in images: 165 | if len(i["display_image"]["url_list"]) > 0: 166 | images_url.append(i["display_image"]["url_list"][0]) 167 | else: 168 | print("err. images_url 0 len") 169 | return {"is_video": False, "large_for_tg": False, "cover": None, "items": images_url, "nickname": nickname, "desc": desc, "statistic": statistic, "music": music} 170 | -------------------------------------------------------------------------------- /settings.py: -------------------------------------------------------------------------------- 1 | API_TOKEN = "" 2 | 3 | languages = { 4 | "ru": { 5 | "help": "Скачать видео или картинки с тиктока легко😉\nОтправь мне ссылку на видео или картинки.\nЕсли вы заметили ошибки отпишите @phones_parts", 6 | "invalid_link": "Неверная ссылка, пришлите правильную ссылку. Пример:\nhttps://vm.tiktok.com/abcdefg/", 7 | "wait": "Пожалуйста, подождите!\nВаше видео загружается...\nПока загружается видео вы можете подписатся на наш канал @XLRSHOP", 8 | "likes": "Лайков", 9 | "comments": "Коментариев", 10 | "share": "Репостов", 11 | "views": "Просмотров", 12 | "nickname": "Ник", 13 | "large_for_tg": "Вес видео слишком большой для телеграмма(20 МБ лимит), но вы можете скачать видео по ссылке", 14 | }, 15 | "en": { 16 | "help": "Download video or images from tiktok easy\nSend me a link of video.\nIf you see bugs message me @phones_parts", 17 | "invalid_link": "Invalid link, please send the correct link. Example:\nhttps://vm.tiktok.com/XLR_TT_BOT/", 18 | "wait": "Please wait!\nYour video is on the way...", 19 | "likes": "likes", 20 | "comments": "comments", 21 | "share": "share", 22 | "views": "views", 23 | "nickname": "nickname", 24 | "large_for_tg": "video is too large for telegram(20 MB limit), but you can download video by link", 25 | }, 26 | "cn": { 27 | "help": "从抖音下载视频或图片很方便\n从抖音给我发消息。\n如果您发现任何错误,请退订 @phones_parts", 28 | "invalid_link": "链接无效,请发送正确的链接。示例:\nhttps://vm.tiktok.com/abcdefg/", 29 | "wait": "请稍候!\n您的视频正在播放中...", 30 | "likes": "喜欢", 31 | "comments": "注释", 32 | "share": "分享", 33 | "views": "意见", 34 | "nickname": "昵称", 35 | "large_for_tg": "视频对于电报来说太大(20 MB限制),但您可以通过链接下载视频", 36 | }, 37 | "hi": { 38 | "help": "tiktok Easy से वीडियो या चित्र डाउनलोड करें\nमुझे वीडियो का लिंक भेजें।\nयदि आप बग देखते हैं तो मुझे संदेश भेजें @phones_parts", 39 | "invalid_link": "अमान्य लिंक, कृपया सही लिंक भेजें। उदाहरण:\nhttps://vm.tiktok.com/abcdefg/", 40 | "wait": "कृपया प्रतीक्षा करें!\nआपका वीडियो आ रहा है...", 41 | "likes": "पसंद", 42 | "comments": "टिप्पणियाँ", 43 | "share": "हिस्सा", 44 | "views": "विचारों", 45 | "nickname": "खरोंच", 46 | "large_for_tg": "वीडियो टेलीग्राम (20 एमबी सीमा) के लिए बहुत बड़ा है, लेकिन आप लिंक द्वारा वीडियो डाउनलोड कर सकते हैं", 47 | }, 48 | "es": { 49 | "help": "Descargue videos o imágenes de tiktok fácilmente\nEnvíeme un enlace de video.\nSi ve errores, envíeme un mensaje @phones_parts", 50 | "invalid_link": "Enlace no válido, envíe el enlace correcto. Ejemplo:\nhttps://vm.tiktok.com/abcdefg/", 51 | "wait": "¡Por favor, espera!\nTu video está en camino...", 52 | "likes": "likes", 53 | "comments": "टिप्पणियाँ", 54 | "share": "शेयर करना", 55 | "views": "विचारों", 56 | "nickname": "उपनाम", 57 | "large_for_tg": "el video es demasiado grande para telegram (límite de 20 MB), pero puede descargar el video por enlace", 58 | }, 59 | "fr": { 60 | "help": "Téléchargez des vidéos ou des images depuis tiktok easy\nEnvoyez-moi un lien de vidéo.\nSi vous voyez des bugs, envoyez-moi un message @phones_parts", 61 | "invalid_link": "Lien invalide, veuillez envoyer le lien correct. Exemple :\nhttps://vm.tiktok.com/abcdefg/", 62 | "wait": "Veuillez patienter !\nVotre vidéo est en cours d'acheminement...", 63 | "likes": "aime", 64 | "comments": "commentaires", 65 | "share": "partager", 66 | "views": "vues", 67 | "nickname": "surnom", 68 | "large_for_tg": "la vidéo est trop grande pour Telegram (limite de 20 Mo), mais vous pouvez télécharger la vidéo par lien", 69 | }, 70 | "ar": { 71 | "help": "قم بتنزيل الفيديو أو الصور من tiktok easy \ n أرسل لي رابط فيديو. \ n إذا رأيت أخطاء برسالة لي @phones_parts", 72 | "invalid_link": "رابط غير صحيح ، يرجى إرسال الرابط الصحيح. مثال: \ nhttps: //vm.tiktok.com/abcdefg/", 73 | "wait": "الرجاء الانتظار! \ n الفيديو الخاص بك في الطريق ...", 74 | "likes": "الإعجابات", 75 | "comments": "تعليقات", 76 | "share": "شارك", 77 | "views": "الآراء", 78 | "nickname": "اسم الشهرة", 79 | "large_for_tg": "الفيديو كبير جدا بالنسبة ل Telegram (بحد أقصى 20 ميجابايت) ، ولكن يمكنك تنزيل الفيديو عن طريق الرابط", 80 | }, 81 | "pt": { 82 | "help": "Baixe o vídeo ou imagens do tiktok easy\nEnvie-me um link do vídeo.\nSe você ver erros, envie-me uma mensagem @phones_parts", 83 | "invalid_link": "Link inválido, favor enviar o link correto. Exemplo:\nhttps://vm.tiktok.com/abcdefg/", 84 | "wait": "Aguarde!\nSeu vídeo está a caminho...", 85 | "likes": "gosta", 86 | "comments": "comments", 87 | "share": "compartilhar", 88 | "views": "Visualizações", 89 | "nickname": "apelido", 90 | "large_for_tg": "o vídeo é demasiado grande para telegrama (limite de 20 MB), mas você pode baixar vídeo por link", 91 | }, 92 | "id": { 93 | "help": "Unduh video atau gambar dari tiktok dengan mudah\nKirim saya tautan video.\nJika Anda melihat bug, pesan saya @phones_parts", 94 | "invalid_link": "Tautan tidak valid, harap kirim tautan yang benar. Contoh:\nhttps://vm.tiktok.com/abcdefg/", 95 | "wait": "Harap tunggu!\nVideo Anda sedang dalam proses...", 96 | "likes": "suka", 97 | "comments": "", 98 | "share": "komentar", 99 | "views": "dilihat", 100 | "nickname": "nama panggilan", 101 | "large_for_tg": "video terlalu besar untuk telegram (batas 20 MB), tetapi Anda dapat mengunduh video melalui tautan", 102 | }, 103 | 104 | 105 | "pl": { 106 | "help": "Pobierz wideo lub obrazy z tiktok easy\nWyślij mi link do filmu.\nJeśli zobaczysz błąd, wyślij mi wiadomość @phones_parts", 107 | "invalid_link": "Nieprawidłowy link, wyślij prawidłowy link. Przykład:\nhttps://vm.tiktok.com/abcdefg/", 108 | "wait": "Proszę czekać!\nTwój film jest w drodze...", 109 | "likes": "polubienia", 110 | "comments": "komentarze", 111 | "share": "udostępnij", 112 | "views": "wyświetlenia", 113 | "nickname": "przezwisko", 114 | "large_for_tg": "wideo jest za duże dla telegramu (limit 20 MB), ale możesz pobrać wideo przez link", 115 | }, 116 | "cs": { 117 | "help": "Stáhněte si video nebo obrázky z tiktok easy\nPošlete mi odkaz na video.\nPokud uvidíte chyby, napište mi @phones_parts", 118 | "invalid_link": "Neplatný odkaz, pošlete prosím správný odkaz. Příklad:\nhttps://vm.tiktok.com/abcdefg/", 119 | "wait": "Čekejte prosím!\nVaše video je na cestě...", 120 | "likes": "lajky", 121 | "comments": "komentáře", 122 | "share": "sdílet", 123 | "views": "pohledy", 124 | "nickname": "přezdívka", 125 | "large_for_tg": "video je příliš velké pro telegram (limit 20 MB), ale můžete si stáhnout video pomocí odkazu", 126 | }, 127 | "de": { 128 | "help": "Laden Sie Videos oder Bilder von tiktok einfach herunter\nSenden Sie mir einen Video-Link.\nWenn Sie Fehler sehen, senden Sie mir eine Nachricht @phones_parts", 129 | "invalid_link": "Ungültiger Link, bitte senden Sie den richtigen Link. Beispiel:\nhttps://vm.tiktok.com/abcdefg/", 130 | "wait": "Bitte warten!\nIhr Video ist unterwegs...", 131 | "likes": "Likes", 132 | "comments": "Kommentare", 133 | "share": "Teilen", 134 | "views": "Ansichten", 135 | "nickname": "Spitzname", 136 | "large_for_tg": "Video ist zu groß für Telegramm (20 MB Limit), aber Sie können Video über Link herunterladen", 137 | }, 138 | "it": { 139 | "help": "Scarica video o immagini da tiktok easy\nInviami un link al video.\nSe vedi dei bug, inviami un messaggio @phones_parts", 140 | "invalid_link": "Link non valido, inviare il link corretto. Esempio:\nhttps://vm.tiktok.com/abcdefg/", 141 | "wait": "Attendi!\nIl tuo video è in arrivo...", 142 | "likes": "piace", 143 | "comments": "Commenti", 144 | "share": "Condividere", 145 | "views": "visualizzazioni", 146 | "nickname": "soprannome", 147 | "large_for_tg": "il video è troppo grande per telegramma (limite di 20 MB), ma è possibile scaricare video tramite link", 148 | }, 149 | "tr": { 150 | "help": "Tiktok easy'den video veya resim indirin\nBana bir video bağlantısı gönderin.\nHata görürseniz bana mesaj atın @phones_parts", 151 | "invalid_link": "Geçersiz bağlantı, lütfen doğru bağlantıyı gönderin. Örnek:\nhttps://vm.tiktok.com/abcdefg/", 152 | "wait": "Lütfen bekleyin!\nVideonuz yolda...", 153 | "likes": "seviyor", 154 | "comments": "yorumlar", 155 | "share": "Paylaş", 156 | "views": "Görüntüleme", 157 | "nickname": "Takma ad", 158 | "large_for_tg": "video telgraf için çok büyük (20 MB sınırı), ancak videoyu bağlantıyla indirebilirsiniz", 159 | }, 160 | "he": { 161 | "help": "הורד סרטון או תמונות מ-tiktok easy\nשלח לי קישור לסרטון.\nאם אתה רואה באגים שלח לי הודעה @phones_parts", 162 | "invalid_link": "קישור לא חוקי, נא לשלוח את הקישור הנכון. דוגמה:\nhttps://vm.tiktok.com/abcdefg/", 163 | "wait": "אנא המתן!\nהסרטון שלך בדרך...", 164 | "likes": "אוהב", 165 | "comments": "הערות", 166 | "share": "לַחֲלוֹק", 167 | "views": "צפיות", 168 | "nickname": "כינוי", 169 | "large_for_tg": "וידאו גדול מדי עבור מברק (מגבלת 20 MB), אבל אתה יכול להוריד וידאו על ידי קישור", 170 | }, 171 | "uk": { 172 | "help": "Легко завантажуйте відео або зображення з tiktok\nНадішліть мені посилання на відео.\nЯкщо ви бачите помилки, напишіть мені @phones_parts", 173 | "invalid_link": "Недійсне посилання, надішліть правильне посилання. Приклад:\nhttps://vm.tiktok.com/abcdefg/", 174 | "wait": "Будь ласка, зачекайте!\nВаше відео в дорозі...", 175 | "likes": "Лайків", 176 | "comments": "Коментарів", 177 | "share": "Поділитися", 178 | "views": "Переглядів", 179 | "nickname": "Нік", 180 | "large_for_tg": "відео занадто велике для telegram(обмеження в 20 МБ), але ви можете завантажити відео за посиланням", 181 | }, 182 | } 183 | --------------------------------------------------------------------------------