Все новое - хорошо забытое старое

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

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

Пример работы этого бота можно увидеть здесь.

Что такое оценка и кому она может быть полезной

Определение рыночной стоимости - это сложный и комплексный процесс, а в случае с редкими предметами он зачастую вообще бывает возможет только после совершения первой сделки. Реальную оценку рыночной стоимости может предоставить только аукционный метод, т.е. до тех пор, пока ваш лот не будет продан с молотка, вы не узнаете сколько бы он реально мог стоить.

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

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

Как телеграм упрощает жизнь вебмастера

Первое, о чем хотелось бы упомянуть - это виджет для авторизации через Telegram. Время паролей давно прошло и люди стараются их избегать - тут вряд ли кто-то будет со мной спорить. Добавить авторизацию на сайте через телегу, на мой взгляд отличная идея. Это отправная точка для интеграции, по этому начать следует с нее. Тут я Америку не открою и лучше ознакомиться с документаций, но на всякий случай оставлю это тут:

from hashlib import sha256
from django.http import HttpRequest
import hmac

TG_BOT_TOKEN = 'my-amazing-telegram-bot-token'

class LoginView(View):
  encoding = 'utf8'
  
  def get(self, request: HttpRequest, **kwargs):
      params = request.GET.copy()
      tg_hash = params.get('hash')
      if tg_hash:
          del params['hash']
      check_string_array = [f'{key}={params[key]}' for key in params]
      s = '\n'.join(sorted(check_string_array))
      secret_key = sha256(
        TG_BOT_TOKEN.encode(self.encoding)
      ).digest()
      h = hmac.new(
        secret_key, msg=bytes(s, self.encoding), digestmod=sha256
      ).hexdigest()
      if h == tg_hash:
        # если цифровая подпись совпала, 
        # мы можем создать и/или авторизовать пользователя
        telegram_id = params.get('id')
        
    

Из всего этого барахла стоит сделать акцент на telegram_id, или social_id - как больше нравится. Это id пользователя в телеграм и он нам очень нужен. Его стоит сохранить, т.к. именно по этому айди мы будем определять пользователя и общаться с ним.

Некоторые механики удобно реализовывать при помощи javascript и html, но есть и такие, для которых клиент телеграм окажется куда более удобным для реализации, что позволит не тратить время на написание костылей. Во первых - это оповещения. Получать персональные сообщения о важных событиях через телеграм значительно удобнее чем на почту или через колокольчик на сайте. Т.е. для того чтобы информировать пользователя о результатах его собственных действий или действий других участников инфраструктуры, которые так или иначе касаются его аккаунта, очень удобно использовать telegram bot api. Достаточно знать ID, о котором я уже говорил выше.

class SomeClass():
  def __init__(self, chat_id):
    self.chat_id = chat_id
    
  def text_answer(self, text: str, reply_markup=None):
      text and self.bot.send_message(
        chat_id=self.chat_id,
        text=text,
        reply_markup=reply_markup,
        parse_mode="HTML",
      )

Т.е. вот такой простой метод класса позволит информировать пользователя о любом событии в любом месте программы элементарным вызовом:

SomeClass(chat_id=telegram_id).text_answer(
	text='Ваш ответ успешно записан'
)

Более того, можно информировать вебмастера о важных ситуациях или ошибках, достаточно узнать и запомнить его id в мессенджере, а далее отправлять сообщения в этот чат. Это удобно - можно отслеживать события, а так же управлять ими.

Когда от пользователя требуется совершить выбор - телеграм тоже приходит на помощь. Чтобы не рисовать на клиентской части сайта кнопки и формы, не обрабатывать события клика на них, не отправлять все эти данные с клиента на сервер - мы можем воспользоваться вебхуками от телеграм бот апи, которые получим в случае использования Inline клавиатуры. Для каждой такой кнопки мы можем указать callback_data, который будет присутствовать в запросе от сервера и по которому мы сможем точно понять какая именно кнопка была нажата. Дальше останется только сохранить необходимые данные и ответить серверу мессенджера при помощи метода answer_callback_query, чтобы на кнопке в телеге бесконечно не крутились часики.

import json

body_unicode = request.body.decode("utf-8")
body = json.loads(body_unicode)

price = int(grade / cnt) if cnt else 0  # grade - сумма всех оценок
																				# cnt - количество оценок
bot.answer_callback_query(
  callback_query_id=cq["id"],
  text=f"Средняя оценка: {price}, голосов: {cnt}",
  show_alert=True,
)

Обратите внимание, что отвечать на callback_query нужно по callback_query_id, а не chat_id, как это происходит в случае обычного сообщения. В остальном ничего сложного, мы просто считаем среднее арифметическое от оценок всех пользователей.

Исторический контекст

Вообще когда речь идет об оценке чего-то, в первую очередь необходимо узнать, как этот предмет попал в руки обладателя. От этого может зависеть подлинность, стоимость, и вообще интерес к педмету как таковой. Каждая старинная вещь имеет свою историю, и именно ее история придает ей максимальную ценность. Простое обручальное кольцо может стоить как лом золота, но если на нем гравировка, которая определяет принадлежность этого украшения исторической личности, оно становится бесценным в рамках всего человечества.

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

Портал konigsland, механики которого поверхностно изложены выше, собирает данные о значимых для истории находках для того, чтобы эти предметы не потеряли исторический контекст. Телеграм бот выступает в роли микросервиса, который осуществляет прием оценок от пользователей (на основе открытых данных) и подсчет средней оценки.

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

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