счетчик пользователей и скачанных видео

This commit is contained in:
vrubelroman 2025-12-10 15:14:01 +03:00
parent ae8c7aba93
commit f0e7e93e17
3 changed files with 43 additions and 9 deletions

45
bot.py
View file

@ -17,8 +17,9 @@ logging.basicConfig(
)
logger = logging.getLogger(__name__)
# Токен бота из переменной окружения
# Токен бота и имя бота из переменных окружения
TELEGRAM_BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')
TELEGRAM_BOT_USERNAME = os.getenv('TELEGRAM_BOT_USERNAME', 'vrubelVideoDownload_bot')
# Директория для временных файлов
DOWNLOADS_DIR = Path('video')
@ -32,11 +33,15 @@ def load_stats() -> dict:
if STATS_FILE.exists():
try:
with open(STATS_FILE, 'r', encoding='utf-8') as f:
return json.load(f)
stats = json.load(f)
# Обеспечиваем обратную совместимость
if 'users' not in stats:
stats['users'] = []
return stats
except Exception as e:
logger.error(f"Ошибка при загрузке статистики: {e}")
return {'total_downloads': 0}
return {'total_downloads': 0}
return {'total_downloads': 0, 'users': []}
return {'total_downloads': 0, 'users': []}
def save_stats(stats: dict):
"""Сохраняет статистику в файл"""
@ -53,6 +58,18 @@ def increment_downloads():
save_stats(stats)
logger.info(f"Общее количество скачанных видео: {stats['total_downloads']}")
def add_user(chat_id: int):
"""Добавляет пользователя в список уникальных пользователей"""
stats = load_stats()
users = stats.get('users', [])
# Преобразуем в set для уникальности, затем обратно в list
users_set = set(users)
if chat_id not in users_set:
users_set.add(chat_id)
stats['users'] = list(users_set)
save_stats(stats)
logger.info(f"Добавлен новый пользователь. Всего пользователей: {len(users_set)}")
def detect_video_source(url: str) -> str:
"""Определяет источник видео по URL"""
@ -334,6 +351,9 @@ async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
url = update.message.text.strip()
chat_id = update.message.chat_id
# Добавляем пользователя в статистику при первом взаимодействии
add_user(chat_id)
# Проверяем, является ли сообщение URL
if not (url.startswith('http://') or url.startswith('https://')):
await update.message.reply_text(
@ -364,9 +384,10 @@ async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
await status_message.edit_text("📤 Отправляю видео...")
video_file = open(video_path, 'rb')
caption = f"Видео скачано с @{TELEGRAM_BOT_USERNAME}"
await update.message.reply_video(
video=video_file,
caption="✅ Видео готово!",
caption=caption,
supports_streaming=True
)
video_file.close()
@ -391,6 +412,10 @@ async def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Обрабатывает команду /start"""
# Добавляем пользователя в статистику
chat_id = update.message.chat_id
add_user(chat_id)
await update.message.reply_text(
"👋 Привет! Я бот для скачивания видео.\n\n"
"Просто отправь мне ссылку на видео, и я скачаю его для тебя.\n\n"
@ -408,10 +433,14 @@ async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
async def stat_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Обрабатывает команду /stat"""
stats = load_stats()
total = stats.get('total_downloads', 0)
total_downloads = stats.get('total_downloads', 0)
users = stats.get('users', [])
total_users = len(users)
await update.message.reply_text(
f"📊 Статистика скачанных видео:\n\n"
f"Всего скачано: {total} видео"
f"📊 Статистика бота:\n\n"
f"👥 Всего пользователей: {total_users}\n"
f"📹 Всего скачано видео: {total_downloads}"
)