1.14okex网站汇率抓取代码参考
<p>@Service
@Slf4j
public class OkexExchangePrice implements CoinPriceFetchService {
@Value("#{'${okex.url}'.split(',')}")
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<String, String> buildHeader() {
Map<String, String> headers = new HashMap<>();
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("&quoteCurrency=").append(currency);
s.append("&baseCurrency=").append(assetType);
s.append("&side=").append(sellOrBuy.equals("sell")?"buy":"sell");
s.append("&paymentMethod=all&userType=all&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<String, String> headers = buildHeader();
String responseString;
try {
int size = okexUrlList.size();
if (index >= size) {
index = 0;
}
/*https://www.okex.com/v3/c2c/tradingOrders/book?t=1605285545917&quoteCurrency=CNY&baseCurrency=BTC&side=sell&paymentMethod=all&userType=all&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)&&jsonArr.size()>0){
//获取前20条挂单数据
if(AssetType.USDT.equals(assetType)&&currency.equals(AssetType.CNY.getSymbol())){
List<CommonExchageResp> exchanges = jsonArr.stream().map(js -> {
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)&&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&quoteCurrency=CNY&baseCurrency=USDT&side=buy&paymentMethod=all&userType=all&showTrade=false&urlId=1
*会员购买数币时参数,价格由低到高5.04到5.98,第一条即为okex网站卖出一价
* t=1605444186022&quoteCurrency=CNY&baseCurrency=USDT&side=sell&paymentMethod=all&userType=all&showTrade=false
* */
try {
Map<String, String> headers = buildHeader();
String url = null;//"https://www.okx.com/v3/c2c/tradingOrders/books?t=" + now + "&quoteCurrency=USD&baseCurrency=USDT&side=sell&paymentMethod=all&userType=all";
url="https://www.okx.com/v3/c2c/tradingOrders/books?t=1645793891626&quoteCurrency=CNY&baseCurrency=USDT&side=sell&paymentMethod=all&userType=all&showTrade=false&receivingAds=false&showFollow=false&showAlreadyTraded=false&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->{
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>