Сегодня я расскажу, как можно создать собственную систему репутации с 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
Демо работы бота




Ранг: ♝


Где взять код?
Весь код такого улучшенного бота можно скачать бесплатно и пользоваться самому по ссылке на github - https://github.com/ivansherbakov9/Points-System-In-TG-BOT-Kilobyte
Там же будут доп. инструкции.
Репозиторию можно поставить звезду.
Спасибо.
P.S. Не знаю, когда выйдет статья, но поздравляю с 2025 годом.
Другое
Мой GitHub
GitHub Код
Мой Kaggle
Крутой Kaggle-Dataset
Мой HuggingFace
Крутой HuggingFace-Dataset
Мой Telegram
Telegram канал об разработке Clan War Online
Telegram
Python
