Телеграмм бот на Java. Часть 2
Доброго времени суток уважаемые подписчики, а также не менее уважаемые участники портала Голос!
Как вы уже поняли, это 2 часть моих мытарств по написанию телеграмм бота на Java. Как и говорил раньше, я хочу добавить в своего бота выдачу информации с криптовалютной биржи. Так я по большей части торгую (точнее пытаюсь торговать) на Bittrex.com, то с нее я и начну.
Итак, для начала я прошел по ссылке https://bittrex.com/Home/Api, для того чтобы узнать какие api запросы поддерживает биржа. Список я приводить не буду, вы сами можете с ним ознакомиться по ссылке. Api биржи делятся на 3 категории:
- Public - публичные, то есть доступные любому. Для их использования не нужно авторизоваться, но и толку для меня особо никакого от них нет :) С их помощью можно посмотреть список альткоинов, их курсы и т.д.
- Account - позволяют запрашивать баланс аккаунта, открытые ордера, адреса кошельков и т.д. Вот эта группа как-раз мне и нужна. Для использования этих запросов нужно получить ключи в своем личном кабинете на бирже.
- Market - позволяет размещать ордера, то бишь торговать удаленно. На данный момент меня это не интересует, да и сами разработчики советуют использовать эту группу ключей с большой аккуратностью. Также требуется получение секретных ключей в личном кабинете.
Как я уже сказал, нужно получить секретные ключи для удаленной авторизации на бирже. Это можно сделать в личном кабинет, перейдя в настройки и выбрав пункт API Keys. Но сначала вам обязательно нужно включить двухфакторную авторизацию.
А вот потом выяснилось самое интересное :) Оказывается, для того чтобы сделать запрос на биржу, его нужно предварительно зашифровать по стандарту HMAC-SHA512. Так как я никогда не сталкивался с криптографией, то я полез гуглить примеры работы с Bittrex. И оказалось, что существует несколько библиотек под Java, для работы с этой биржей. Но тут опять появилась проблема, все они были не в виде jar файла, а в виде папки с исходниками. Пришлось снова активно гуглить и выяснять как добавлять такого рода библиотеки, а также учитывать зависимости для них. После нескольких проб и ошибок я наконец смог заставить работать билиотеку от platelminto в своем проекте. Признаюсь, что пока что заработал тестовый пример, приведенный самим автором и информацию полученную от биржи он выдает в консоль в виде JSON объектов. Так что разбор результата и выдачу его с помощью бота в телеграмм я буду описывать в следующей части. А пока что я постараюсь объяснить как же все-таки добавить библиотеку в проект.
Для начала нам нужно скачать библиотеку себе на диск. Переходим по ссылке https://github.com/platelminto/java-bittrex и кликаем на Clone of downloads, скачивая копию архива. Распаковываем архив куда вам удобно, далее идем в Intellij IDEA - File - Project Structure - Modules и справа выбираем вкладку Sources далее нажимаем на +Add Content Root и выбираем нашу папку с библиотекой
Для работы этой библиотеки нужно будет установить еще Google gson и Apache HttpClient. Поэтому не закрывая настройки, слева выбираем Libraries, в центральной колонке жмем зеленый + и в выпадающем списке выбираем From Maven, появляется окошко
в строке поиска вбиваем google gson и выбираем последнюю версию, я поставил галку напротив Download to и указал папку куда скачается библиотека, вы можете этого не делать, но тогда если вам в следующий раз нужна будет эта библиотека, то придется ее заново искать и добавлять. Таким же образом добавляем и Apache HttpClient. С установкой библиотек мы закончили.
Теперь в папке с нашим проектом бота нужно создать текстовый файл с именем keys.txt, в который копипастим наши ключи от биржи вот в таком формате:
apikey: "key"
secret: "secret"
Как я уже сказал, свой код для запросов я пока что не писал, заморачивался с поиском и установкой библиотек, поэтому я просто взял готовый пример который запрашивает адреса и балансы с вашего аккаунта на бирже:
/**
* Created by Kovatelj on 06.07.2017.
*/
import org.telegram.telegrambots.ApiContextInitializer;
import org.telegram.telegrambots.TelegramBotsApi;
import org.telegram.telegrambots.exceptions.TelegramApiRequestException;
import java.util.HashMap;
import java.util.List;
public class Main {
public static void main(String[] args) {
ApiContextInitializer.init();
TelegramBotsApi botsApi = new TelegramBotsApi();
try {
botsApi.registerBot(new telegramBot());
} catch (TelegramApiRequestException e) {
e.printStackTrace();
}
Bittrex wrapper = new Bittrex();
wrapper.setAuthKeysFromTextFile("keys.txt");
String rawResponse = wrapper.getMarketSummary("BTC-LTC");
List<HashMap<String, String>> responseMapList = Bittrex.getMapsFromResponse(rawResponse);
// In some cases, only 1 map is actually returned - if this is assured:
HashMap<String, String> onlyMap = responseMapList.get(0);
// See available information using present keys
for (String key : onlyMap.keySet())
System.out.print(key + " ");
System.out.println();
// Get wanted value using a key found in the KeySet
onlyMap.get("Volume");
// Some responses have more than 1 map - the List must be traversed in these cases.
String otherRawResponse = wrapper.getBalances();
List<HashMap<String, String>> allBalancesMapList = Bittrex.getMapsFromResponse(otherRawResponse);
for (HashMap<String, String> map : allBalancesMapList)
System.out.println(map);
// And then the wanted map can be used
allBalancesMapList.get(3).get("Balance");
}
}
Результат в консоли должен выглядеть примерно вот так
High MarketName BaseVolume PrevDay TimeStamp Created Last OpenSellOrders Low Volume OpenBuyOrders Ask Bid
{CryptoAddress=be034d58d24e47279f42c28ab1360dba06a01b87d398424b9b2c823484520a59, Currency=ARDR, Available=0.02223057, Balance=0.02223057, Pending=0.00000000}
{CryptoAddress=iN7ZbZBG46FSPBruaGGeZzYBgoewiLEaQn, Currency=BSD, Available=0.00000000, Balance=50.80618000, Pending=0.00000000}
То есть как видите это набор JSON объектов. Работу по их разбору я выложу в следующий раз.
Всем спасибо за внимание, не забывайте на меня подписываться :)