Создание 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)
Чтоб не забыть – когнитивный ассистент
Когнитивный ассистент - система, анализирующая текущий интерес пользователя и предлагающая ему в онлайн-режиме релевантные материалы.
Как вариант - в предварительно обработанной форме, ориентированной на удобное восприятие и использование.
Акцент - на ранее неизвестную информацию (требуется понимание системой уровня знаний пользователя)
Верхнеуровневая схема разбора сообщения бота:
Схема разбора сообщения:
- Получение сообщения с сервера
- Первичная обработка:
- определение текста сообщения
- обработка текста сообщения:
- очистка от лишних пробелов и знаков препинания
- поиск обращения
- поиск прямых команд
- определение списка слов
- определение списка слов со знаками препинания
- поиск цифр, определение меры (рубли, кг, дни)
- поиск дат и временных периодов
- поиск имен
- поиск институтов и организаций
- поиск других сущностей
- поиск приаттаченных документов
- поиск приаттаченных картинок
- поиск приаттаченного местоположения
- определение пересылаемого сообщения
- определение исходного сообщения
- сохранение сообщения
- Действие в соответствие с командой
- Поиск дополнительных директив:
- Расчет TF_IDF для каждого слова
- Построение схемы слова (сущ_глагол_прилаг)
- Поиск соответствия в сохраненных схемах
- Определение действия
- Определение параметров действия
- Ответ
- Сохранение ответа
Пример функции сортировки “пузырьком” (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

Долгое время лелеял себя надеждой, что смогу построить эффективную базу данных в формате HDF. А что? Очень быстрая, прекрасно интегрируется с pandas - что еще нужно, если основные операции завязаны на pandas?
Проблема в одном - при попытке вносить изменения в таблицы база начинает неконтролируемо расти. Даже при повторном сохранении одногиговой базы, в которую не было добавлено ни одной строчки, файл, ничтоже сумняшеся, прибавляет в весе 150-200 мегабайт. Облазил документацию и стаковерфлоу в поисках правильного рецепта приготовления HDF, но не преуспел.
И только недавно наткнулся на дельный совет - не старайтесь использовать hdf как базу данных. Этот формат отлично приспособлен для быстрого сохранения большого датафрейма и быстрого же его чтения, но апдейт - не про него.
Плюнул я на все эти свои эксперименты и вернулся к старому доброму SQL.
Методичка по Python
Полезные кусочки кода
WebCheckerBot
Бот для проверки изменений веб-страниц
ntcn
тест
Infected Universe
04/09/2016
ver.1
