Added and updated repositories 2026-04-12 13:56:57

This commit is contained in:
github-actions[bot]
2026-04-12 13:56:57 +00:00
parent 7555ea280e
commit 17ae450f8f
19 changed files with 6309 additions and 953 deletions

View File

@@ -1,83 +1,169 @@
# meta developer: @trololo_1
from telethon import events
from .. import utils, loader
import re, asyncio, os
from datetime import datetime
chat = "@TTFullBot"
default_chat = "@SaveAsBot"
MODE_FORWARD = "forward"
MODE_DOWNLOAD = "download"
class TTsaveMod(loader.Module):
"""Save tiktok video"""
strings = {'name': 'TTsaveMod'}
async def client_ready(self, client, db):
self.db = db
async def ttsavecmd(self, message):
""".ttsave {link}"""
"""Save tiktok video"""
strings = {'name': 'TTsaveMod'}
async def client_ready(self, client, db):
self.db = db
self.default_chat = default_chat
if not self.db.get('TTsaveMod', 'chat', False):
self.db.set('TTsaveMod', 'chat', self.default_chat)
args = utils.get_args_raw(message)
async with message.client.conversation(chat) as conv:
await utils.answer(message, 'Скачиваю...')
response1, response2, response3 = [conv.wait_event(events.NewMessage(incoming=True, from_users=chat, chats=chat)) for i in range(3)]
bot_send_link = await message.client.send_message(chat, args)
response1 = await response1
response2 = await response2
response3 = await response3
await response2.download_media("hui.mp4")
await message.client.send_file(message.to_id, "hui.mp4")
await response1.delete()
await response2.delete()
await response3.delete()
await bot_send_link.delete()
await message.delete()
os.remove("hui.mp4")
def _send_mode(self):
m = self.db.get('TTsaveMod', 'send_mode', MODE_FORWARD)
return m if m in (MODE_FORWARD, MODE_DOWNLOAD) else MODE_FORWARD
async def ttacceptcmd(self, message):
""" .ttaccept {reply/id} для открытия в чате автоматического скачивания ссылок. без аргументов тоже работает.\n.ttaccept -l для показа открытых чатов """
async def save_video(self, message, url=None):
"""save video from tiktok. url: ссылка; для .ttsave можно не передавать (берётся из аргументов команды)."""
if url is not None:
args = str(url).strip()
else:
args = utils.get_args_raw(message).strip()
if not args:
await utils.answer(message, "Нет ссылки.")
return False
dest = message.peer_id
chat = self.db.get('TTsaveMod', 'chat')
mode = self._send_mode()
status_msg = await message.respond('Скачиваю...')
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
users_list = self.db.get('TTsaveMod', 'users', [])
async def erase_status():
try:
await status_msg.delete()
except Exception:
pass
if args == '-l':
if len(users_list) == 0: return await utils.answer(message, 'Список пуст.')
return await utils.answer(message, ''+'\n'.join(['<code>'+str(i)+'</code>' for i in users_list]))
try:
async with message.client.conversation(chat) as conv:
bot_send_link = await conv.send_message(args)
response1 = await conv.get_response()
response2 = await conv.get_response()
try:
if not args and not reply:
user = message.chat_id
else:
user = reply.sender_id if not args else int(args)
except:
return await utils.answer(message, 'Неверно введён ид.')
if user in users_list:
users_list.remove(user)
await utils.answer(message, f'Ид <code>{str(user)}</code> исключен.')
else:
users_list.append(user)
await utils.answer(message, f'Ид <code>{str(user)}</code> добавлен.')
self.db.set('TTsaveMod', 'users', users_list)
# Определяем, в каком из response пришло видео
video_response, other_response = None, None
if hasattr(response1, "media") and response1.media is not None:
if getattr(response1.media, "document", None) or getattr(response1.media, "video", None):
video_response = response1
other_response = response2
if video_response is None and hasattr(response2, "media") and response2.media is not None:
if getattr(response2.media, "document", None) or getattr(response2.media, "video", None):
video_response = response2
other_response = response1
if video_response is None:
await erase_status()
await message.respond("Не удалось получить видео.")
await response1.delete()
await response2.delete()
await bot_send_link.delete()
return False
async def watcher(self, message):
try:
users = self.db.get('TTsaveMod', 'users', [])
if message.chat_id not in users: return
links = re.findall(r'((?:https?://)?v[mt]\.tiktok\.com/[A-Za-z0-9_]+/?)', message.raw_text)
if len(links) == 0: return
if mode == MODE_FORWARD:
await video_response.forward_to(dest)
await response1.delete()
await response2.delete()
await bot_send_link.delete()
await erase_status()
return True
async with message.client.conversation(chat) as conv:
for link in links:
response1, response2, response3 = [conv.wait_event(events.NewMessage(incoming=True, from_users=chat, chats=chat)) for i in range(3)]
bot_send_link = await message.client.send_message(chat, link)
response1 = await response1
response2 = await response2
response3 = await response3
await response2.download_media("hui.mp4")
await message.client.send_file(message.chat_id, "hui.mp4")
await response1.delete()
await response2.delete()
await response3.delete()
await bot_send_link.delete()
os.remove("hui.mp4")
await asyncio.sleep(5)
except: pass
now_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
filename = f"{now_time}.mp4"
await video_response.download_media(filename)
await response1.delete()
await response2.delete()
await bot_send_link.delete()
await erase_status()
await message.client.send_file(dest, filename)
os.remove(filename)
return True
except Exception:
await erase_status()
raise
async def setbotcmd(self, message):
"""use: .setbot чтобы установить бота для скачивания."""
args = utils.get_args_raw(message)
try:
bot = await message.client.get_entity(args)
except:
return await utils.answer(message, f"<b>бот не найден.</b>")
self.db.set('TTsaveMod', 'bot', str(bot.id))
await utils.answer(message, f"<b>бот <code>{bot.username}</code> установлен.</b>")
async def ttsendmodecmd(self, message):
""".ttsendmode forward|download — пересылка с бота (по умолчанию) или скачивание и отправка. Без аргументов — текущий режим."""
raw = (utils.get_args_raw(message) or "").strip().lower()
if not raw:
cur = self._send_mode()
tip = "пересылка с бота" if cur == MODE_FORWARD else "скачивание и отправка"
return await utils.answer(
message,
f"<b>Сейчас:</b> {tip}\n<code>.ttsendmode forward|download</code>",
)
if raw in ("forward", "пересылка", "fwd", "f"):
self.db.set("TTsaveMod", "send_mode", MODE_FORWARD)
return await utils.answer(message, "<b>Режим:</b> пересылка с бота.")
if raw in ("download", "скачивание", "скачать", "dl", "d"):
self.db.set("TTsaveMod", "send_mode", MODE_DOWNLOAD)
return await utils.answer(message, "<b>Режим:</b> скачивание и отправка.")
return await utils.answer(message, "<code>.ttsendmode forward|download</code>")
async def ttsavecmd(self, message):
""".ttsave {link}"""
args = utils.get_args_raw(message)
save_video = await self.save_video(message)
if save_video:
if self._send_mode() == MODE_FORWARD:
await utils.answer(message, "<b>видео переслано.</b>")
else:
await utils.answer(message, "<b>видео успешно отправлено.</b>")
else:
await utils.answer(message, "<b>не удалось скачать видео.</b>")
async def ttacceptcmd(self, message):
""" .ttaccept {reply/id} для открытия в чате автоматического скачивания ссылок. без аргументов тоже работает.\n.ttaccept -l для показа открытых чатов """
args = utils.get_args_raw(message)
reply = await message.get_reply_message()
users_list = self.db.get('TTsaveMod', 'users', [])
if args == '-l':
if len(users_list) == 0: return await utils.answer(message, 'Список пуст.')
return await utils.answer(message, ''+'\n'.join(['<code>'+str(i)+'</code>' for i in users_list]))
try:
if not args and not reply:
user = message.chat_id
else:
user = reply.sender_id if not args else int(args)
except:
return await utils.answer(message, 'Неверно введён ид.')
if user in users_list:
users_list.remove(user)
await utils.answer(message, f'Ид <code>{str(user)}</code> исключен.')
else:
users_list.append(user)
await utils.answer(message, f'Ид <code>{str(user)}</code> добавлен.')
self.db.set('TTsaveMod', 'users', users_list)
async def watcher(self, message):
try:
users = self.db.get('TTsaveMod', 'users', [])
if message.chat_id not in users: return
links = re.findall(r'((?:https?://)?v[mt]\.tiktok\.com/[A-Za-z0-9_]+/?)', message.raw_text)
if len(links) == 0: return
for link in links:
await self.save_video(message, url=link)
await asyncio.sleep(5)
except Exception:
pass