Добро пожаловать! Игровой форум WLUX.NET - Игры, Читы, Скрипты, Статьи, Софт, Курсы.

Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям. После регистрации и входа в систему вы сможете создавать темы, публиковать ответы на существующие темы, повышать репутацию участников, скачивать вложения и файлы и многое, многое другое. Так чего же вы ждете?

Добро пожаловать гость!

Приветствуем вас на нашем форуме! Мы очень рады вас видеть и с большим удовольствием поделимся всей информацией нашего форума!

Мы уважаем своих пользователей и так же ждем от вас приятного общения.

Система наград, ежедневное пополнения тем!

Общайся, получай награды.

Статьи, гайды, софт

У нас вы можете скачать бесплатно читы для игр. Полезные гайды на любые темы и схемы заработка. Есть раздел халявы!

FAQ по форуму

Не понимаю, как и что тут работает у вас?!Как создавать темы, писать сообщения, как получать реакции. Почему не засчитывает сообщения. Все ответы здесь

  • Добро пожаловать на сайт - wlux.net!

    FAQ по форуму

    1. Все сообщения до группы местный проходят модерацию от 1 минуты до 24 часа

    2. Сообщения учитываються в следующих разделах: Читать

    3.Что-бы скачать вложение нужно 2 сообщения.

    4.Личные переписки работают только с Администрацией форума

    5. Запрещено: Просить скрытый текст , спам, реклама, скам, ддос, кардинг и другая чернуха, нарушать любые законы РФ/СНГ = бан аккаунта

    6. Внимание! Мы не удаляем аккаунты с форума! Будьте внимательны ДО регистрации! Как удалить аккаунт на форуме?!

    5.Не понимаю, как и что тут работает у вас?!Как создавать темы, писать сообщения, как получать реакции. Почему не засчитывает сообщения. Все ответы здесь

python Исходник Бот для скачивания видео с TikTok, Instagram и YouTube Shorts

A Оффлайн

awi

Участник
LV
2
 
18.09.2024
12
4
19
Награды
3
25

Репутация:

Telegram-бота для скачивания видео с популярных платформ, таких как YouTube, Instagram и TikTok. Бот предоставляет пользователям возможность загружать видео по ссылке, а также включает административную панель для управления ботом и мониторинга статистики.

Функционал

Для пользователей:

  • Скачивание видео: Пользователи могут отправлять ссылки на видео с YouTube, Instagram и TikTok, и бот загрузит видео в формате MP4.
  • Ограничение запросов: Бот автоматически ограничивает количество запросов от одного пользователя, чтобы предотвратить злоупотребление.
  • Уведомления о блокировке: Если пользователь заблокирован администратором, он получит соответствующее уведомление.
Для администраторов:
  • Статистика: Просмотр статистики по новым пользователям, количеству загрузок и общему числу пользователей за день, месяц или год.
  • Управление пользователями: Блокировка и разблокировка пользователей.
  • Управление платформами: Отключать или включать загрузку видео с определенных платформ (YouTube, Instagram, TikTok).
  • Очистка папки загрузок: Возможность вручную очищать папку с загруженными файлами.
  • Очистка логов Возможность очистки логов бота.
  • Выключение бота: Администраторы могут корректно завершить работу бота.

Для работы разгрузки YouTube Shorts необходим файл куки. Файл должен находится в том же месте что и скрипт.
куки можно получить с помощью расширения "Get cookies.txt LOCALLY".
Так же для работы скрипта не забудьте внести токены ботов и свой id в файл token.env. Файл должен находится в том же месте что и скрипт.


# Обновляемся
sudo apt update && sudo apt upgrade -y

# Установка Python и pip
sudo apt install python3 python3-pip -y

# Установка venv для создания виртуального окружения
sudo apt install python3.12-venv -y

# Создаем виртуальное окружение
python3 -m venv bot_env

# Активируем виртуальное окружение
source bot_env/bin/activate

# Установка библиотек (устанавливать только в виртуально окружении)
pip install pyTelegramBotAPI yt-dlp
pip install aiohttp
pip install matplotlib
pip install Python-dotenv
pip install schedule

# Установка FFmpeg для обработки видео
sudo apt install ffmpeg -y

# Подготовка скрипта бота
sudo nano instagram_

Пожалуйста, войдите или зерегистрируйтесь, чтобы увидеть скрытый текст.



# Запустите бота
python instagram_

Пожалуйста, войдите или зерегистрируйтесь, чтобы увидеть скрытый текст.

bot:
import os
import json
import logging
from datetime import datetime, date, timedelta
from collections import defaultdict
from threading import Thread
import time
import requests
from telebot import TeleBot, apihelper, types
from yt_dlp import YoutubeDL
from dotenv import load_dotenv
import schedule  # Для планирования задач

# Загрузка переменных окружения из файла token.env
load_dotenv("token.env")

# Настройка логирования
logging.basicConfig(filename='bot.log', level=logging.INFO)
logger = logging.getLogger(__name__)

# Токены Telegram-ботов из переменных окружения
USER_BOT_TOKEN = os.getenv('USER_BOT_TOKEN')
ADMIN_BOT_TOKEN = os.getenv('ADMIN_BOT_TOKEN')

# ID администраторов из переменных окружения
ADMIN_IDS = set(map(int, os.getenv('ADMIN_IDS', '').split(',')))  # Пример: ADMIN_IDS=123456789,987654321

user_bot = TeleBot(USER_BOT_TOKEN)
admin_bot = TeleBot(ADMIN_BOT_TOKEN)

# Увеличиваем таймаут для запросов
apihelper.READ_TIMEOUT = 60  # Таймаут на чтение
apihelper.CONNECT_TIMEOUT = 60  # Таймаут на подключение

# Настройки
DOWNLOAD_DIR = './downloads'
STATISTICS_FILE = './statistics.json'
COOKIES = './www.youtube.com_cookies.txt'  # Файл cookies для YouTube
os.makedirs(DOWNLOAD_DIR, exist_ok=True)

# Структура статистики
statistics = {
    'new_users': defaultdict(int),
    'downloads': defaultdict(lambda: {'youtube': 0, 'instagram': 0, 'tiktok': 0}),
    'total_users': set(),
    'blocked_users': set()
}

# Словарь для хранения времени блокировки пользователей
user_timeouts = {}

# Словарь для подсчета количества запросов от пользователя
user_request_count = defaultdict(int)

# Словарь для хранения времени последнего сообщения от пользователя
last_message_time = {}

# Словарь для управления отключенными платформами
disabled_platforms = {
    'instagram': False,
    'tiktok': False,
    'youtube': False
}

# Загрузка статистики из файла
if os.path.exists(STATISTICS_FILE):
    try:
        with open(STATISTICS_FILE, 'r') as f:
            loaded_data = json.load(f)
            statistics['new_users'] = defaultdict(int, loaded_data.get('new_users', {}))
            statistics['downloads'] = defaultdict(lambda: {'youtube': 0, 'instagram': 0, 'tiktok': 0}, loaded_data.get('downloads', {}))
            statistics['total_users'] = set(loaded_data.get('total_users', []))
            statistics['blocked_users'] = set(loaded_data.get('blocked_users', []))
    except (json.JSONDecodeError, ValueError) as e:
        logger.error(f"Ошибка загрузки JSON: {e}. Создаём новый файл.")
        statistics = {
            'new_users': defaultdict(int),
            'downloads': defaultdict(lambda: {'youtube': 0, 'instagram': 0, 'tiktok': 0}),
            'total_users': set(),
            'blocked_users': set()
        }
        with open(STATISTICS_FILE, 'w') as f:
            json.dump({
                'new_users': {},
                'downloads': {},
                'total_users': [],
                'blocked_users': []
            }, f)
else:
    # Если файл отсутствует, создаём новую структуру данных
    with open(STATISTICS_FILE, 'w') as f:
        json.dump({
            'new_users': {},
            'downloads': {},
            'total_users': [],
            'blocked_users': []
        }, f)

# Сохранение статистики в файл
def save_statistics():
    with open(STATISTICS_FILE, 'w') as f:
        json.dump({
            'new_users': statistics['new_users'],
            'downloads': statistics['downloads'],
            'total_users': list(statistics['total_users']),
            'blocked_users': list(statistics['blocked_users'])
        }, f)

# Вспомогательная функция для обновления статистики
def update_statistics(user_id, platform=None):
    today = datetime.now().date().strftime("%Y-%m-%d")
    if user_id not in statistics['total_users']:
        statistics['new_users'][today] += 1
        statistics['total_users'].add(user_id)
    if platform:
        statistics['downloads'][today][platform] += 1
    save_statistics()

# Функция проверки заблокированного пользователя
def is_blocked(user_id):
    return user_id in statistics['blocked_users']

# Функция для отправки видео с повторными попытками
def send_video_with_retry(chat_id, file_path, caption, retries=3):
    for attempt in range(retries):
        try:
            with open(file_path, 'rb') as video:
                new_caption = "Рад был помочь! Ваш, @username_bot"  # Замените @username_bot на имя вашего бота
                user_bot.send_video(chat_id, video, supports_streaming=True, caption=new_caption)
            return True
        except Exception as e:
            logger.error(f"Ошибка при отправке видео (попытка {attempt + 1}): {e}")
            time.sleep(5)  # Ждем 5 секунд перед повторной попыткой
    return False

# Функция для проверки и установки таймаута
def check_user_timeout(user_id, message):
    now = datetime.now()
    if user_id in user_timeouts:
        timeout_end = user_timeouts[user_id]
        if now < timeout_end:
            # Пользователь в таймауте
            remaining_time = (timeout_end - now).seconds
            # Увеличиваем таймаут в два раза при каждом новом сообщении
            new_timeout_duration = remaining_time * 2
            user_timeouts[user_id] = now + timedelta(seconds=new_timeout_duration)
            user_bot.reply_to(message, f"Слишком много запросов. Пожалуйста, подождите {new_timeout_duration} секунд.")
            return True
        else:
            # Таймаут истек, сбрасываем счетчик
            del user_timeouts[user_id]
            user_request_count[user_id] = 0
    return False

# Функция для удаления всех файлов из папки downloads
def clear_downloads_folder():
    for filename in os.listdir(DOWNLOAD_DIR):
        file_path = os.path.join(DOWNLOAD_DIR, filename)
        try:
            if os.path.isfile(file_path) or os.path.islink(file_path):
                os.unlink(file_path)
                logger.info(f"Удален файл: {file_path}")
        except Exception as e:
            logger.error(f"Ошибка при удалении файла {file_path}: {e}")

# Функция для планирования очистки папки downloads в 00:00 по Москве
def schedule_cleanup():
    schedule.every().day.at("00:00").do(clear_downloads_folder)
    while True:
        schedule.run_pending()
        time.sleep(1)

# Основной бот для пользователей
@user_bot.message_handler(commands=['start'])
def user_start(message):
    logger.info(f"Received /start command from user {message.chat.id}")
    if is_blocked(message.chat.id):
        user_bot.reply_to(message, "Вы заблокированы и не можете пользоваться ботом.")
        return
    user_bot.reply_to(message, "Привет! Я бот для скачивания видео с YouTube, Instagram и TikTok. Просто отправь мне ссылку на видео, и я скачаю его для тебя.")

@user_bot.message_handler(content_types=['text'])
def user_download(message):
    user_id = message.chat.id
    logger.info(f"Received message from user {user_id}: {message.text}")

    # Сохраняем время последнего сообщения
    last_message_time[user_id] = datetime.now()

    # Проверяем, находится ли пользователь в таймауте
    if check_user_timeout(user_id, message):
        # Игнорируем сообщения, отправленные во время таймаута
        if user_id in user_timeouts:
            timeout_end = user_timeouts[user_id]
            if last_message_time[user_id] < timeout_end:
                logger.info(f"Сообщение от пользователя {user_id} проигнорировано (таймаут).")
                return
        return

    if is_blocked(user_id):
        user_bot.reply_to(message, "Вы заблокированы и не можете пользоваться ботом.")
        return

    url = message.text.strip()
    if not url.startswith(('http://', 'https://')):
        user_bot.reply_to(message, "Пожалуйста, отправьте корректную ссылку.")
        return

    platform = None
    if 'youtube.com' in url or 'youtu.be' in url:
        platform = 'youtube'
        if disabled_platforms['youtube']:
            user_bot.reply_to(message, "Сервис YouTube временно недоступен. Пожалуйста, попробуйте позже.")
            return
    elif 'instagram.com' in url:
        platform = 'instagram'
        if disabled_platforms['instagram']:
            user_bot.reply_to(message, "Сервис Instagram временно недоступен. Пожалуйста, попробуйте позже.")
            return
    elif 'tiktok.com' in url:
        platform = 'tiktok'
        if disabled_platforms['tiktok']:
            user_bot.reply_to(message, "Сервис TikTok временно недоступен. Пожалуйста, попробуйте позже.")
            return
    else:
        user_bot.reply_to(message, "Ссылка не поддерживается.")
        return

    # Увеличиваем счетчик запросов
    user_request_count[user_id] += 1

    # Если пользователь отправил более 3 ссылок подряд, устанавливаем таймаут
    if user_request_count[user_id] > 3:
        # Увеличиваем таймаут в два раза при каждом новом спаме
        timeout_duration = 15 * (2 ** (user_request_count[user_id] - 4))  # Увеличиваем таймаут в 2 раза
        user_timeouts[user_id] = datetime.now() + timedelta(seconds=timeout_duration)
        user_bot.reply_to(message, f"Слишком много запросов. Пожалуйста, подождите {timeout_duration} секунд.")
        return

    user_bot.reply_to(message, "Загружаю видео, подождите немного...")

    try:
        # Параметры для yt-dlp
        ydl_opts = {
            'format': 'bestvideo[height<=1080]+bestaudio/best',  # Выбираем лучшее качество до 1080p
            'outtmpl': f'{DOWNLOAD_DIR}/%(title)s.%(ext)s',
            'merge_output_format': 'mp4',
            'cookiefile': COOKIES,  # Используем файл cookies для авторизации
            'extractor_args': {
                'youtube': {
                    'visitor_data': 'YOUR_VISITOR_DATA_HERE',  # Замените на актуальные данные
                },
            },
            'postprocessors': [{'key': 'FFmpegVideoConvertor', 'preferedformat': 'mp4'}],
        }
        with YoutubeDL(ydl_opts) as ydl:
            info = ydl.extract_info(url, download=True)
            file_path = ydl.prepare_filename(info)

        # Отправка файла с повторными попытками
        if not send_video_with_retry(message.chat.id, file_path, f"Видео: {info['title']}"):
            user_bot.reply_to(message, "Не удалось отправить видео. Попробуйте позже.")

        # Удаляем файл после отправки
        try:
            os.remove(file_path)
            logger.info(f"Файл {file_path} успешно удален.")
        except Exception as e:
            logger.error(f"Ошибка при удалении файла {file_path}: {e}")

        update_statistics(message.chat.id, platform)

    except Exception as e:
        logger.error(f"Ошибка при загрузке видео: {e}")
        if "Unable to extract video url" in str(e):
            user_bot.reply_to(message, "Для загрузки этого видео требуется авторизация в Instagram. Пожалуйста, попробуйте другую ссылку.")
        else:
            user_bot.reply_to(message, "Не удалось загрузить видео. Пожалуйста, проверьте ссылку и попробуйте снова.")

# Администраторский бот
@admin_bot.message_handler(commands=['start'])
def admin_start(message):
    if message.chat.id not in ADMIN_IDS:
        admin_bot.reply_to(message, "У вас нет доступа к админ-панели.")
        return

    markup = types.ReplyKeyboardMarkup(row_width=2)
    markup.add(types.KeyboardButton("Пользователи"))
    markup.add(types.KeyboardButton("Статистика"))
    markup.add(types.KeyboardButton("Серверная"))
    admin_bot.send_message(message.chat.id, "Добро пожаловать в панель администратора! Выберите раздел:", reply_markup=markup)

@admin_bot.message_handler(func=lambda message: message.text == "Пользователи")
def users_menu(message):
    markup = types.ReplyKeyboardMarkup(row_width=2)
    markup.add(types.KeyboardButton("Заблокированные пользователи"))
    markup.add(types.KeyboardButton("Заблокировать"))
    markup.add(types.KeyboardButton("Разблокировать"))
    markup.add(types.KeyboardButton("Назад"))
    admin_bot.send_message(message.chat.id, "Выберите действие:", reply_markup=markup)

@admin_bot.message_handler(func=lambda message: message.text == "Заблокированные пользователи")
def blocked_users(message):
    if not statistics['blocked_users']:
        admin_bot.reply_to(message, "Нет заблокированных пользователей.")
        return
    blocked_list = "\n".join([f"{user_id}" for user_id in statistics['blocked_users']])
    admin_bot.reply_to(message, f"Заблокированные пользователи:\n{blocked_list}")

@admin_bot.message_handler(func=lambda message: message.text == "Заблокировать")
def block_user_command(message):
    admin_bot.send_message(message.chat.id, "Введите ID пользователя для блокировки:")
    admin_bot.register_next_step_handler(message, block_user_handler)

@admin_bot.message_handler(func=lambda message: message.text == "Разблокировать")
def unblock_user_command(message):
    admin_bot.send_message(message.chat.id, "Введите ID пользователя для разблокировки:")
    admin_bot.register_next_step_handler(message, unblock_user_handler)

@admin_bot.message_handler(func=lambda message: message.text == "Статистика")
def stats_menu(message):
    markup = types.ReplyKeyboardMarkup(row_width=2)
    markup.add(types.KeyboardButton("За месяц"))
    markup.add(types.KeyboardButton("За год"))
    markup.add(types.KeyboardButton("За день"))
    markup.add(types.KeyboardButton("Назад"))
    admin_bot.send_message(message.chat.id, "Выберите период:", reply_markup=markup)

@admin_bot.message_handler(func=lambda message: message.text in ["За месяц", "За год", "За день"])
def stats_command(message):
    period = message.text  # Используем текст напрямую, так как кнопки уже содержат правильный текст

    today = datetime.now().date().strftime("%Y-%m-%d")

    if period == 'За день':
        start_date = today
    elif period == 'За месяц':
        start_date = datetime.now().date().replace(day=1).strftime("%Y-%m-%d")
    elif period == 'За год':
        start_date = datetime.now().date().replace(month=1, day=1).strftime("%Y-%m-%d")
    else:
        admin_bot.reply_to(message, "Неверный период. Используйте: 'За месяц', 'За год', 'За день'.")
        return

    new_users = sum(count for date, count in statistics['new_users'].items() if date >= start_date)
    downloads = {
        'youtube': sum(stat['youtube'] for date, stat in statistics['downloads'].items() if date >= start_date),
        'instagram': sum(stat['instagram'] for date, stat in statistics['downloads'].items() if date >= start_date),
        'tiktok': sum(stat['tiktok'] for date, stat in statistics['downloads'].items() if date >= start_date),
    }
    total_users = len(statistics['total_users'])

    admin_bot.send_message(message.chat.id, (
        f"Статистика за {period}:\n"
        f"Новые пользователи: {new_users}\n"
        f"Загрузки: YouTube - {downloads['youtube']}, Instagram - {downloads['instagram']}, TikTok - {downloads['tiktok']}\n"
        f"Всего пользователей: {total_users}"
    ))

@admin_bot.message_handler(func=lambda message: message.text == "Серверная")
def server_menu(message):
    markup = types.ReplyKeyboardMarkup(row_width=2)
    markup.add(types.KeyboardButton("Просмотр папки загрузки"))
    markup.add(types.KeyboardButton("Очистка папки загрузки"))
    markup.add(types.KeyboardButton("Управление платформами"))
    markup.add(types.KeyboardButton("Выключить бота"))
    markup.add(types.KeyboardButton("Очистка логов"))
    markup.add(types.KeyboardButton("Назад"))
    admin_bot.send_message(message.chat.id, "Выберите действие:", reply_markup=markup)

@admin_bot.message_handler(func=lambda message: message.text == "Управление платформами")
def manage_platforms_menu(message):
    markup = types.ReplyKeyboardMarkup(row_width=2)
    if disabled_platforms['instagram']:
        markup.add(types.KeyboardButton("Включить Instagram"))
    else:
        markup.add(types.KeyboardButton("Отключить Instagram"))
    if disabled_platforms['tiktok']:
        markup.add(types.KeyboardButton("Включить TikTok"))
    else:
        markup.add(types.KeyboardButton("Отключить TikTok"))
    if disabled_platforms['youtube']:
        markup.add(types.KeyboardButton("Включить YouTube"))
    else:
        markup.add(types.KeyboardButton("Отключить YouTube"))
    markup.add(types.KeyboardButton("Отключить все"))
    markup.add(types.KeyboardButton("Включить все"))
    markup.add(types.KeyboardButton("Назад"))
    admin_bot.send_message(message.chat.id, "Управление платформами:", reply_markup=markup)

@admin_bot.message_handler(func=lambda message: message.text == "Отключить Instagram")
def disable_instagram(message):
    disabled_platforms['instagram'] = True
    admin_bot.reply_to(message, "Instagram отключен. Пользователи будут получать уведомление о технических работах.")
    manage_platforms_menu(message)  # Обновляем меню

@admin_bot.message_handler(func=lambda message: message.text == "Включить Instagram")
def enable_instagram(message):
    disabled_platforms['instagram'] = False
    admin_bot.reply_to(message, "Instagram включен. Пользователи могут снова загружать видео с Instagram.")
    manage_platforms_menu(message)  # Обновляем меню

@admin_bot.message_handler(func=lambda message: message.text == "Отключить TikTok")
def disable_tiktok(message):
    disabled_platforms['tiktok'] = True
    admin_bot.reply_to(message, "TikTok отключен. Пользователи будут получать уведомление о технических работах.")
    manage_platforms_menu(message)  # Обновляем меню

@admin_bot.message_handler(func=lambda message: message.text == "Включить TikTok")
def enable_tiktok(message):
    disabled_platforms['tiktok'] = False
    admin_bot.reply_to(message, "TikTok включен. Пользователи могут снова загружать видео с TikTok.")
    manage_platforms_menu(message)  # Обновляем меню

@admin_bot.message_handler(func=lambda message: message.text == "Отключить YouTube")
def disable_youtube(message):
    disabled_platforms['youtube'] = True
    admin_bot.reply_to(message, "YouTube отключен. Пользователи будут получать уведомление о технических работах.")
    manage_platforms_menu(message)  # Обновляем меню

@admin_bot.message_handler(func=lambda message: message.text == "Включить YouTube")
def enable_youtube(message):
    disabled_platforms['youtube'] = False
    admin_bot.reply_to(message, "YouTube включен. Пользователи могут снова загружать видео с YouTube.")
    manage_platforms_menu(message)  # Обновляем меню

@admin_bot.message_handler(func=lambda message: message.text == "Отключить все")
def disable_all_platforms(message):
    for platform in disabled_platforms:
        disabled_platforms[platform] = True
    admin_bot.reply_to(message, "Все платформы отключены. Пользователи будут получать уведомление о технических работах.")
    manage_platforms_menu(message)  # Обновляем меню

@admin_bot.message_handler(func=lambda message: message.text == "Включить все")
def enable_all_platforms(message):
    for platform in disabled_platforms:
        disabled_platforms[platform] = False
    admin_bot.reply_to(message, "Все платформы включены.")
    manage_platforms_menu(message)  # Обновляем меню

@admin_bot.message_handler(func=lambda message: message.text == "Просмотр папки загрузки")
def view_downloads_folder(message):
    files = os.listdir(DOWNLOAD_DIR)
    file_count = len(files)
    admin_bot.reply_to(message, f"В папке загрузки находится {file_count} файлов.")

@admin_bot.message_handler(func=lambda message: message.text == "Очистка папки загрузки")
def clear_downloads_folder_command(message):
    clear_downloads_folder()
    admin_bot.reply_to(message, "Папка загрузки очищена.")

@admin_bot.message_handler(func=lambda message: message.text == "Выключить бота")
def shutdown_bot(message):
    admin_bot.reply_to(message, "Бот выключается...")
    os._exit(0)  # Корректное завершение работы бота

@admin_bot.message_handler(func=lambda message: message.text == "Очистка логов")
def clear_logs(message):
    with open('bot.log', 'w') as f:
        f.write('')
    admin_bot.reply_to(message, "Логи очищены.")

@admin_bot.message_handler(func=lambda message: message.text == "Назад")
def back_to_main_menu(message):
    admin_start(message)

def block_user_handler(message):
    try:
        user_id = int(message.text.strip())
        statistics['blocked_users'].add(user_id)
        save_statistics()
        admin_bot.reply_to(message, f"Пользователь {user_id} заблокирован.")
        # Уведомление пользователю
        user_bot.send_message(user_id, "Вы были заблокированы администратором.")
    except ValueError:
        admin_bot.reply_to(message, "Укажите корректный ID пользователя.")

def unblock_user_handler(message):
    try:
        user_id = int(message.text.strip())
        if user_id in statistics['blocked_users']:
            statistics['blocked_users'].remove(user_id)
            save_statistics()
            admin_bot.reply_to(message, f"Пользователь {user_id} разблокирован.")
            # Уведомление пользователю
            user_bot.send_message(user_id, "Вы были разблокированы администратором.")
        else:
            admin_bot.reply_to(message, f"Пользователь {user_id} не был заблокирован.")
    except ValueError:
        admin_bot.reply_to(message, "Укажите корректный ID пользователя.")

# Запуск ботов с повторными попытками
def start_user_bot():
    while True:
        try:
            user_bot.polling(timeout=60)  # Увеличиваем таймаут до 60 секунд
        except (requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout) as e:
            logger.error(f"Ошибка соединения в user_bot: {e}. Повторная попытка через 10 секунд...")
            time.sleep(10)

def start_admin_bot():
    while True:
        try:
            admin_bot.polling(timeout=60)  # Увеличиваем таймаут до 60 секунд
        except (requests.exceptions.ConnectionError, requests.exceptions.ReadTimeout) as e:
            logger.error(f"Ошибка соединения в admin_bot: {e}. Повторная попытка через 10 секунд...")
            time.sleep(10)

# Запуск планировщика для очистки папки downloads
def start_scheduler():
    schedule_cleanup()

# Запуск всех потоков
Thread(target=start_user_bot).start()
Thread(target=start_admin_bot).start()
Thread(target=start_scheduler).start()
token.env:
# Токен Telegram-бота
USER_BOT_TOKEN=токен_вашего_бота

# Токен админского бота (если используется)
ADMIN_BOT_TOKEN=токен_вашего_бота

# ID администраторов (через запятую)
ADMIN_IDS=id_вашего_аккаунта

Пожалуйста, войдите или зерегистрируйтесь, чтобы увидеть скрытый текст.

 
P Оффлайн

pp11

Местный
Участник
LV
2
 
24.12.2024
35
0
15
Награды
3
25

Репутация:

благодарю за возможность скачивать видосы без костылей
 
A Оффлайн

abobaas121

Участник
LV
0
 
09.01.2025
26
0
7
Награды
2
44

Репутация:

Спасибо за способ надо попробовать
 
antonphd1 Оффлайн

antonphd1

Участник
LV
2
 
07.12.2024
30
0
16
Награды
3
35

Репутация:

Проверил, работает, большое спасибо
 
A Оффлайн

awi

Участник
LV
2
 
18.09.2024
12
4
19
Награды
3
25

Репутация:

Обновил скрипт.
Добавил возможность загрузки видео с постов Twitter (X) и загрузки аудио со Spotify


Скрытое содержимое доступно для зарегистрированных пользователей!
 

Поиск по форуму

Похожие темы:

shape1
shape2
shape3
shape4
shape7
shape8
Верх