iddqd3n
iddqd3n личный блог
14 апреля 2020, 18:52

Отправка уведомлений из 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, использую отдельный класс и парсю пришедшие сообщения через него.

Естественно, получение только по своему же запросу. Можно сгородить и постоянное подключение (обычный мессенджер по сути), и вебхуки, это всё у Слака есть. Но мне не надо, мне нужна максимальная простота.
18 Комментариев
  • 3Qu
    14 апреля 2020, 19:00
    В принципе и на Мейл можно, там всего неск строк на С++. И тоже телефон блюмкать будет.
      • 3Qu
        14 апреля 2020, 19:14
        Денис Г., в спам не будет.
        Парсинг ответа, да, пожалуй, геммор.
        Но если просто уведомление, то вопрос ответа решается мобильным Квик — это не делал.
        ЗЫ в мобильный Квик зайти не дадут.)
      • Petr S
        14 апреля 2020, 20:36
        Денис Г., к чему такие извращения то?  телеграм-бот через torsocks и будет вам счастье, незачем ставить всякие непонятные шняги то на мобилку
  • StockGamblers
    14 апреля 2020, 19:10
    А подскажите, возможно сделать отправку такого события как выставленная заявка из Квика в Телеграмм?
      • StockGamblers
        14 апреля 2020, 19:21
        Денис Г., да телега уже давно нормально работает без впнов у всех ОПСОСов и провайдеров. ПО крайней мере у тех, с которыми я имел дело. Да и ВПН при необходимости не проблема. Тем более он имеется.
        • Petr S
          14 апреля 2020, 20:37
          StockGamblers, torsocks  решает проблемы и без VPN и без оглядок на опсосов.
          • StockGamblers
            14 апреля 2020, 21:47
            Petr S, вот бы еще приблуду, чтобы слала инфу в телегу с квика.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн