diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index ab5cdb8..01099d8 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -6,9 +6,7 @@ import cn.stock.market.domain.basic.entity.MoneyStock; import cn.stock.market.domain.basic.entity.OptionalStock; import cn.stock.market.domain.basic.repository.MoneyStockRepository; import cn.stock.market.domain.basic.repository.OptionalStockRepository; -import cn.stock.market.dto.OptionalStockResponse; -import cn.stock.market.dto.StockHistoryRequest; -import cn.stock.market.dto.StockHistoryResponse; +import cn.stock.market.dto.*; import cn.stock.market.dto.query.StockChartDto; import cn.stock.market.infrastructure.db.po.QMoneyStockPO; import cn.stock.market.utils.HttpRequest; @@ -21,6 +19,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.Lists; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -54,6 +55,8 @@ import java.io.IOException; import java.math.BigDecimal; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.time.Instant; import java.time.YearMonth; import java.time.ZoneId; @@ -354,6 +357,30 @@ public class MoneyApiController { return volume.toString(); } + private String getChartData(String scripcode, String resolution) { + String url = "https://charting.bseindia.com/charting/RestDataProvider.svc/getDat?exch=B&type=b&mode=bseL&fromdate=01-01-1991-01%3A01%3A00-AM&scode=" + scripcode; + if (resolution.equals("H")) { + url = "https://charting.bseindia.com/charting/RestDataProvider.svc/getDatI?exch=B&type=b&mode=bseL&fromdate=01-01-1991-01%3A01%3A00-AM&scode=" + scripcode; + } + RestTemplate restTemplate = new RestTemplate(); + + HttpHeaders headers = new HttpHeaders(); + headers.add("accept", "application/json, text/plain, */*"); + headers.add("accept-language", "en-US,en;q=0.9,vi;q=0.8"); + headers.add("origin", "https://www.bseindia.com"); + headers.add("referer", "https://www.bseindia.com/"); + headers.add("sec-ch-ua", "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\""); + headers.add("sec-ch-ua-mobile", "?0"); + headers.add("sec-ch-ua-platform", "\"Windows\""); + headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"); + + HttpEntity entity = new HttpEntity<>(headers); + + ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class); + + return response.getBody(); + } + private static List nseActives() { List list = new ArrayList<>(); String url = "https://www.moneycontrol.com/stocks/marketstats/nse-mostactive-stocks/nifty-50-9/"; @@ -769,6 +796,33 @@ public class MoneyApiController { return moneyStockSuggestDTOS; } + private static void addToListDouble(List list, String value) { + String[] values = value.split(","); + for (String v : values) { + list.add(Double.parseDouble(v)); + } + } + + private static void addToList(List list, String value) { + String[] values = value.split(","); + for (String v : values) { + list.add(Math.round(Double.parseDouble(v))); + } + } + + private static void addDatesToList(List list, String value) { + String[] dates = value.split(","); + SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", Locale.US); + for (String dateStr : dates) { + try { + Date date = sdf.parse(dateStr); + list.add(date.getTime()); + } catch (ParseException e) { + e.printStackTrace(); + } + } + } + @GetMapping({"/market/api/market/money/history/kLine", "/api/market/money/history/kLine"}) @ApiOperation(value = "获取kline的money数据源", notes = "获取kline的money数据源", response = StockHistoryResponse.class) @@ -785,6 +839,69 @@ public class MoneyApiController { public ResponseEntity getStockHistory(@RequestParam String symbol, @RequestParam String resolution ) { + MoneyStock moneyStock1 = moneyStockRepository.findOne( + QMoneyStockPO.moneyStockPO.moneyScId.eq(symbol) + .and(QMoneyStockPO.moneyStockPO.isLock.eq(0)) + .and(QMoneyStockPO.moneyStockPO.isShow.eq(0))) + .orElse(null); + + if (moneyStock1 != null) { + + String json = this.getChartData(moneyStock1.getNseIndiaId(), resolution); + + Gson gson = new Gson(); + + JsonObject outerJson = gson.fromJson(json, JsonObject.class); + + String innerJsonString; + + if (resolution.equals("H")) { + innerJsonString = outerJson.get("getDatIResult").getAsString(); + } else { + innerJsonString = outerJson.get("getDatResult").getAsString(); + } + + JsonObject innerJson = gson.fromJson(innerJsonString, JsonObject.class); + + JsonArray dataInputValues = innerJson.getAsJsonArray("DataInputValues"); + + List openList = new ArrayList<>(); + List highList = new ArrayList<>(); + List lowList = new ArrayList<>(); + List closeList = new ArrayList<>(); + List volumeList = new ArrayList<>(); + List dateList = new ArrayList<>(); + + if (dataInputValues.size() > 0) { + JsonObject dataObject = dataInputValues.get(0).getAsJsonObject(); + + JsonArray openArray = dataObject.getAsJsonArray("OpenData"); + JsonArray highArray = dataObject.getAsJsonArray("HighData"); + JsonArray lowArray = dataObject.getAsJsonArray("LowData"); + JsonArray closeArray = dataObject.getAsJsonArray("CloseData"); + JsonArray volumeArray = dataObject.getAsJsonArray("VolumeData"); + JsonArray dateArray = dataObject.getAsJsonArray("DateData"); + + openArray.forEach(o -> addToListDouble(openList, o.getAsJsonObject().get("Open").getAsString())); + highArray.forEach(h -> addToListDouble(highList, h.getAsJsonObject().get("High").getAsString())); + lowArray.forEach(l -> addToListDouble(lowList, l.getAsJsonObject().get("Low").getAsString())); + closeArray.forEach(c -> addToListDouble(closeList, c.getAsJsonObject().get("Close").getAsString())); + volumeArray.forEach(v -> addToList(volumeList, v.getAsJsonObject().get("Volume").getAsString())); + dateArray.forEach(d -> addDatesToList(dateList, d.getAsJsonObject().get("Date").getAsString())); + + StockHistoryResponse response = new StockHistoryResponse(); + response.setS("ok"); + response.setT(dateList); + response.setO(openList); + response.setH(highList); + response.setL(lowList); + response.setC(closeList); + response.setV(volumeList); + + return ResponseEntity.ok(response); + } + } + // 向外部API发起请求,并获取响应 StockHistoryRequest request = new StockHistoryRequest(); request.setSymbol(symbol);