К торговому роботу надо было приделать какие-то уведомления, видел кучу вариантов разной степени извращённости, но ни одного адекватного и изящного. На форуме Арки вообще к решению так и не пришли :)
Для себя сделал простой выбор —
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, использую отдельный класс и парсю пришедшие сообщения через него.
Естественно, получение только по своему же запросу. Можно сгородить и постоянное подключение (обычный мессенджер по сути), и вебхуки, это всё у Слака есть. Но мне не надо, мне нужна максимальная простота.
Парсинг ответа, да, пожалуй, геммор.
Но если просто уведомление, то вопрос ответа решается мобильным Квик — это не делал.
ЗЫ в мобильный Квик зайти не дадут.)
Например, у меня для телеграма нормально работает только приложение под win10 и андроид. Под линуксом иногда приходится самому искать прокси, под win10 mobile просто иногда неделями не работает, скорее всего по той же причине.
В общем, не рекомендую, если вы в России и нет VPN.