Система репутации в Telegram
Сегодня я расскажу, как можно создать собственную систему репутации с Telegram на Python. Решение будет легким и красивым, обещаю.
Контекст
Telegram набирает популярность, а поэтому в нем все чаще создаются чаты, которые выполняют функцию форумов по той или иной теме.
Я думаю, каждый сталкивался с следующей проблемой:
Задаешь вопрос или спрашиваешь совет в каком-то telegram чате и получаешь несколько ответов. В такой ситуации всегда задаешься вопросами: «Кому из ответивших поверить больше?», «Ему можно доверять?».
Настоящие сайты-форумы решили эту проблему добавив систему репутации (или «вес»). Но так как telegram создавался не как форум, на первый взгляд, в нем это можно реализовать только следующим образом:
Создаем бота, который запоминает баллы каждого участника.
С помощью команд можно добавить баллы.
Чтобы увидеть баллы автора ответа придется прописать команды на каждого ответившего.
Жирным шрифтом я выделил, как мне кажется, самый огромный минус такой системы.
Я считаю, будешь не очень красиво выглядеть, если ты ответил на вопрос, а перед твоим носом разглядывают твой профиль, и только потом вступают в диалог.
Моя идея решения этой проблемы
Не так давно Telegram добавил «должности» для администраторов.
При назначении человека администратором, ему можно выдать должность (далее я буду называть это «префикс»).
И далее этот префикс будет выглядеть следующим образом:
Моя идея в том, чтобы бот автоматически добавлял пользователя в администраторы, выдавал префикс с его баллами и отбирал все админ-права.
Таким образом пользователь будет иметь префикс с его баллами, но останется при своих обычных правах.
Реализация на Python
внизу есть ссылка на код, выложенным на github
Писать telegram бота будем на python, с помощью библиотеки aiogram.
Импортируем все нужные библиотеки:
import os
import json
import asyncio
#aiogram==2.25.1
from aiogram.utils import executor
from aiogram import Bot, Dispatcher, types
from aiogram.types import ChatAdministratorRights
from aiogram.contrib.middlewares.logging import LoggingMiddleware
Получаем telegram token для бота. Это делается очень легко, можете загуглить или поискать в telegram docs.
Вставляем свой token:
bot = Bot(token=твой_токен)
dp = Dispatcher(bot)
dp.middleware.setup(LoggingMiddleware())
Создадим словарь для хранения баллов.
user_points = {}
Добавим команду для добавления балла за ответ.
Добавить балл можно будет, ответив на сообщение, за который вы хотите повысить репутацию ответившему.
if not message.reply_to_message:
await message.reply("Чтобы добавить балл, ответьте на сообщение человека.")
Добавляем балл, если в нашем словаре такой пользователь уже есть, иначе добавляем его в словарь.
target_user_id = message.reply_to_message.from_user.id
if user_points.get(target_user_id) is not None:
user_points[target_user_id] += 1
else:
user_points[target_user_id] = 1
Теперь самое главное — добавляем пользователя в администраторы:
member_status = await bot.get_chat_member(message.chat.id, target_user_id)
if member_status.status not in ['creator', 'владелец', 'points sys.', 'Владелец', 'админ', 'bot-admin']:
await bot.promote_chat_member(
chat_id=message.chat.id,
user_id=target_user_id,
can_manage_chat=False,
can_post_messages=False,
can_edit_messages=False,
can_delete_messages=False,
can_manage_video_chats=False,
can_restrict_members=False,
can_promote_members=False,
can_change_info=False,
can_invite_users=True, # одно право нужно добавить, об этом ниже
can_pin_messages=False
)
Вручную можно добавить администратора, но отключить все права. На коде такой сделать нельзя — для того, чтобы пользователь стал администратором, нужно обязательно добавить ему хотя бы 1 админ-право. Благо есть такое безобидное право — право на приглашение пользователей.
Одного такого права, которое не дает никакой власти достаточно, чтобы выдать пользователю префикс:
prefix = f"Знаток: {user_points[target_user_id]}"
await bot.set_chat_administrator_custom_title(
chat_id=message.chat.id,
user_id=target_user_id,
custom_title=prefix
)
Теперь у пользователей есть префиксы вида «Знаток: <кол-во баллов>».
Вот весь код команды »/pa» (/points_add)
@dp.message_handler(commands=["pa", "point_add", "ap", "add_point", "дб", "добавить_балл"])
async def add_points(message: types.Message):
if not message.reply_to_message:
await message.reply("Чтобы добавить балл, ответьте на сообщение человека.")
target_user_id = message.reply_to_message.from_user.id
if user_points.get(target_user_id) is not None:
user_points[target_user_id] += 1
else:
user_points[target_user_id] = 1
member_status = await bot.get_chat_member(message.chat.id, target_user_id)
if member_status.status not in ['creator', 'владелец', 'points sys.', 'Владелец', 'админ', 'bot-admin']:
await bot.promote_chat_member(
chat_id=message.chat.id,
user_id=target_user_id,
can_manage_chat=False,
can_post_messages=False,
can_edit_messages=False,
can_delete_messages=False,
can_manage_video_chats=False,
can_restrict_members=False,
can_promote_members=False,
can_change_info=False,
can_invite_users=True, # одно право нужно добавить
can_pin_messages=False
)
prefix = f"Знаток: {user_points[target_user_id]}"
await bot.set_chat_administrator_custom_title(
chat_id=message.chat.id,
user_id=target_user_id,
custom_title=prefix
)
Добавим еще простую команду для просмотра своего баланса, так как сам свой префикс над сообщением не видишь. (только в списке участников).
@dp.message_handler(commands=["pb", "points_balance"])
async def points_balance(message: types.Message):
user_id = message.from_user.id
if user_points.get(user_id) is not None:
user_balance = user_points[user_id]
else:
user_balance = 0
await message.reply(f"Ваш профиль:\nЗнаток: {user_balance}")
И завершаем код, запустив бота:
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
В итоге, техника использования нашего бота такая:
задаем вопрос в чате
получаем ответ
если ответ/совет нам помог/пригодился, то благодарим автора ответа баллом — пишем ответом /pa
человек получает балл
теперь все участники видят над каждым сообщением ответившего его кол-во баллов.
Главный плюс: чтобы посмотреть баллы человека, не нужно вводить команды!
Бот Kilobyte
Основываясь на этой идее, я создал telegram-botа, в котором добавил еще пару улучшений:
сохранение баллов в файл (с telegram_id и username)
сохраняемая авторизация (для защиты от накручивания баллов)
команда вывода информации
ранги, зависящие от кол-во баллов
поддержку смены доступных языков: русского и английского (и сохранение выбора)
log-консоль в личной переписке с ботом (только для указанного в коде админа)
log-консоль в окне запуска бота
admin-консоль в отдельном окне, с помощью этой консоли вы сможете изменять язык и динамически менять баллы любого из участников
автоматическое удаление всех сообщений относящихся к системе баллов (и команды пользователей и сообщения бота)
Для тестирования бота в подготовленной группе с подготовленным ботом, а также для вопросов напишите мне в телеграм: https://t.me/Gunner951
Демо работы бота
консоль при запуске бота
бот требует верификацию
балл добавлен
Знаток: 2
Ранг: ♝
Информация для форума об AI
Доп. консоль
Где взять код?
Весь код такого улучшенного бота можно скачать бесплатно и пользоваться самому по ссылке на github — https://github.com/ivansherbakov9/Points-System-In-TG-BOT-Kilobyte
Там же будут доп. инструкции.
Репозиторию можно поставить звезду.
Спасибо.
P.S. Не знаю, когда выйдет статья, но поздравляю с 2025 годом.
Другое
Мой GitHub
GitHub Код
Мой Kaggle
Крутой Kaggle-Dataset
Мой HuggingFace
Крутой HuggingFace-Dataset
Мой Telegram
AI/ML/DL Форум в Telegram (c ботом Kilobyte)
Telegram канал об разработке Clan War Online
Telegram
Python
Habrahabr.ru прочитано 1930 раз