add admin bot

This commit is contained in:
vrubel 2025-12-20 22:17:20 +03:00
parent 8a20b91c54
commit 2d248b9ce0
10 changed files with 481 additions and 110 deletions

109
bot.py
View file

@ -9,7 +9,7 @@ from urllib.parse import urlparse
from datetime import datetime
import httpx
from telegram import Update, Message
from telegram import Update, Message, Bot
from telegram.ext import Application, MessageHandler, filters, ContextTypes, CommandHandler, Defaults
from telegram.request import HTTPXRequest
from dataclasses import dataclass
@ -30,6 +30,9 @@ logger = logging.getLogger(__name__)
TELEGRAM_BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')
TELEGRAM_BOT_USERNAME = os.getenv('TELEGRAM_BOT_USERNAME', 'vrubelVideoDownload_bot')
# Токен админ бота
ADMIN_BOT_TOKEN = os.getenv('ADMIN_BOT_TOKEN')
# URL сервисов для скачивания видео
YOUTUBE_DOWNLOADER_URL = os.getenv('YOUTUBE_DOWNLOADER_URL', 'http://localhost:5557')
INSTAGRAM_DOWNLOADER_URL = os.getenv('INSTAGRAM_DOWNLOADER_URL', 'http://localhost:5556')
@ -408,6 +411,73 @@ def cleanup_old_files():
logger.error(f"Ошибка при очистке .part файлов: {e}")
def get_admin_chat_id() -> int | None:
"""Получает сохраненный chat_id админа из файла"""
try:
admin_chat_id_file = DATA_DIR / 'admin_chat_id.txt'
if admin_chat_id_file.exists():
with open(admin_chat_id_file, 'r') as f:
chat_id = f.read().strip()
if chat_id:
return int(chat_id)
except Exception as e:
logger.error(f"Ошибка при чтении chat_id админа: {e}")
return None
async def send_video_to_admin_bot(video_path: str, url: str, from_user=None):
"""Отправляет копию видео админ боту"""
if not ADMIN_BOT_TOKEN:
return # Админ бот не настроен, пропускаем
# Получаем chat_id админа из файла
admin_chat_id = get_admin_chat_id()
if not admin_chat_id:
logger.debug("Админ chat_id не найден, пропускаю отправку видео")
return
try:
# Создаем бота для отправки
request = HTTPXRequest(
read_timeout=600,
write_timeout=600,
connect_timeout=60,
pool_timeout=60
)
admin_bot = Bot(token=ADMIN_BOT_TOKEN, request=request)
# Формируем информацию о пользователе
user_info = ""
if from_user:
username = f"@{from_user.username}" if from_user.username else "без username"
user_info = f"Пользователь: {username} (ID: {from_user.id})"
if from_user.first_name:
user_info += f", {from_user.first_name}"
# Формируем подпись
caption = f"📥 Видео скачано пользователем\n\n🔗 URL: {url}"
if user_info:
caption += f"\n👤 {user_info}"
# Отправляем видео
with open(video_path, 'rb') as video_file:
await admin_bot.send_video(
chat_id=admin_chat_id,
video=video_file,
caption=caption,
supports_streaming=True,
read_timeout=600,
write_timeout=600,
connect_timeout=60,
pool_timeout=60
)
logger.info(f"Видео отправлено админ боту: {video_path}")
except Exception as e:
logger.error(f"Ошибка при отправке видео админ боту: {e}")
# ============================================================================
# СИСТЕМА ОЧЕРЕДЕЙ
# ============================================================================
@ -494,6 +564,9 @@ async def process_queue_item(item: QueueItem):
logger.info(f"Видео сохранено: {video_path}")
# Отправляем копию видео админ боту
await send_video_to_admin_bot(video_path, item.url, item.original_message.from_user)
# Удаляем статусное сообщение и исходное сообщение со ссылкой
try:
await item.status_message.delete()
@ -964,39 +1037,6 @@ async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text(get_text(locale, 'start'))
async def stat_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Обрабатывает команду /stat"""
language_code = update.message.from_user.language_code if update.message.from_user else None
locale = get_locale_from_language_code(language_code)
total_downloads = get_total_downloads()
total_users = get_total_users()
error_stats = get_error_stats()
# Форматируем статистику ошибок
error_stats_text = ""
service_names = {
'youtube': 'YouTube',
'instagram': 'Instagram',
'tiktok': 'TikTok',
'vk': 'VK',
'yapfiles': 'Yapfiles',
'unknown': 'Unknown'
}
for service, count in sorted(error_stats.items()):
if count > 0:
service_name = service_names.get(service, service)
error_stats_text += f"{service_name}: {count}\n"
if not error_stats_text:
error_stats_text = " Нет ошибок" if locale == 'ru' else " No errors"
await update.message.reply_text(
get_text(locale, 'stat', users=total_users, downloads=total_downloads, error_stats=error_stats_text.strip())
)
async def support_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Обрабатывает команду /support"""
language_code = update.message.from_user.language_code if update.message.from_user else None
@ -1043,7 +1083,6 @@ def main():
# Регистрируем обработчики
application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))
application.add_handler(CommandHandler("start", start_command))
application.add_handler(CommandHandler("stat", stat_command))
application.add_handler(CommandHandler("support", support_command))
# Инициализация очереди и запуск воркера