Подсчёт медиафайлов и реакций к ним Telegram API

Рейтинг: 0Ответов: 1Опубликовано: 10.03.2023

Я новичёк в Python хотел создать бота, который счиает количество отправленных фото и видео в канал записывая их в бд, если пользователь2 ставит реакцию 👍👎 на фото или видео пользователя1, то в бд записывается количество лайков и дизлайков к данной записи, после основываясь на их количестве расчитывает рейтинг пользователя

import pymongo
import telebot

# Подключаемся к базе данных MongoDB
try:
    mongo_client = pymongo.MongoClient('mongodb_url')
    db = mongo_client["pipBoy"]
    if "users" not in db.list_collection_names():
        db.create_collection("users")
    user_collection = db["users"]
    print("Подключение к бд, успешно!")
except pymongo.errors.PyMongoError as e:
    print(f"Ошибка подключения к базе данных: {e}")

bot = telebot.TeleBot('TOKEN_Bot')

@bot.message_handler(content_types=['photo', 'video'])
def handle_media(message):
    user_id = message.from_user.id
    media_type = message.content_type
    file_id = message.photo[-1].file_id if media_type == 'photo' else message.video.file_id
    user_collection = db['users']
    user = user_collection.find_one({'user_id': user_id})
    if user:
        user_collection.update_one({'user_id': user_id}, {'$inc': {f'{media_type}s_count': 1}})
    else:
        user_collection.insert_one({'user_id': user_id, f'{media_type}s_count': 1, 'likes_count': 0, 'dislikes_count': 0})

        # Fetch reactions for the media message
        chat_member = bot.get_chat_member(chat_id=message.chat.id, user_id=user_id)
        reactions = chat_member.get('user', {}).get('is_bot') and bot.get_chat_member(chat_id=message.chat.id, user_id=user_id).get('user').get('is_bot')
        if reactions:
            reaction_count = len([reaction for reaction in reactions if reaction.get('user', {}).get('is_bot') == False and reaction['type'] == 'like'])
            user_collection.update_one({'user_id': user_id}, {'$inc': {'likes_count': reaction_count}})
            
            # Update reactions in the database
            for reaction in reactions:
                if reaction.get('user', {}).get('is_bot'):
                    continue
                reaction_user_id = reaction['user']['id']
                if reaction['type'] == 'like':
                    user_collection.update_one({'user_id': reaction_user_id}, {'$inc': {'likes_count': 1}})
                elif reaction['type'] == 'dislike':
                    user_collection.update_one({'user_id': reaction_user_id}, {'$inc': {'dislikes_count': 1}})


    # Calculate rating
    rating = []
    for user in user_collection.find():
        user_id = user['user_id']
        photo_count = user.get('photo_count', 0)
        video_count = user.get('video_count', 0)
        like_count = user.get('likes_count', 0)
        dislike_count = user.get('dislikes_count', 0)
        rating.append((user_id, photo_count, video_count, like_count, dislike_count))
    rating.sort(key=lambda x: (-x[1], -x[2], -x[3], x[4]))

    rating_text = ''
    for i, r in enumerate(rating[:10]):
        user_id, photo_count, video_count, like_count, dislike_count = r
        user = bot.get_chat_member(chat_id=message.chat.id, user_id=user_id).user
        username = user.username if user.username else f"{user.first_name} {user.last_name}"
        rating_text += f'{i + 1}. {username} ({photo_count} photos, {video_count} videos, {like_count} likes, {dislike_count} dislikes)\n'

    bot.send_message(message.chat.id, f'Rating:\n{rating_text}')

bot.polling(none_stop=True)

Ответы

▲ 0

Я могу предложить такой код с учетом небольших доработок, если какие-то сообщения вам не нужны, можете подредактировать код под себя

import pymongo
import telebot

# Подключаемся к базе данных MongoDB
try:
    mongo_client = pymongo.MongoClient('mongodb_url')
    db = mongo_client["pipBoy"]
    if "users" not in db.list_collection_names():
        db.create_collection("users")
    user_collection = db["users"]
    print("Подключение к бд, успешно!")
except pymongo.errors.PyMongoError as e:
    print(f"Ошибка подключения к базе данных: {e}")

bot = telebot.TeleBot('TOKEN_Bot')

@bot.message_handler(content_types=['photo', 'video'])
def handle_media(message):
    user_id = message.from_user.id
    media_type = message.content_type
    file_id = message.photo[-1].file_id if media_type == 'photo' else message.video.file_id
    user_collection = db['users']
    user = user_collection.find_one({'user_id': user_id})
    if user:
        user_collection.update_one({'user_id': user_id}, {'$inc': {f'{media_type}s_count': 1}})
    else:
        user_collection.insert_one({'user_id': user_id, f'{media_type}s_count': 1, 'likes_count': 0, 'dislikes_count': 0})

    # Fetch reactions for the media message
    chat_member = bot.get_chat_member(chat_id=message.chat.id, user_id=bot.id)
    reactions = chat_member.get('user', {}).get('is_bot') and bot.get_chat_member(chat_id=message.chat.id, user_id=user_id).get('user').get('is_bot')
    if reactions:
        reaction_count = len([reaction for reaction in reactions if reaction.get('user', {}).get('is_bot') == False and reaction['type'] in ['like', 'dislike']])
        user_collection.update_one({'user_id': user_id}, {'$inc': {'likes_count': reaction_count}})
            
        # Update reactions in the database
        for reaction in reactions:
            if reaction.get('user', {}).get('is_bot'):
                continue
            reaction_user_id = reaction['user']['id']
            if reaction['type'] == 'like':
                user_collection.update_one({'user_id': reaction_user_id}, {'$inc': {'likes_count': 1}})
            elif reaction['type'] == 'dislike':
                user_collection.update_one({'user_id': reaction_user_id}, {'$inc': {'dislikes_count': 1}})

    # Calculate rating
    rating = []
    for user in user_collection.find():
        user_id = user['user_id']
        photo_count = user.get('photo_count', 0)
        video_count = user.get('video_count', 0)
        like_count = user.get('likes_count', 0)
        dislike_count = user.get('dislikes_count', 0)
        rating.append((user_id, photo_count, video_count, like_count, dislike_count))
    rating.sort(key=lambda x: (-x[3], x[4], -x[1], -x[2]))

    rating_text = ''
    for i, r in enumerate(rating[:10]):
        user_id, photo_count, video_count, like_count, dislike_count = r
        user = bot.get_chat_member(chat_id=message.chat.id, user_id=user_id).user
        username = user.username if user.username else f"{user.first_name} {user.last_name}"
        rating_text += f'{i + 1}. {username} ({photo_count} photos, {video_count} videos, {like_count} likes, {dislike_count