Подсчёт медиафайлов и реакций к ним Telegram API
Я новичёк в 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)
Источник: Stack Overflow на русском