Создание telegram-бота (python 3)

Часть первая - модуль получения обновлений.

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

Если токен получен, можно переходить  к созданию модуля   получения обновлений.  Это  функция, которая  получает на входе два параметра: вышеупомянутый токен и параметр  offset. С токеном уже разобрались, а offset - это  дословно  отступ, номер сообщения, до которого    сообщения  считаются полученными.  При запуске программы  этот параметр  назначается равным 0.

TOKEN = 'ваш_токен'
offset = 0 # начальный "отступ"
INTERVAL = 1 # Интервал проверки наличия новых сообщений (обновлений) на сервере в секундах
URL = 'https://api.telegram.org/bot' # Адрес HTTP Bot API

Далее - пишем функцию получения обновлений с сервера Telegram:

def  get_updates(TOKEN, URL, offset):
    
 
    # Формируем параметры запроса
    data = {'offset': offset+1, 'limit': 5, 'timeout': 0}
 
    # Отправка запроса обновлений
    try:
        request = requests.post(URL + TOKEN + '/getUpdates', data=data)
    except:
        print('Error getting updates') # сообщение об ошибке получения обновлений
        return False # Завершаем проверку
 
    if not request.status_code == 200: return False # Проверка ответа сервера
    if not request.json()['ok']: return False # Проверка успешности обращения к API
 
    # Проверка каждого элемента списка
    for update in request.json()['result']:
 
        offset = update['update_id'] # Извлечение ID сообщения
 
        #Проверка на наличие сообщения
        if not 'message' in update:
            continue #переход к следующему обновлению
 
        print ('\n\n',   datetime.datetime.now().strftime('%H:%M:%S'),'Сообщение получено:')
        print(update)
        return(update, offset)

Как видно из кода,  функция  возвращает None, если обновлений на сервере нет, и сериализированный объект, если обновление есть.  Пример  такого обновления:

{'update_id': 400390656,
'message': {'text': 'сообщение текстовое',
            'from': {'username': 'evillexus',
                     'id': 9111111111,
                     'last_name': 'А',
                     'first_name': 'Алексей'},
            'chat': {'id': -100110111111, 'title': 'test', 'type': 'supergroup'},
            'message_id': 266,
            'date': 1488625362}}

Доступ к каждой части  обновления осуществляется весьма просто:

# текст сообщения:
message_text = update['message']['text']# id отправителя:
# id отправителя: 
from_id = update['message']['from]['id']
# id чата в котором получено сообщение:
chat_id = update['message']['chat']['id']
# имя отправителя:
first_name = update['message']['from']['first_name']

и т.д.

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

if __name__ == '__main__':
    message = get_updates(TOKEN, URL, offset) # попытка получить обновление
        if message:
            print('Получено сообщение:\n')
            message_text = update['message']['text']
            print(message_text)

 

Чтоб не забыть – когнитивный ассистент

Когнитивный ассистент - система, анализирующая текущий интерес пользователя и  предлагающая ему  в онлайн-режиме  релевантные материалы.

Как вариант - в предварительно обработанной форме,  ориентированной на удобное восприятие и использование.

Акцент - на  ранее неизвестную информацию (требуется   понимание системой уровня знаний пользователя)

Верхнеуровневая схема разбора сообщения бота:

Схема разбора сообщения:

  1. Получение сообщения с сервера
  2. Первичная обработка:
  • определение текста сообщения
  • обработка текста сообщения:
  • очистка от лишних пробелов и знаков препинания
  • поиск обращения
  • поиск прямых команд
  • определение списка слов
  • определение списка слов со знаками препинания
  • поиск цифр, определение меры (рубли, кг, дни)
  • поиск дат и временных периодов
  • поиск имен
  • поиск институтов и организаций
  • поиск других сущностей
  • поиск приаттаченных документов
  • поиск приаттаченных картинок
  • поиск приаттаченного местоположения
  • определение пересылаемого сообщения
  • определение исходного сообщения
  • сохранение сообщения
  1. Действие в соответствие с командой
  2. Поиск дополнительных директив:
    • Расчет TF_IDF для каждого слова
    • Построение схемы слова (сущ_глагол_прилаг)
    • Поиск соответствия в сохраненных схемах
    • Определение действия
    • Определение параметров действия
    • Ответ
  1. Сохранение ответа

 

Пример функции сортировки “пузырьком” (Python)

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

[pastacode lang="markup" manual="def%20bubble_sort(lst)%3A%0A%20%20%20%20for%20i%20in%20range(0%2C%20len(lst)-1)%3A%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(0%2C%20len(lst)-1)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20lst%5Bi%5D%20%3C%20lst%5Bi%2B1%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pass%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lst%5Bi%5D%2C%20lst%5Bi%2B1%5D%20%3D%20%20lst%5Bi%2B1%5D%2Clst%5Bi%5D%0A%20%20%20%20return%20lst%0A%0Alst%20%3D%20%5B2%2C8%2C4%2C6%2C-88%2C9%2C0%2C1%2C5%2C8%2C0%2C9%2C8%2C-190%5D%0Abubble_sort(lst)%0A%0A%3E%3E%3E%20%5B-190%2C%20-88%2C%200%2C%200%2C%201%2C%202%2C%204%2C%205%2C%206%2C%208%2C%208%2C%208%2C%209%2C%209%5D" message="Сортировка пузырьком" highlight="" provider="manual"/]

О формате сохранения данных HDF

pandas hdfstore

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

Проблема в одном - при попытке вносить изменения  в таблицы база начинает неконтролируемо расти. Даже при повторном сохранении одногиговой базы,  в которую не было добавлено ни одной строчки, файл, ничтоже сумняшеся, прибавляет в весе 150-200 мегабайт.  Облазил документацию и стаковерфлоу в поисках правильного рецепта приготовления HDF, но не преуспел.

И только недавно наткнулся на дельный совет - не старайтесь использовать hdf как базу данных. Этот формат отлично приспособлен для быстрого сохранения большого датафрейма и быстрого же его чтения, но  апдейт - не про него.

Плюнул я на все эти свои эксперименты и вернулся к старому доброму SQL.