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

Добавим команду для добавления балла за ответ.

  1. Добавить балл можно будет, ответив на сообщение, за который вы хотите повысить репутацию ответившему.

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Ранг: ♝
Знаток: 2
Ранг: ♝
Информация для форума об AI
Информация для форума об AI
Доп. консоль
Доп. консоль

Где взять код?

Весь код такого улучшенного бота можно скачать бесплатно и пользоваться самому по ссылке на 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

Комментарии (16)


  1. mxr
    31.12.2024 17:11

    Писал такого бота в 2017, но от идеи отказался.

    Не могу говорить за текущее положение дел, но раньше любой префикс можно было выдать только администратору. Даже без прав, он будет отображаться как админ, для других ботов например, и сможет воспользоваться некоторыми функциями администратора.


    1. Xokare
      31.12.2024 17:11

      А ещё получит права на просмотр лога недавних действий и возможность игнорировать медленный режим и ограничения на типы отправляемого контента, если они есть.

      Сама по себе идея не нова, я даже знаю пару ботов которые её в чуть другом исполнении реализовали. Но у неё на концептуальном уровне есть ряд недостатков.


      1. gunner951 Автор
        31.12.2024 17:11

        Я заметил, что если вручную выдавать администратора и писать префикс, а потом удалить из администраторов, то префикс остается. Может это является выходом? Нужно будет поэкспериментировать…


        1. zBornss
          31.12.2024 17:11

          Через некоторое время префикс тогда пропадает. Не знаю, когда и как кешируется, но факт. Пользуюсь префиксами уже 4 года


          1. gunner951 Автор
            31.12.2024 17:11

            А, не знал, спасибо


  1. censor2005
    31.12.2024 17:11

    Идея: выдавать баллы пользователям исходя из количества полученных лайков по всем сообщениям


    1. egribanov
      31.12.2024 17:11

      Только от положительных реакций или эмодзи какашки в минус идут?


    1. sunsexsurf
      31.12.2024 17:11

      в одном питонячьем чате карму повышают просто при ответе на сообщение "Спасибо".


      1. Devastator82
        31.12.2024 17:11

        Но в том чате чтобы проверить уровень баллов человека нужно написать в этот же чат запрос? Именно от этого автор статьи и хотел уйти.


  1. themen2
    31.12.2024 17:11

    Так есть же специальный сайт для этого - Quora. Сайт вопросов ответов от экспертов. И то, там шляпу всякую отвечают часто, выдавая свое мнение за объективное. Видимо чтобы эта идея работала, надо платить за экспертное мнение экспертам!

    Например, раньше во время СССР эту проблему решали в печатных изданиях тем, что делали обязательную проверку книги перед печатью , рецензировали ее. Проверяли на плагиат, на всякий сумасшедший бред итд. В итоге вот есть книга, есть понимание, что ее отсмотрели эксперты и есть какое то доверие к ней. А значит время потраченное на а прочтение этой книги , потрачено не зря..

    Как это решать для онлайн публикаций, я пока не очень понимаю.. Но думаю что это нужная вещь по той причине, что информации очень очень много и качество ее очень очень сильно падает.

    Может нам всем поможет такой не предвзятый, не кликбейтный, не хайпожорный эксперт как ChatGPT?? Он как раз агрегирует информацию по всему интернету и есть надежда, что они отбирают хорошие источники для информации


    1. Devastator82
      31.12.2024 17:11

      Выход есть! Нужен простой советский…

      Проверка источников. Достаточно игнорировать материалы без указания источников которые можно проверить. Естественно это относится только к материалам имеющим критическое значение, материалы развлекательного характера можно не проверять.


  1. Seklth
    31.12.2024 17:11

    Только облом в том что количество администраторов ограничено 50


  1. unclegluk
    31.12.2024 17:11

    Задаешь вопрос или спрашиваешь совет в каком-то telegram чате и получаешь несколько ответов. В такой ситуации всегда задаешься вопросами: "Кому из ответивших поверить больше?", "Ему можно доверять?".

    Человек может иметь сколь угодно хорошую репутацию, но он может и ошибиться. Поэтому лучше задаваться вопросами: «Какому совету больше доверять?», «Этот совет верный?».


  1. ahdenchik
    31.12.2024 17:11

    Моя идея в том, чтобы бот автоматически добавлял пользователя в администраторы, выдавал префикс с его баллами и отбирал все админ-права.

    Это всё реализуемо как атомарная функция?


  1. tkutru
    31.12.2024 17:11

    "Как выстрелить себе в ногу 101" или "для чего надо следовать хотя бы первым трём нормальным формам"