ybf

ybf


1.14okex网站汇率抓取代码参考

<p>@Service @Slf4j public class OkexExchangePrice implements CoinPriceFetchService { @Value(&quot;#{'${okex.url}'.split(',')}&quot;) private List<String> okexUrlList;</p> <pre><code>private int index = 0; private final BaseExchangeRateServiceImpl baseExchangeRateService; private final ExchangeRateCheckService exchangeRateService; private final CoinDisposeExchangePrice coinDisposeExchangePrice; private final DisposeRateDataService disposeRateDataService; private final ExchangeRateStatService exchangeRateStatService; @Autowired public OkexExchangePrice(BaseExchangeRateServiceImpl baseExchangeRateService , ExchangeRateCheckService exchangeRateService, CoinDisposeExchangePrice coinDisposeExchangePrice , DisposeRateDataService disposeRateDataService,ExchangeRateStatService exchangeRateStatService ) { this.baseExchangeRateService = baseExchangeRateService; this.exchangeRateService = exchangeRateService; this.coinDisposeExchangePrice = coinDisposeExchangePrice; this.disposeRateDataService=disposeRateDataService; this.exchangeRateStatService=exchangeRateStatService; } private static Map&lt;String, String&gt; buildHeader() { Map&lt;String, String&gt; headers = new HashMap&lt;&gt;(); headers.put("accept", "application/json"); headers.put(":method", "GET"); headers.put("app-type", "web"); headers.put("accept-language", "zh-CN,zh;q=0.9"); headers.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36"); headers.put("x-cdn", "https://static.okex.com"); return headers; } private static String buildParams(String sellOrBuy, String assetType, String currency, long start) { StringBuilder s = new StringBuilder("?t="); s.append(start); s.append("&amp;quoteCurrency=").append(currency); s.append("&amp;baseCurrency=").append(assetType); s.append("&amp;side=").append(sellOrBuy.equals("sell")?"buy":"sell"); s.append("&amp;paymentMethod=all&amp;userType=all&amp;showTrade=false"); return s.toString(); } @Override public void fetchPriceJsonAndSave() { //取卖一价 getAndSavePriceInfo(AssetType.USDT, "sell", "CNY"); //取买一价 getAndSavePriceInfo(AssetType.USDT, "buy", "CNY"); //取卖一价 getAndSavePriceInfo(AssetType.BTC, "sell", "CNY"); //取买一价 getAndSavePriceInfo(AssetType.BTC, "buy", "CNY"); //取卖一价 getAndSavePriceInfo(AssetType.USDT, "sell", "USD"); //取买一价 getAndSavePriceInfo(AssetType.USDT, "buy", "USD"); } private void getAndSavePriceInfo(AssetType assetType, String sellOrBuy, String currency) { long start = System.currentTimeMillis(); Map&lt;String, String&gt; headers = buildHeader(); String responseString; try { int size = okexUrlList.size(); if (index &gt;= size) { index = 0; } /*https://www.okex.com/v3/c2c/tradingOrders/book?t=1605285545917&amp;quoteCurrency=CNY&amp;baseCurrency=BTC&amp;side=sell&amp;paymentMethod=all&amp;userType=all&amp;showTrade=false*/ String url = okexUrlList.get(index++) + buildParams(sellOrBuy, assetType.getSymbol(), currency, start); log.info("Okex抓取url:{}", url); responseString = HttpClientUtils.getUseProxy(url, headers); /*log.info("获取Okex网{}币价信息:\n{}", assetType.getSymbol(), responseString);*/ } catch (Exception e) { log.warn("获取Okex网{}币价信息失败:{}", assetType.getSymbol(), e.getMessage()); responseString = e.getMessage(); } long duration = System.currentTimeMillis() - start; /*即使没有获取到价格信息,也要记录一条空数据*/ parseAndSave(sellOrBuy, responseString, assetType, currency,duration); } private void parseAndSave(String sellOrBuy, String responseString, AssetType assetType,String currency, long duration) { BigDecimal thePrice = null; Integer directionCode = null; ApiInfoEnum apiInfoEnum = null; apiInfoEnum = getApiInfoEnum(assetType, sellOrBuy, currency); if (StringUtils.isNotBlank(responseString)) { try { JSONObject jsonObject = JSONObject.parseObject(responseString).getJSONObject("data"); if (null != jsonObject) { if ("buy".equals(sellOrBuy)) { log.info("Okx抓取到的{}买一价为:{}", assetType, thePrice); directionCode = BUY_DIRECTION; } if ("sell".equals(sellOrBuy)) { log.info("Okx抓取到的{}卖一价为:{}", assetType, thePrice); directionCode = SELL_DIRECTION; } JSONArray jsonArr = jsonObject.getJSONArray(sellOrBuy.equals("sell")?"buy":"sell"); if(Objects.nonNull(jsonArr)&amp;&amp;jsonArr.size()&gt;0){ //获取前20条挂单数据 if(AssetType.USDT.equals(assetType)&amp;&amp;currency.equals(AssetType.CNY.getSymbol())){ List&lt;CommonExchageResp&gt; exchanges = jsonArr.stream().map(js -&gt; { CommonExchageResp commonExchageResp = new CommonExchageResp(); commonExchageResp.setPrice(new BigDecimal(((JSONObject) js).getString("price"))); commonExchageResp.setPendingOrderVolume(new BigDecimal(((JSONObject) js).getString("availableAmount"))); commonExchageResp.setDownLimit(new BigDecimal(((JSONObject) js).getString("quoteMinAmountPerOrder"))); commonExchageResp.setUpLimit(new BigDecimal(((JSONObject) js).getString("quoteMaxAmountPerOrder"))); commonExchageResp.setTradingVolume(Integer.parseInt(((JSONObject) js).getString("completedOrderQuantity"))); commonExchageResp.setCloseRate(new BigDecimal(((JSONObject) js).getString("completedRate"))); commonExchageResp.setPriceUnit(AssetType.CNY.getSymbol()); return commonExchageResp; }).limit(20).collect(Collectors.toList()); //获取有效汇率 CommonExchageResp filterExchangeRate = disposeRateDataService .disposeRateData(PatformKeyEnum.OKX,TradeDirectionEnum.valueOf(directionCode), exchanges); log.info("【Okx】汇率过滤,{},原始汇率条数:{},有效汇率:{}", apiInfoEnum.getDescription(), exchanges.size(), JSON.toJSONString(filterExchangeRate)); if(Objects.nonNull(filterExchangeRate)){ thePrice=filterExchangeRate.getPrice(); } //保存第一条和第六条数据价格,以便运营进行分析 exchangeRateStatService.saveExchangeRateStat(sellOrBuy,RateSourceEnum.OKEX.getMsg(),exchanges,thePrice); }else{ JSONObject jsonObj = jsonArr.getJSONObject(0); thePrice = new BigDecimal(jsonObj.getString("price")); } } } log.info("Okx抓取到的{}价格为:{}", assetType, thePrice); } catch (Exception e) { log.warn("Okx数据格式异常:{}", e.getMessage()); } } try { BaseExchangeRateHistoryDTO baseExchangeRateHistoryDTO = new BaseExchangeRateHistoryDTO(); baseExchangeRateHistoryDTO.setCoinType(assetType); if(AssetType.USDT.equals(assetType)){ if(AssetType.USD.getSymbol().equals(currency)){ baseExchangeRateHistoryDTO.setPriceTrading(RateTradingEnum.USD_USDT); baseExchangeRateHistoryDTO.setPriceUnit(AssetType.USD); }else{ baseExchangeRateHistoryDTO.setPriceTrading(RateTradingEnum.CNY_USDT); baseExchangeRateHistoryDTO.setPriceUnit(AssetType.CNY); } } if(AssetType.BTC.equals(assetType)){ baseExchangeRateHistoryDTO.setPriceTrading(RateTradingEnum.CNY_BTC); baseExchangeRateHistoryDTO.setPriceUnit(AssetType.CNY); } baseExchangeRateHistoryDTO.setDuration(duration); baseExchangeRateHistoryDTO.setResponse(responseString); baseExchangeRateHistoryDTO.setPrice(thePrice); baseExchangeRateHistoryDTO.setDirection(directionCode); baseExchangeRateHistoryDTO.setApiInfo(apiInfoEnum); baseExchangeRateHistoryDTO.setApiSource(RateSourceEnum.OKEX); log.info("Okex抓取baseExchangeRateHistoryDTO: {}", JacksonUtils.desJson(baseExchangeRateHistoryDTO)); baseExchangeRateService.mergeBaseExchangeRate(baseExchangeRateHistoryDTO, true); //转换USD-CNY if(AssetType.USDT.equals(assetType)&amp;&amp;AssetType.USD.getSymbol().equals(currency)){ coinDisposeExchangePrice.fetchPriceJsonAndSave(AssetType.USD.getSymbol(), RateSourceEnum.OKEX.getMsg()); } } catch (Exception e) { log.error("Okex汇率更新失败:{}", e.getMessage()); } } private void checkPrice(AssetType assetType, BigDecimal thePrice, ApiInfoEnum apiInfoEnum, Integer sellDirection) { exchangeRateService.checkPrice(assetType, thePrice); } private ApiInfoEnum getApiInfoEnum(AssetType assetType, String sellOrBuy, String currency) { ApiInfoEnum apiInfoEnum = null; if ("buy".equals(sellOrBuy)) { if (AssetType.USDT.equals(assetType)) { if(AssetType.CNY.getSymbol().equals(currency)){ apiInfoEnum = OKEX_OTC_USDT_FIRST_BUY_PRICE; } if(AssetType.USD.getSymbol().equals(currency)){ apiInfoEnum = OKEX_USD_USDT_FIRST_BUY_PRICE; } } else if (AssetType.BTC.equals(assetType)) { apiInfoEnum = OKEX_OTC_BTC_FIRST_BUY_PRICE; } } else { if (AssetType.USDT.equals(assetType)) { if(AssetType.CNY.getSymbol().equals(currency)){ apiInfoEnum = OKEX_OTC_USDT_FIRST_SELL_PRICE; } if(AssetType.USD.getSymbol().equals(currency)){ apiInfoEnum = OKEX_USD_USDT_FIRST_SELL_PRICE; } } else if (AssetType.BTC.equals(assetType)) { apiInfoEnum = OKEX_OTC_BTC_FIRST_SELL_PRICE; } } return apiInfoEnum; } public static void main(String[] args) { long now = System.currentTimeMillis(); /* * https://www.okex.com/v3/c2c/tradingOrders/book? * 会员出售数币时参数,价格由高到低:5.02到5.00,第一条即为okex网站买入一价 * t=1605444088527&amp;quoteCurrency=CNY&amp;baseCurrency=USDT&amp;side=buy&amp;paymentMethod=all&amp;userType=all&amp;showTrade=false&amp;urlId=1 *会员购买数币时参数,价格由低到高5.04到5.98,第一条即为okex网站卖出一价 * t=1605444186022&amp;quoteCurrency=CNY&amp;baseCurrency=USDT&amp;side=sell&amp;paymentMethod=all&amp;userType=all&amp;showTrade=false * */ try { Map&lt;String, String&gt; headers = buildHeader(); String url = null;//"https://www.okx.com/v3/c2c/tradingOrders/books?t=" + now + "&amp;quoteCurrency=USD&amp;baseCurrency=USDT&amp;side=sell&amp;paymentMethod=all&amp;userType=all"; url="https://www.okx.com/v3/c2c/tradingOrders/books?t=1645793891626&amp;quoteCurrency=CNY&amp;baseCurrency=USDT&amp;side=sell&amp;paymentMethod=all&amp;userType=all&amp;showTrade=false&amp;receivingAds=false&amp;showFollow=false&amp;showAlreadyTraded=false&amp;isAbleFilter=false";</code></pre> <p>// String result = HttpClientUtils.getUseProxy(url, headers);</p> <pre><code> String responseString = HttpClientUtils.get(url); System.out.println(responseString); JSONObject jsonObject = JSONObject.parseObject(responseString).getJSONObject("data"); JSONArray jsonArr = jsonObject.getJSONArray("buy".equals("sell")?"buy":"sell"); jsonArr.stream().map(js-&gt;{ System.out.println( " 单价:"+((JSONObject) js).getString("price") +" 数量:"+((JSONObject) js).get("availableAmount") +" 限额:"+((JSONObject) js).getString("quoteMinAmountPerOrder")+"~"+((JSONObject) js).getString("quoteMaxAmountPerOrder") +" 成交量:"+((JSONObject) js).getString("completedOrderQuantity") +" 成交率:"+((JSONObject) js).getString("completedRate") ); return null; }).limit(20).collect(Collectors.toList()); } catch (Exception e) { log.error("获取Okex币价信息失败:{}", e.getMessage()); } }</code></pre> <p>}</p>

页面列表

ITEM_HTML