Page Nav

HIDE
HIDE
GRID_STYLE

Gradient Skin

Gradient_Skin

ProstoDiary

  26 нояб. 2016   Телеграм боты охуенны Насколько телега охуенна.  Сегодня увидел статью на vc где рассказывали про telegram os. Сперва я по...

 26 нояб. 2016 

Телеграм боты охуенны

Насколько телега охуенна. 
Сегодня увидел статью на vc где рассказывали про telegram os. Сперва я потыкал пальцем, мол, что за бред. Но! В этом же неебический потенциал. Например, уже который месяц не могу сделать нормального клиента+сервер для своего дневничка ProstoDiary. Как-то жуть не просто я скажу. Уж слишком много всего нужно сделать. Сначала делал так. Клиент: cordova+webpack+flow+skatejs+hoodle. Сервер хотел расположить на heroku+hoodle+nodejs. Пиздец же. Само собой никак не мог сделать это быстро. И ради чего? Чтобы держать свой дневничок на android+blackberry+windows10? Делай я что-то большое - это могло бы иметь резон. Но для дневничка? ХЗ. 
И тут я поставил бота, сначала чтобы послушать музыку, затем какую-то безделушку для фейкового зомби-чата ну и так далее. Сначала удивился тому что в телеге теперь можно слушать музыку. Потом полазил в интернеты и в конец охренел, потому что Дуров прикидул делать платформу еще и в роли площадки для HTML5 игр! Ничосе. Вот уж действительно суперпрогрессивная патформа, я уже не удивлен если telegram os будет. По крайней мере browser os появилась (firefox os), хоть и провалилась. 
Короче, решил попробовать создать своего бота. И это пиздец как удобно и вообще выглядит нереально прогрессивно. Я только поставил пакет node-telegram-bot-api, пообщался с BotFather и вуаля! На ноуте у меня работающий сервер и любой гаджет, на котором установлена телега, может коннектиться к нему. Я чуть не кончил от того что произошло. Помню раньше если я хотел подключить тот же Google API мне приходилось лезть на стены от неудобства: то либа кривая, то разрешения никак не проставляются, то ждать токен приходится пиздец как долго. И всегда получался какой-то stackoverflow-development. Тут же все ясно и понятно. Короче пока в шоке.

Ах да, самое главное. Появилась идейка в голове использовать чаты и ботов для синхронизации работы по проектам. Потому что то что у меня сейчас происходит на блядоработе просто бесит: всякие XMPP вместе с почтой и redmine. Пиздец, не? Впрочем на других проектах таже хрень: треллы, битбакеты, скайпы, слаки... В конечном счете все сводится к тому, чтобы прочесть уведомление и донести мессагу другому. Что мешает сейчас создать аджаил бота, подключить кодревью бота, в соседней группе общаться по задаче с тестировщиком? Ниче. Короче, отличный стартапчик вырисовывается. 


 4 дек. 2016 г

Закончил выпуск @ProstoDiary_bot

Много перепробовал различных штуковин. Сначала хотел выпустить под BlackBerry 10 в Cordova-оболочке. Увы, разработка застряла, то переписывал с handlebars на skatejs, то сложность с дебагом и подписыванием через Momentics IDE (сука, бесит что токен устаревает через полмесяца), то не смог разобраться как использовать PouchDB в многопользовательской работе. Пока не выкинул всю эту хипстерскую дрянь, ничего не двигалось. Итогом нового переосмысления стало использование Telegram API, о котором я лестно писал статьей ниже. NodeJS 6 послужил бэкэндом, Postgresql стал единственной БД. Деплоится это веселье на Heroku, пока с лимитом в 10000 записей. Записи закриптованы алгоритмом aes-256-ctr, ключ к сожалению пока захардкожен через энвайронменты, но ишью есть, дело осталось за кодингом. В качестве юнит-тестов решил юзать сверхсовременный тулчейн ava. Он написан полностью на ES6, выглядит современно, работает превосходно. 

Установить бота можно перейдя по ссылке: https://telegram.me/ProstoDiary_bot


 26 февр. 2017 г

Функция fillRangeTimes

Прежде я не писал, но я много интересного выкладываю на свой GitHub GistВот и одна из важных функций из мобильной аппы я портировал в бота ProstoDiary. Суть его в заполнении дырок в списках дат:
fillRangeTimes('2016/01/01', '2016/01/03') // [ 2016/01/01 Date, 2016/01/02 Date, 2016/01/03 Date  ]

Графически теперь графики рендерятся так:


 26 сент. 2017 г.,

Долгожданный функционал вышел в релиз

Прихерел сколько стал тратить в последнее время и чтобы подсчет был одной командой - сегодня зарелизил фичу с показом полученного/потраченного. Пока считает всё только в рублях и за всё время что бот нашёл в БД, но есть куда расти! 
Всё это делается двумя командами 
/count -
/count +
Первая показывает сколько потрачено, вторая - сколько получено разными путями (зарплата, проценты и тд). В планах добавить возможность выгрузки по дням/месяцам/кварталам.

 1 окт. 2017 г.

Функционал поиска

Ещё одна нужная функция для просто дневника вышла в свет! Вызывается через команду /search. Идея в том, чтобы показывать как часто человек совершал это действие. Пока работает без сортировки по времени.


10 мар. 2018 г.

Бот понимает КПП

Это ускоряет запись потраченного, и в будущем позволит хранить дубликат чека не используя отдельные государственные приложения. Пока работает в тестовом режиме, ничего не записывая в БД. Изменение структуры БД сейчас ставится приоритетной задачей.

27 мар. 2018 г.,

Логирование с Coralogix


Как оказалось, на Heroku с логированием все плохо. Таких сред как Graylog нет, поэтому приходится брать то, что есть в аддонах. Потратив несколько часов на установку разных логов, остановился на Coralogix, который удалось связать в упряжку с winston 3, пока еще находящящийся в состоянии релиз кандидата. Морда у Coralogix некрасивая и неудобная, но пока все работает. Использовать в других проектах категорически не советую. 


10 апр. 2018 г

Github Projects


Не секрет, что проект я веду открыто и трачу на кодинг времени меньше, чем на обдумывание той или иной фичи. Количество Issues ушло за тридцатку и поэтому решил перевести их на проекты. Пока проектов три:
  1. Watch - служит для проектирование портрета пользователя и считыванием всего доступного боту данных (email, прикрепленные аккаунты, перемещение и пр.). Идея в том, чтобы бот знал своего пользователя.
  2. Control - все что связано с финансами и оплатой/контролем и доступными ресурсами. Идея в том, что бот руководит ресурсами/финансами пользователя.
  3. IOT (будущая Qweeto) - бот как посредник между пользователями. Идея в том, что боты могут общаться между собой, совершая разные действия, основываясь для этого на первых двух идеях (Watch/Control). 



20 июн. 2018 г

NLP и ML с dialogflow


На днях в рамках задачи изучал возможности внедрения в ProstoDiary технологий распознавания естественного языка. На стол попали три технологии: Microsoft LUIS, Facebook wit.ai, Google dialogflow. Все они имеют бесплатный режим пользования, поддержку русского языка, javascript sdk и интеграцию с популярными мессенджерами.Из всех них wit.ai мне показался самым простым, но у него была сложность с интеграцией с созданным проектом. Короче, из-за возможностей Google Cloud я остановился на dialogflow. Уже первые тесты показали мощности ML по-сравнению с RegEx`ами. Учится нейронка достаточно быстро (возможно, только вначале), есть возможность выгрузки интентов (чтобы затем мигрировать на другой сервис) и только недавно зарелизилась v2 версия API. Пока все нравится, но есть опасение, что Google прикроет Dialogflow или смержит в Firebase. Это, конечно, не история с Parse от фейсбука, но пока все же.

Вместе с этим, заюзал еще либу franc, для умного извлечения используемого языка из запроса. Тоже рекомендую.


 25 июн. 2018 г

Обраотка ашыбок


Dialogflow успешно распознает Entities, достаточно описать необходимые синонимы к нему. Но что делать с ошибочным вводом, когда боту приходит сообщение, например: "50 нублей"? Для этого случая, подключаются специальные спеллеры, например, "Яндекс.Спеллер". 


Теперь можно писать с ошибками! Бот всё поймет (;



26 авг. 2018 г.,

Высчитывание калорийности продуктов


С последним релизом, бот теперь подсказывает калорийность основных продуктов:
Значения берутся из 100 грамм продукта, но есть мысли как это изменить 🤔



16 февр. 2019 г

Страница бота с открытием нативного приложения


Теперь на одной странице можно увидеть инструкции и сразу получить ссылку на установку бота.



Посмотреть готовый результат: https://prosto-diary.gotointeractive.com/



 18 мая 2019 г.,

Функционал /balance

Немного заглянем в будущее и увидим возможность отображения всех доступных средств в боте:

 7 июл. 2019 г

ProstoDiary Теперь с WolframAlpha!

Долго думал про целесообразность прикручивать стороннее API в виде Wolfram. 

Немного истории.
С Wolfram Mathematica я познакомился в 10 или 11 классе, и меня захватила возможность так быстро и легко описывать то, что тогда приходилось делать на бумаге с ручкой =). Но уже спустя пару лет в универе Mathematica была забыта, и начался Matlab. Под конец универа наткнулся на хабре на статью про Wolfram Language и посчитал это State of Concept решением. Как оказалось позже - был в корне неправ. 
Год назад смотрел на возможности Wolfram Language и он показался очень сложным, но невероятно изящным и мощным ЯП, со своими особенностями, на изучение которых, к сожалению, у меня нет свободного времени. Тем не менее, его облачная среда Wolfram Alpha была как раз тем что нужно для бота. К слову, она создавалась как раз для голосовых помощников в виде Siri. С последним коммитом прикрутил их пакет, который к сожалению не ставится с официального сайта - пришлось создать зеркало на своем личном гитхабе. Надеюсь это косяк первого RC, и к финальному релизу все будет как надо в виде готового NPM-пакета.
Конец истории.

Теперь для ProstoDiary появилась огромная база знаний Wolfram, которая пойдет в основу SmartDate, Personal Health, Finance компонентов.  


8 июл. 2019 

ProstoDiary Вместе с Todoist

Todoist - замечательная программа для учета своих дел. Почему бы не использовать ее в виде основы для учета в умном дневнике?

Интерфейс Todoist оптимизирован для удобного создания дел, это такой удобный календарь для тех, кому обычный электронный календарь кажется неудобным. Также программа способная синхронизировать календарь вместе с Google Calendar, а у меня как раз была такая хотелка на гитхабе.

Суть в следующем:
Используя программу можно вводить тексты вида: "купить кофе", устанавливая заодно срок жизни этого todo. После чего бот периодически скачивает все текущие todo из программы и начинает слежку за выполнением, подсказывая в данном случае где можно купить самый-самый кофе, который подходит пользователю по его критериям персонализации (цена, место, время). После покупки, пользователь вводит в дневник запись что он купил кофе, а в дальнейшем эта запись будет делаться автоматически через KPP, и тем самым бот сам удаляет задачу из Todoist. Таким образом дневник становится только инструментом оформления истории.

16 сент. 2019 г.,

 /start по взрослому

  • Теперь пользователь перед использованием обязан принять договор
  • Соль теперь вынесена из энвайронмента и устанавливается каждым пользователем при новом логине
  • Внедрена двухфакторная аутентификация от Google
  • Наконец, проверка через почту
21 сент. 2019 г.

Электронная почта это ядро твоей истории

Зачем придумывать колесо, когда уже придуман велосипед?

Задача: использовать доступное для других сервисов хранилище для текстовых и бинарных файлов с их последующей обработкой на другом сервере.

Выбрать протокол Jabber или новый matrix? Как сделать так, чтобы пользователи не забыли еще один урл, а как быть с настройкой и поддержкой?

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

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

Итак, почта становится тем самым местом, куда разные приложения и сайты будут отправлять свои данные. Но отныне пользователю не понадобится разбирать их. Этим займется его личный виртуальный помощник, который будет разбирать контекст и собирать все присланные данные в одну историю - StoryJSON. Этот StoryJSON станет отправной точкой для получения сторонних сервисов, которые будут его обрабатывать и находить связи и также отправлять полученное через ту самую почту сгенерированную и отслеживаемую ботом. Ну а что будет затем - расскажу как закончу с этим :)


30 сентября

Мысли про UX

Начальный экран

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

$ /start
> Лицензионное соглашение
  ...
$ [Принимаю][Отмена]

> Введите ваш адрес сайта с JSON-LD:
www.my.site

> Подтвердите вход
, введя сгенерированный пятизначный код высланный на вашу почту:
$ 12345

Приветствую %username! Я твой бот. Узнай все возможности командой /help.

Границы записи/выборки команд

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

Пример команды записи, после которой всплывает force_reply:
$ /
$ поел гречи 200 грамм
> Завтрак записан.

Пример простой записи:
$ посмотрел фильм Оно
> Запись добавлена.

Отображение историй

Умное формирование историй является вау фичей ProstoDiary. Вводимые данные всячески анализируются, объединяются и исправляются. Поэтому показ самих историй надо делать читаемым, понятным и интуитивным. Учитывая что текст может быть сгенерирован самим ботом на основе данных, нужно явно указывать кем была произведена запись.

$ /story 
> [Покупки] [Фильмы] [...]

$ /story Фильмы
> 2020-10-10
  ---
  [%user] Начал смотреть фильм Оно
  ---
  2020-10-01
  [%bot] Фильм Нечто
  ...

Управление ассистентами

Не менее важной особенностью дневника является подключение сторонних ассистентов, которые подключаются через webhooks.

Для поиска историй используется встроенный ассистент /search, который разбирает контекст и формирует вывод в виде текста или графика.
$ /search
$ покажи сколько я спал за два месяца
> GRAPH

Уведомления

Это не требующий ввода асинхронный способ донести пользователю важную ему информацию от ассистента. 

Пример работы Health Assistant:
> Вы недостаточно занимались спортом последние три дня. Рекомендую отправиться на прогулку в %place.

Пример работы Finance Assistant:
$ покупка 10500 акций %name 
...
...
Тут пишут что акции %name нужно срочно продавать.

Сквозная интеграция ассистентов

Интеграция ассистентов позволит боту давать более персонализированные предложения.

Пример интеграции Food Assistant с Todo Assistant:
> Уже вечер, вам осталось 300 ккал до выполнения вашего %todo. Рекомендую заказать тортилью в ближайшем ресторане
> MAP
> Зарезервировать столик на 19:00?
> [Да] [Нет]



 октября 30, 2019
Новый логотип для ProstoDiary
 
3 дек. 2019 г.

JSON-LD Action

Примерно как я представляю себе это.
Каждое сообщение созданное дневником будет открыто на определенном узле, доступ к которому разрешен через basic auth пользователю и разрешенным им ассистентам.
Переходя по ссылке вида: /message/:id будет открываться JSON страница с типом DiaryJSON-LD, в котором будут находиться залинкованные к сообщению структурированные данные. 

Пример ниже:
<script type="application/ld+json">
{
  "@context": "https://gotointeractive.come/",
  "@type": "DiaryObject",
  "@id": "https://prosto-diary.gotointeractive.com/message/100500/",
  "datePublished": "2019-12-03",
  "author": {
    "@type": "Person",
    "name": "Denis Baskovsky"
  },
  "interactionStatistic": [
    {
      "@type": "contactPoint",
                ...
    },
    {
      "@type": "GeoJSON-LD",
                ...
    },
    {
      "@type": "VideoObject",
                ...
    },
    ...
  ]
}
</script>

Формат в дальнейшем будет меняться, но смысл понятен.




 4 дек. 2019 г.

Сценарий упрощается


Пользователь отправил сообщение через телеграмм. Прикрепленный к телеграмму бот, идентифицировал пользователя и отправил письмо с необходимыми данными (что делать) от его имени на свою почту. Затем когда у бота освободилось время, он прочитал это письмо, структурировал его и превратил в StoryJSON. Привязанные к боту ассистенты получили уведомление о новой истории и сформировали на их основе рекомендуемую информацию обратно боту. Бот проанализировал их результаты и передал их обратно пользователю в виде письма/телеграмм нотификации.

Для пользователя все это будет под капотом, для него все выглядит так Юзер -> Бот -> Юзер: 

user@something.mail ->GUID@gotointeractive.com ->user@somethingmail.mail

Прослойка в виде телеграмма больше не нужна. Пользователь может напрямую общаться со своим ботом используя клиент smtp.

1) Пользовать пишет письмо вида:

subject: Купи мне билет

html: Хочу сходить на концерт Ленинград примерно в следующую среду с подругой

2) Письмо анализируется ботом

2.1 Разбор темы

subject -> BuyIntent

2.2 Разбор тела

html -> разбор на абстракты с дополнением данных по портрету пользователя -> формирование структурированных документов  (JSON-LD) -> сведение информации вместе (StoryJSON)

2.3 Разбор StoryJSON ассистентом по покупке

- Запрос данных в поисковую систему

- Получение первых 10 результатов

- Переход на страницу каждой из 10 результатов

- Поиск JSON-LD на странице, переход по каждой ссылке глубиной до 5 страниц

- Разбор графа и выявление наилучших вариантов

- Пуш боту ссылок с вариантами 

2.4 Разбор ссылок 

- Проверка ссылок на работоспособность

- Добавление к ссылкам метрик перехода (в платной версии бота это можно отключить)

- Отправка человекочитаемого сообщения с ссылками на почту


7 дек. 2019 г.

Подключение бота в телеграм группы

Цифра позволяет почти бесплатно делать копии. Web 2.0 позволяет с открытым API делать копии в разрешенном месте на определенных ресурсах.

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

Из этого можно будет затюнить бота на анализ рабочей деятельности, формируя рабочую историю пользователя.



 9 дек. 2019 г., 

Что ожидать в 2020 году?


В 2019 планировал успеть подготовить рабочую демо сборку. Не получилось. Зато вот список того что уже появилось в 2019 году:
  • Произведен переход на Node 12
  • Начал вести документацию по архитектуре на sketchboard
  • Настроены E2E тесты, которые стали более информативными
  • Настроен Heroku CI (в настоящее время отключен из-за цены)
  • Настроен WebServer (express), который проксирует все обращения, включая телеграм, почту и страницы
  • Произведен полномасштабный рефакторинг проекта. Все стало заметно чище, понятнее, масштабируемее
  • Вся документация содержится на домене https://prosto-diary.gotointeractive.com/ и генерируется jekyll
  • Настроены линтеры, код стал единым по всему проекту
  • Обновлены зависимости package.json. Зависимости стали точнее, пунктов пакета больше и они используются
  • Настроены Git хуки
  • Обновлен stack Heroku
  • Серьезно доработаны комментарии формата JSDoc
  • Произведен мощный рефакторинг БД
  • Добавлены новые сервисы openweather, sendgrid, yandex pdd, google vision, translate, restcountries и другие
  • Добавлен GitLFS. Хранить большую статику теперь можно
  • Добавлена семантическая конвенция Git коммитов
  • Безопасность пакетов обеспечивается Snyk 
  • Настроены новые популярные Dialogflow интенты
  • Изменена лицензия на CPL-1.0
  • Встроено шифрование OpenPGP при работе с ботом через Telegram
  • Настроен Renovate Bot, автоматически следящий за новыми пакетами
  • Переделано все API на JSON-RPC-2.0
  • Сделана генерация API документации в OpenAPI 3.0
  • Настроена basic авторизация
  • Сделана OAuth 2 аутентификация yandex, facebook
  • Бот теперь используют imap протокол и создается персонально при регистрации

На вкусное, план на 2020 год. Этапов несколько:

1) Демо релиз

Kiosk

  • Выложить проект в открытом виде с ботом demo
  • Сделать выгрузку /backup в формате StoryJSON (пока без семантики)

Бот в чатах

  • Поддержать возможность клонировать бота в разных местах, например, в роли админа в чатах
  • Реализация работы бота в https://t.me/qweeto 

2) Публикация манифеста

  • Доработать мантру проекта 
  • Создать манифест gotois

3) Очищенный Core

  • Нынешний монолит страдает от излишней функциональности. Планирую очистить и сделать перенести все лишнее в сторонние ассистенты
  • Выложить core пакет на github package registry

4) Ассистенты

  • Организовать общение с ассистентами посредством почты и вебхуков
  • Сделать OpenID Connect provider для авторизации внешних ассистентов
  • Настроить автоматический forward писем от бота к ассистенту

5) Семантические данные

StoryJSON

  • Каждое сообщение будет иметь свои интернет линк (URI) аналогичный www.wikidata.org/wiki/Q42
  • Каждое сообщение с разрешения пользователя будет иметь возможность дополняться фактами от ассистентов и читаться другими ботами или человеком
  • Такая страница будет отдавать различное содержимое для устройств: html для человека, json для поисковых роботов, sparql для ассистентов

RDF и SPARQL БД

  • Каждое JSON-LD подписывается jsonld-signatures
  • Сообщения хранятся в специальной БД (сценарий anzograph) и появляется возможность их обрабатывать через SPARQL запросы

Что касается меня =) 
  • Задействую аутсорс
  • Создам презентацию чтобы было понятнее что я вообще делаю 🌝


15 дек. 2019 г

Kiosk


Первый майлстоун закрыт. Маленький шаг в прод.





Следующий майлстоун запланирован к 1 марта. Там появятся ассистенты и ограничения по ролям, и еще возможность подключать бота к своим группам.


26 янв. 2020 г

Машинные типы истории

С последним коммитом можно переводить человеческий текст в читаемый машиной формат schema.org.
 
Текст "купил воды $900 в москве" превращается в:
[
  {
    '@context': {
      schema: 'http://schema.org/',
      name: 'schema:name',
      actionStatus: 'schema:actionStatus',
      agent: 'schema:agent',
      endTime: 'schema:endTime',
      object: 'schema:object',
      startTime: 'schema:startTime',
      priceCurrency: 'schema:priceCurrency',
      price: 'schema:price'
    },
    '@type': 'BuyAction',
    actionStatus: 'CompletedActionStatus',
    agent: { '@type': 'Person', name: 'Я' },
    endTime: '2020-01-26',
    object: { '@type': 'Thing', name: 'вода' },
    startTime: '2020-01-26',
    name: 'воды',
    priceCurrency: 'USD',
    price: '900',
    'https://w3id.org/security#proof': { '@graph': [Object] }
  }
]

 31 янв. 2020 г

Мысли о дроблении монолита

Умение масштабироваться необходимо для выбивания в лидеры. Только так могли возникнуть и существовать гугл, амазон или нетфликс. Поэтому я решил решил разделить проект на три части: assistant, core, bot.

Assistant
  • Telegram
  • Email
Текущий монолит страдает тем что он совмещает в себе обработчик телеграм запросов и неполноценный email слушатель. Разделение позволит качественно улучшать каждого ассистента, а также добавлять новых ассистентов по мере возникновения потребности.

Core
Это ядро трансляции обычных запросов в понятный JSONLD. Оно будет вшиваться в ассистенты и доступно публично. Запросы могут быть обычными текстовыми, бинарными фото, XML и прочими mime-типами. Формирование ядра позволит выделить основные функции и работать с ними изолированно, повысив общее качество. В качестве вынужденной меры ядро пока будет использовать внешнее API для формирования подписанного JSONLD, но заложит фундамент для переноса таких библиотек внутрь себя.

Bot
Итогом первых двух проектов станет очистка репозитория. Бот будет принимать только JSONLD (через JSON RPC API) и отправлять только JSONLD. 
Функционал бота станет следующим:
  • JSON RPC
  • WebServer
  • Database
  • OIDC


 3 февр. 2020 г.,

Типизированные API запросы


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

Прежний запрос api/v3
curl --basic -u "bot_email:master_password" -X POST -H "Content-Type: application/json" -H "Accept: application/json" --data '{"jsonrpc":"2.0","method":"ping","params":[[OBJECT]],"id":1}' http://127.0.0.1:9000/api
* Где OBJECT это обычный JavaScript объект.

Новый запрос api/v4
curl --basic -u "assistant_login:assistant_password" -X POST -H "Content-Type: application/json" -H "Accept: application/schema+json" --data '{"jsonrpc":"2.0","method":"ping","params":[[JSONLD]],"id":1}' http://127.0.0.1:9000/api
* Где JSONLD это JSON-LD =)

Плюсы:
  1. Реализация все еще текстовая и основана на JSON-RPC 2.0;
  2. Авторизация происходит через привычный basic связки логин/пароля, но теперь ассистента или пользователя напрямую;
  3. Ожидаемым ответом становится schema.org;
  4. Данные передаются в параметрах с типизацией schema.org с Linked Data Signatures;
  5. Можно сериализоваться в RDF и затем в GraphQL;
  6. PGP-шифрование определенного контента.

Минусы:
  1. Оверхед по размерам и плохая передача для больших бинарных данных. Если будет прям критично, можно задуматься о переходе на BSON-RPC, пока ожидаю что base64 хватит;
  2. PGP шифруется не весь ответ, а только abstract.

На картинке ниже пример процесса выполнения метода ping:




22 мар. 2020 г

Майлстоун "Подключение функционала бота к чатам" закончен

...с опозданием в 21 день ;)





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


 4 апр. 2020 г

CLI для создания ассистентов

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




P.S. Для терминала использую библиотеку inquirer.




18 апр. 2020 г.

Пример Thing View в действии

Первый результат действующего майлстоуна "Исторические артефакты в OWL2".

Шаг 1. 
Передаю ассистенту tg текст: "досмотрел https://www.youtube.com/watch?v=Vxf6oEROhSk". Текст передается в core, читается NLP-движком, из ссылки извлекается og мета, формируются экшены и наполняются субъекты. 

Шаг 2.
Запись открывается в браузере. Данные извлекаются из внутренней БД и насыщаются открытыми источниками графа гугл.

Следующий шаг.
Начну разработку поискового движка по JSON-LD. БД планирую от Jena. Бот отвечающий за поиск будет внедрен в OIDC. 🤑

15 июн. 2020 г

 OpenAPI + JSON-LD

C обновлением Public API v5 используется новый механизм передачи сообщений. 

Идея: совместить текущий JSON RPC 2 с JSON-LD для будущего оформления всего этого добра через стандарт OpenAPI.

Суть: любой внешний ассистент сможет загружать/выгружать валидный JSON и декодировать его результаты для наполнения собственной онтологии API используя schema.org. Тем самым, появится типизация параметров для генерации новых запросов.

Плюсы: возможность более четкого понимания клиент-серверного общения; будущая возможность обучения ИИ для клиент-серверного взаимодействия.

Минусы: дополнительная нагрузка на передачу и парсинг данных. 

Пример:
curl -X POST \
-H "Verification: $MARKETPLACE_SIGN" \
-H "Authorization: Bearer $JWT_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/schema+json" \
--data '{"jsonrpc":"2.0","method":"ping","params": $ACTION_JSONLD,"id":1}' \
http://127.0.0.1:9000/api

Где MARKETPLACE_SIGN - ключ подключенного ассистента;
JWT_TOKEN - токен приложения;
ACTION_JSONLD - вида:
{
'@context': {
      mainEntity: 'schema:mainEntity',
      schema: 'http://schema.org/',
      agent: 'schema:agent',
      name: 'schema:name',
      startTime: 'schema:startTime',
      object: 'schema:object',
      target: 'schema:target',
      result: 'schema:result',
      actionApplication: 'schema:actionApplication',
      subjectOf: 'schema:subjectOf',
      abstract: 'schema:abstract',
      description: 'schema:description',
      instrument: 'schema:instrument',
      encodingFormat: 'schema:encodingFormat',
      identifier: 'schema:identifier',
      provider: 'schema:provider',
      participant: 'schema:participant',
      value: 'schema:value',
      url: 'schema:url',
      email: 'schema:email',
      geo: 'schema:geo',
      addressCountry: 'schema:Country',
      addressLocality: 'schema:Text',
      addressRegion: 'schema:Text',
      streetAddress: 'schema:Text',
      postalCode: 'schema:Text',
      address: 'schema:address',
      latitude: 'schema:latitude',
      longitude: 'schema:longitude'
    },
    '@id': 'https://t.me/chat#100326480',
    agent: { '@type': 'Organization', email: 'tg@gotointeractive.com' },
    participant: { '@type': 'Organization', email: 'posrednik@example.com' },
    startTime: '2020-06-15',
    instrument: {
      '@type': 'Thing',
      name: 'Core',
      url: 'https://github.com/gotois/core'
    },
    target: { '@type': 'EntryPoint', actionApplication: [Object] },
    '@type': 'AllocateAction',
    name: 'Ping',
    result: {
      '@type': 'CreativeWork',
      encodingFormat: 'text/plain',
      mainEntity: [Array]
    },
    'https://w3id.org/security#proof': { '@graph': [Object] }
}


 22 июн. 2020 г.

Информация про файлы и ссылки в сети

Все веб отображение можно разделить на две основные сущности: ссылки и файлы (они очень удобно встраиваются в парадигму программирования, с их ссылками на объекты и сами объекты). В концепции современной сети, файлы должны иметь документы (например JSON-LD) в которых будет необходимое описание файла в текстовом виде. Это значит, что веб стремится формировать ссылки на документы, вместо файлов и называть их можно интерфейсом. Что это значит для веба?

Прежний сценарий вида URL → FILE (TEXT/Binary) заменяется на новый URL → Document (JSONLD) → FILE (Binary).

- Что это значит для ProstoDiary?
Файлы не будут сохраняться, все ресурсы будут оставаться в том приложении ассистенте, где они были созданы. Для разработчиков ассистентов это значит что можно не присылать боту ProstoDiary этот файл, ограничившись только проверенным документом JSONLD.

- Каким образом другие приложения станут отправлять документы JSONLD?
обозначил путь для внедрения интерфейса OpenAPI построенного на Action Schema.org.

- Что если File перестанет хостится в приложении?
Пользователь не сможет получить “сырые данные”, но у него останется вся история будто они есть. Это значит, например, что загруженная фотография исчезнет, но через бота можно будет узнать: погоду в момент снимка, число людей на снимке, и прочую метаинформацию. Возможно в будущем слияние множества метаинформации будет способно воссоздать утерянную фотографию.