package org.ripple.power.txns.btc; import java.util.ArrayList; import java.util.Collections; import java.util.Locale; import org.json.JSONArray; import org.json.JSONObject; import org.ripple.power.utils.HttpRequest; //not included in China can not be linked site public class BTCStoreQuery { private final static ArrayList<BTCPrice> _usdList = new ArrayList<BTCPrice>( 40); private final static ArrayList<BTCPrice> _cnyList = new ArrayList<BTCPrice>( 40); private final static ArrayList<BTCPrice> _jpyList = new ArrayList<BTCPrice>( 40); private final static ArrayList<BTCPrice> _eurList = new ArrayList<BTCPrice>( 40); private final static ArrayList<BTCPrice> _cadList = new ArrayList<BTCPrice>( 40); static { _cnyList.add(new BTCPrice(BTCStore.LAKEBTC)); _cnyList.add(new BTCPrice(BTCStore.JUSTCOIN)); _cnyList.add(new BTCPrice(BTCStore.BTC_CHINA)); _cnyList.add(new BTCPrice(BTCStore.COINBASE)); _cnyList.add(new BTCPrice(BTCStore.HUOBI)); _cnyList.add(new BTCPrice(BTCStore.OKCOIN)); _cnyList.add(new BTCPrice(BTCStore.BTC38)); _cnyList.add(new BTCPrice(BTCStore.BTER)); _cnyList.add(new BTCPrice(BTCStore.BITCOIN_AVERAGE)); _cnyList.add(new BTCPrice(BTCStore.BITCOIN_AVERAGE_GLOBAL)); _jpyList.add(new BTCPrice(BTCStore.COINBASE)); _jpyList.add(new BTCPrice(BTCStore.BITCOIN_AVERAGE_GLOBAL)); _jpyList.add(new BTCPrice(BTCStore.BITPAY)); _jpyList.add(new BTCPrice(BTCStore.JUSTCOIN)); _jpyList.add(new BTCPrice(BTCStore.KRAKEN)); _usdList.add(new BTCPrice(BTCStore.BITSTAMP)); _usdList.add(new BTCPrice(BTCStore.COINBASE)); _usdList.add(new BTCPrice(BTCStore.OKCOIN)); _usdList.add(new BTCPrice(BTCStore.BITCOIN_AVERAGE)); _usdList.add(new BTCPrice(BTCStore.BITCUREX)); _usdList.add(new BTCPrice(BTCStore.BITFINEX)); _usdList.add(new BTCPrice(BTCStore.BITCOIN_AVERAGE_GLOBAL)); _usdList.add(new BTCPrice(BTCStore.BITPAY)); _usdList.add(new BTCPrice(BTCStore.KRAKEN)); _usdList.add(new BTCPrice(BTCStore.JUSTCOIN)); _usdList.add(new BTCPrice(BTCStore.LAKEBTC)); _usdList.add(new BTCPrice(BTCStore.CRYPTSY)); _usdList.add(new BTCPrice(BTCStore.BITBAY)); _usdList.add(new BTCPrice(BTCStore.CEXIO)); _usdList.add(new BTCPrice(BTCStore.ITBIT)); _usdList.add(new BTCPrice(BTCStore.INDEPENDENT_RESERVER)); _usdList.add(new BTCPrice(BTCStore.QUADRIGA)); _eurList.add(new BTCPrice(BTCStore.COINBASE)); _eurList.add(new BTCPrice(BTCStore.BITCOIN_AVERAGE)); _eurList.add(new BTCPrice(BTCStore.BITCUREX)); _eurList.add(new BTCPrice(BTCStore.BITCOIN_AVERAGE_GLOBAL)); _eurList.add(new BTCPrice(BTCStore.BITPAY)); _eurList.add(new BTCPrice(BTCStore.KRAKEN)); _eurList.add(new BTCPrice(BTCStore.JUSTCOIN)); _eurList.add(new BTCPrice(BTCStore.CEXIO)); _eurList.add(new BTCPrice(BTCStore.ITBIT)); _eurList.add(new BTCPrice(BTCStore.PAYMIUM)); _eurList.add(new BTCPrice(BTCStore.ZYADO)); _eurList.add(new BTCPrice(BTCStore.CLEVERCOIN)); _cadList.add(new BTCPrice(BTCStore.COINBASE)); _cadList.add(new BTCPrice(BTCStore.BITCOIN_AVERAGE)); _cadList.add(new BTCPrice(BTCStore.BITCOIN_AVERAGE_GLOBAL)); _cadList.add(new BTCPrice(BTCStore.BITPAY)); _cadList.add(new BTCPrice(BTCStore.JUSTCOIN)); _cadList.add(new BTCPrice(BTCStore.QUADRIGA)); _cadList.add(new BTCPrice(BTCStore.VIRTEX)); } final static String BITSTAMP = "https://www.bitstamp.net/api/ticker/"; final static String BTC38 = "http://api.btc38.com/v1/ticker.php?c=btc"; final static String BTER = "http://data.bter.com/api/1/ticker/btc_cny"; final static String COINBASE = "https://coinbase.com/api/v1/prices/spot_rate?currency=%s"; final static String BITCOIN_AVERAGE = "https://api.bitcoinaverage.com/ticker/%s"; final static String BITCOINDE = "https://bitcoinapi.de/widget/current-btc-price/rate.json"; final static String BITCUREX = "https://bitcurex.com/api/%s/ticker.json"; final static String BITFINEX = "https://api.bitfinex.com/v1/ticker/btcusd"; final static String BITCOIN_AVERAGE_GLOBAL = "https://api.bitcoinaverage.com/ticker/global/%s"; final static String BTC_CHINA = "https://data.btcchina.com/data/ticker?market=btccny"; final static String BITPAY = "https://bitpay.com/api/rates"; final static String KRAKEN = "https://api.kraken.com/0/public/Ticker?pair=XBT%s"; final static String BTCTURK = "https://www.btcturk.com/api/ticker"; final static String VIRTEX = "https://cavirtex.com/api2/ticker.json"; final static String JUSTCOIN = "https://justcoin.com/api/2/BTC%s/money/ticker"; final static String LAKEBTC = "https://www.lakebtc.com/api_v1/ticker"; final static String CRYPTONIT = "http://cryptonit.net/apiv2/rest/public/ccorder.json?bid_currency=usd&ask_currency=btc&ticker"; final static String COINTREE = "https://www.cointree.com.au/api/price/btc/aud"; final static String BTCMARKETS = "https://api.btcmarkets.net/market/BTC/AUD/tick"; final static String HUOBI = "http://market.huobi.com/staticmarket/ticker_btc_json.js"; final static String KORBIT = "https://api.korbit.co.kr/v1/ticker/detailed"; final static String PAYMIUM = "https://paymium.com/api/v1/data/eur/ticker"; final static String BITSO = "https://api.bitso.com/public/info"; final static String ZYADO = "http://chart.zyado.com/ticker.json"; final static String CRYPTSY = "https://www.cryptsy.com/trades/ajaxlasttrades"; final static String BITBAY = "https://bitbay.net/API/Public/BTC%s/ticker.json"; final static String CEXIO = "https://cex.io/api/last_price/BTC/%s"; final static String HITBTC = "https://api.hitbtc.com/api/1/public/BTC%s/ticker"; final static String ITBIT = "https://api.itbit.com/v1/markets/XBT%s/ticker"; final static String BITCOINCOID = "https://vip.bitcoin.co.id/api/BTC_IDR/ticker/"; final static String FOXBIT = "https://api.blinktrade.com/api/v1/BRL/ticker?crypto_currency=BTC"; final static String INDEPENDENT_RESERVER = "https://api.independentreserve.com/Public/GetMarketSummary?primaryCurrencyCode=xbt&secondaryCurrencyCode=%s"; final static String CLEVERCOIN = "https://api.clevercoin.com/v1/ticker"; final static String BITMARKET24 = "https://bitmarket24.pl/api/BTC_PLN/status.json"; final static String QUADRIGA = "https://api.quadrigacx.com/v2/ticker?book=BTC_%s"; final static String GATECOIN = "https://www.gatecoin.com/api/Public/LiveTicker/BTC%s"; final static String MEXBT = "https://data.mexbt.com/ticker/btc%s"; final static String OKCOIN_USD = "https://www.okcoin.com/api/ticker.do?ok=1"; final static String OKCOIN_CNY = "https://www.okcoin.cn/api/ticker.do?ok=1"; private String _cur = "USD"; public BTCStoreQuery(String cur) { this._cur = cur; } public String get(BTCStore store) { String result = "unkown"; try { switch (store) { case BITSTAMP: result = HttpRequest.getHttps(BTCStoreQuery.BITSTAMP); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; case BTC38: result = HttpRequest.getHttps(BTCStoreQuery.BTC38); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optJSONObject("ticker").optString("last"); } break; case BTER: result = HttpRequest.getHttps(BTCStoreQuery.BTER); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; case COINBASE: result = HttpRequest.getHttps(String.format( BTCStoreQuery.COINBASE, _cur)); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("amount"); } break; case BITCOIN_AVERAGE: result = HttpRequest.getHttps(String.format( BTCStoreQuery.BITCOIN_AVERAGE, _cur)); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; case BITCOINDE: result = HttpRequest.getHttps(BTCStoreQuery.BITCOINDE); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); String price = obj.optString("price_eur"); String[] amount = price.split("\\s"); return amount[0].replaceAll(",", "."); } break; case BITCUREX: result = HttpRequest.getHttps(String.format( BTCStoreQuery.BITCUREX, _cur)); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); return obj.optString("last_tx_price_h"); } break; case BITFINEX: result = HttpRequest.getHttps(BTCStoreQuery.BITFINEX); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); return obj.optString("last_price"); } break; case BITCOIN_AVERAGE_GLOBAL: result = HttpRequest.getHttps(String.format( BTCStoreQuery.BITCOIN_AVERAGE_GLOBAL, _cur)); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); return obj.optString("last"); } break; case BTC_CHINA: result = HttpRequest.getHttps(BTCStoreQuery.BTC_CHINA); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); return obj.optJSONObject("ticker").optString("last"); } break; case BITPAY: result = HttpRequest.getHttps(BTCStoreQuery.BITPAY); if (result != null && result.indexOf("error") == -1) { JSONArray array = new JSONArray(result); for (int i = 0; i < array.length(); i++) { JSONObject obj = array.getJSONObject(i); if (_cur.equals(obj.getString("code"))) { return String.valueOf(obj.optDouble("rate")); } } } break; case KRAKEN: result = HttpRequest.getHttps(String.format( BTCStoreQuery.KRAKEN, _cur)); if (result != null && result.indexOf("\"c\":") != -1) { JSONObject obj = new JSONObject(result); JSONObject obj2 = obj.optJSONObject("result") .optJSONObject("XXBTZ" + _cur); result = (String) obj2.optJSONArray("c").get(0); } break; case BTCTURK: result = HttpRequest.getHttps(BTCStoreQuery.BTCTURK); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; case VIRTEX: result = HttpRequest.getHttps(BTCStoreQuery.VIRTEX); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optJSONObject("ticker") .optJSONObject("BTCCAD").optString("last"); } break; case JUSTCOIN: result = HttpRequest.getHttps(String.format( BTCStoreQuery.JUSTCOIN, _cur)); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optJSONObject("data").optJSONObject("last") .optString("value"); } break; case LAKEBTC: result = HttpRequest.getHttps(BTCStoreQuery.LAKEBTC); if (result != null && result.indexOf("error") == -1 && result.indexOf(_cur) != -1) { JSONObject obj = new JSONObject(result); result = String.valueOf(obj.optJSONObject(_cur).optDouble( "last")); } break; case CRYPTONIT: result = HttpRequest.getHttps(BTCStoreQuery.CRYPTONIT); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optJSONObject("rate").optString("last"); } break; case COINTREE: result = HttpRequest.getHttps(BTCStoreQuery.COINTREE); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("Spot"); } break; case BTCMARKETS: result = HttpRequest.getHttps(BTCStoreQuery.BTCMARKETS); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("lastPrice"); } break; case HUOBI: result = HttpRequest.getHttps(BTCStoreQuery.HUOBI); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optJSONObject("ticker").optString("last"); } break; case KORBIT: result = HttpRequest.getHttps(BTCStoreQuery.KORBIT); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; case PAYMIUM: result = HttpRequest.getHttps(BTCStoreQuery.PAYMIUM); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("price"); } break; case BITSO: result = HttpRequest.getHttps(BTCStoreQuery.BITSO); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optJSONObject("btc_mxn").optString("rate"); } break; case ZYADO: result = HttpRequest.getHttps(BTCStoreQuery.ZYADO); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; case CRYPTSY: result = HttpRequest.getHttps(BTCStoreQuery.CRYPTSY); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("2"); } break; case BITBAY: result = HttpRequest.getHttps(String.format( BTCStoreQuery.BITBAY, _cur)); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; case CEXIO: result = HttpRequest.getHttps(String.format( BTCStoreQuery.CEXIO, _cur)); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("lprice"); } break; case OKCOIN: if ("cny".equalsIgnoreCase(_cur)) { result = HttpRequest.getHttps(BTCStoreQuery.OKCOIN_CNY); } else { result = HttpRequest.getHttps(BTCStoreQuery.OKCOIN_USD); } if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optJSONObject("ticker").optString("last"); } break; case HITBTC: try { result = HttpRequest.fix_ssl_open(String.format( BTCStoreQuery.HITBTC, _cur)); } catch (Exception e) { result = null; } if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; case ITBIT: result = HttpRequest.getHttps(String.format( BTCStoreQuery.ITBIT, _cur)); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("lastPrice"); } break; case BITCOINCOID: result = HttpRequest.getHttps(BTCStoreQuery.BITCOINCOID); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optJSONObject("ticker").optString("last"); } break; case FOXBIT: result = HttpRequest.getHttps(BTCStoreQuery.FOXBIT); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; case INDEPENDENT_RESERVER: result = HttpRequest.getHttps(String.format( BTCStoreQuery.INDEPENDENT_RESERVER, _cur)); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("LastPrice"); } break; case CLEVERCOIN: result = HttpRequest.getHttps(BTCStoreQuery.CLEVERCOIN); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; case QUADRIGA: result = HttpRequest.getHttps(String.format( BTCStoreQuery.QUADRIGA, _cur)); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; case GATECOIN: result = HttpRequest.getHttps(String.format( BTCStoreQuery.GATECOIN, _cur)); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optJSONObject("ticker").optString("last"); } break; case MEXBT: result = HttpRequest.getHttps(String.format( BTCStoreQuery.MEXBT, _cur.toLowerCase(Locale.US))); if (result != null && result.indexOf("error") == -1) { JSONObject obj = new JSONObject(result); result = obj.optString("last"); } break; default: break; } } catch (Throwable ex) { return result; } if (result.indexOf("http") != -1 || result.indexOf("https") != -1) { return "unkown"; } return result; } public static String getCurrency(String cur, BTCStore store) { return new BTCStoreQuery(cur).get(store); } public static String getCurrency(BTCStore store) { return getCurrency("USD", store); } public static ArrayList<BTCPrice> getPrices(String cur, ArrayList<BTCPrice> prices, BTCMonitor monitor, boolean sort) { ArrayList<BTCPrice> result = new ArrayList<BTCPrice>(prices.size()); for (BTCPrice p : prices) { BTCPrice price = new BTCPrice(p.store, getCurrency(cur, p.store)); if (monitor != null) { monitor.update(price); } result.add(price); } if (sort) { Collections.sort(result); } if (monitor != null) { monitor.end(); } return result; } public static ArrayList<BTCPrice> getUSDPrices(BTCMonitor monitor, boolean sort) { return getPrices("USD", _usdList, monitor, sort); } public static ArrayList<BTCPrice> getCNYPrices(BTCMonitor monitor, boolean sort) { return getPrices("CNY", _cnyList, monitor, sort); } public static ArrayList<BTCPrice> getJPYPrices(BTCMonitor monitor, boolean sort) { return getPrices("JPY", _jpyList, monitor, sort); } public static ArrayList<BTCPrice> getEURPrices(BTCMonitor monitor, boolean sort) { return getPrices("EUR", _eurList, monitor, sort); } public static ArrayList<BTCPrice> getCADPrices(BTCMonitor monitor, boolean sort) { return getPrices("CAD", _cadList, monitor, sort); } }