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

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

2
.env.example Normal file
View file

@ -0,0 +1,2 @@
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
TELEGRAM_BOT_USERNAME=vrubelVideoDownload_bot

45
bot.py
View file

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

View file

@ -3,8 +3,11 @@ services:
build: . build: .
container_name: video_download_bot container_name: video_download_bot
restart: unless-stopped restart: unless-stopped
env_file:
- .env
environment: environment:
- TELEGRAM_BOT_TOKEN=8531436675:AAFRoIlqP1PRDy_da3NZQM0L8uQGHtvhTII - TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN}
- TELEGRAM_BOT_USERNAME=${TELEGRAM_BOT_USERNAME}
volumes: volumes:
- ./video:/app/video - ./video:/app/video
- ./instagram_cookies.txt:/app/instagram_cookies.txt - ./instagram_cookies.txt:/app/instagram_cookies.txt