add admin bot
This commit is contained in:
parent
8a20b91c54
commit
2d248b9ce0
10 changed files with 481 additions and 110 deletions
109
bot.py
109
bot.py
|
|
@ -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))
|
||||
|
||||
# Инициализация очереди и запуск воркера
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue