Блог им. iddqd3n

Отправка уведомлений из QUIK на смартфон

К торговому роботу надо было приделать какие-то уведомления, видел кучу вариантов разной степени извращённости, но ни одного адекватного и изящного. На форуме Арки вообще к решению так и не пришли :)

Для себя сделал простой выбор — Slack. Это что-то типа мессенджера («для рабочих групп», как они говорят) с простым и открытым API, без заморочек вообще. Если не нужно городить мощный функционал с форматированием, аватарками, вложениями и прочим, достаточно двух функций, реализованных через HTTP-запросы, которые можно отправлять хоть curl-ом из системной консоли. Для него полно готовых библиотек на любые ЯП, но мне они показались перегруженными в конкретно моём случае.

В результате написал сам. У меня уже есть watchdog для Квика (на с++), добавил функционал в него. От Слака мне нужны всего два метода — chat.postMessage (отправляет сообщение) и conversations.history (загружает непрочитанные сообщения), это POST и GET запросы соответственно. Всё, буквально две функции, в каждой из которых по одному HTTP-запросу, работы на вечер максимум, если печатать одним пальцем и попутно отвлекаться на что-то ещё. Причём для Слака есть библиотека на Lua, скорее всего можно прямо в Квик запихнуть, но мне нужна именно отдельная софтина, поэтому так.

Также Слак поддерживает ботов сам по себе, не нужно создавать отдельные аккаунты, достаточно создать и прикрепить к чату своё приложение (app в их терминологии — это бот по сути), у приложения будет свой секретный токен, который и используется для авторизации при отправке/получении сообщений. Инструкция на сайте написана для полных профанов, любой разберётся :)

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

В общем, рекомендую.

Напоследок, немного кода для дочитавших до конца :)

Отправка:
std::string autorize = "Authorization: Bearer " + botToken;
std::string msg = "{\"channel\" : \"" + channelID + "\", \"text\" : \"" + message + "\"}";

struct curl_slist* headers = NULL;
headers = curl_slist_append(headers, autorize.c_str());
headers = curl_slist_append(headers, "Content-type: application/json; charset=utf-8");

curl_easy_setopt(curl, CURLOPT_HTTPGET, 0L);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, msg.data());
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, msg.length());
curl_easy_setopt(curl, CURLOPT_URL, "https://slack.com/api/chat.postMessage");
Здесь json отдельным классом генерить не стал, слишком заморочено ради примитивной строки.

Получение:
struct curl_slist* headers = NULL;
headers = curl_slist_append(headers, "Content-type: application/x-www-form-urlencoded; charset=utf-8");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L);
curl_easy_setopt(curl, CURLOPT_POST, 0L);
std::string url = "https://slack.com/api/conversations.history?token=" + botToken
    + "&channel=" + channelID + "&oldest=" + lastTS;
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
lastTS — это таймстамп последнего полученного сообщения, мы его запоминаем отдельно.
И вот тут уже ответ приходит как json, использую отдельный класс и парсю пришедшие сообщения через него.

Естественно, получение только по своему же запросу. Можно сгородить и постоянное подключение (обычный мессенджер по сути), и вебхуки, это всё у Слака есть. Но мне не надо, мне нужна максимальная простота.
  • обсудить на форуме:
  • QUIK
★22
В принципе и на Мейл можно, там всего неск строк на С++. И тоже телефон блюмкать будет.
avatar

3Qu

3Qu, это один из самых первых вариантов, который можно найти прямо на форуме Арки для qlua. Но есть нюансы. Без заморочек с полноценной учёткой и авторизацией есть вероятность, что сообщения будут улетать в спам периодически, а то и постоянно. Плюс вопрос обратного ответа — снова гемор.
avatar

Денис Г.

Денис Г., в спам не будет.
Парсинг ответа, да, пожалуй, геммор.
Но если просто уведомление, то вопрос ответа решается мобильным Квик — это не делал.
ЗЫ в мобильный Квик зайти не дадут.)
avatar

3Qu

Денис Г., к чему такие извращения то?  телеграм-бот через torsocks и будет вам счастье, незачем ставить всякие непонятные шняги то на мобилку
avatar

Petr S

Petr S, как-то к «непонятной шняге» доверия больше, чем к туннелям через тор :)
avatar

Денис Г.

Но мне не надо, мне нужна максимальная простота.
Тогда лучше использовать не Slack, а любой сервис для отправки SMS с HTTP API.

С++ & libcurl — тоже не простейшее решение. Что мешает дёрнуть curl, передав все необходимые аргументы через командную строку? Если нужно несколько нотификаций — пишем shell-скрипт, который отправит sms / email (через какой-нибудь там mutt) / etc, и дёргаем из своего кода этот скрипт.
avatar

Eugene Logunov

Eugene Logunov, ну мне как бы и ответы надо ботом получать :) Т.е. внешнее управление по сути, в т.ч. возможность квик перезапустить.

Кстати, смс я даже не смотрел по другой причине — на форуме Арки этот момент тыкали, у них не вышло найти адекватный сайт с API, там кто-то парсил готовые сайты, а кто-то вообще в комп usb-свисток с симкой втыкал :) Ну а т.к. мне нужны не только алерты, я даже не стал проверять — это они такие кривые, или действительно с этим проблемы.
avatar

Денис Г.

Денис Г., Если нужен интерфейс для управления — тогда сложность оправдана))
на форуме Арки этот момент тыкали, у них не вышло найти адекватный сайт с API, там кто-то парсил готовые сайты
Плохо искали.
avatar

Eugene Logunov

Денис Г., вот удалённые команды это прикольно.
а разве слак совсем бесплатный? я думал он платный, и для юрлиц
avatar

ПBМ

ПBМ, «Your workspace is using the free version of Slack.With 10k searchable messages, 10 apps and integrations, 1-to-1 video calls, and two-factor authentication, the free version gives your team access to Slack’s basic features.»
avatar

Eugene Logunov

ПBМ, пока что денег не просит :) Мне нужен 1 текстовый чат всего.
avatar

Денис Г.

Денис Г., внешнее управление отлично реализуется с помощью подключения через rdp с телефона
avatar

alewmt

А подскажите, возможно сделать отправку такого события как выставленная заявка из Квика в Телеграмм?
avatar

StockGamblers

StockGamblers, теоретически — да. На форуме Арки этот момент пытались сделать как раз :) Но т.к. телеграм у нас забанен, то основной сложностью скорее всего будет не написание бота под него, а внедрение механизма смены периодически подыхающих прокси.

Например, у меня для телеграма нормально работает только приложение под win10 и андроид. Под линуксом иногда приходится самому искать прокси, под win10 mobile просто иногда неделями не работает, скорее всего по той же причине.

В общем, не рекомендую, если вы в России и нет VPN.
avatar

Денис Г.

Денис Г., да телега уже давно нормально работает без впнов у всех ОПСОСов и провайдеров. ПО крайней мере у тех, с которыми я имел дело. Да и ВПН при необходимости не проблема. Тем более он имеется.
avatar

StockGamblers

StockGamblers, ну тогда вам нужен бот для телеграма (у них есть сайт с инструкциями), даже видел реализации на lua, но не пробовал. А внутри квика есть событие на выставление заявки (OnOrder) — остаётся скомбинировать :)
avatar

Денис Г.

StockGamblers, torsocks  решает проблемы и без VPN и без оглядок на опсосов.
avatar

Petr S

Petr S, вот бы еще приблуду, чтобы слала инфу в телегу с квика.
avatar

StockGamblers


теги блога Денис Г.

....все тэги



2010-2020
UPDONW