From 615aae7e1d679967347a5158f7c4925204ff0304 Mon Sep 17 00:00:00 2001 From: vpckiet Date: Tue, 10 Dec 2024 16:37:54 +0700 Subject: [PATCH] update get detail from bseindia --- .../infrastructure/db/po/MoneyStockPO.java | 2 + .../stock/market/web/MoneyApiController.java | 81 ++++++++++++++++++- 2 files changed, 79 insertions(+), 4 deletions(-) diff --git a/src/main/java/cn/stock/market/infrastructure/db/po/MoneyStockPO.java b/src/main/java/cn/stock/market/infrastructure/db/po/MoneyStockPO.java index 959bdbe..911e59d 100644 --- a/src/main/java/cn/stock/market/infrastructure/db/po/MoneyStockPO.java +++ b/src/main/java/cn/stock/market/infrastructure/db/po/MoneyStockPO.java @@ -83,4 +83,6 @@ public class MoneyStockPO { /** * 是否展示 0是 1否 */ Integer isShow; + + Boolean useFromBseindia = false; } diff --git a/src/main/java/cn/stock/market/web/MoneyApiController.java b/src/main/java/cn/stock/market/web/MoneyApiController.java index e320ad2..ab5cdb8 100644 --- a/src/main/java/cn/stock/market/web/MoneyApiController.java +++ b/src/main/java/cn/stock/market/web/MoneyApiController.java @@ -40,9 +40,7 @@ import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; +import org.springframework.http.*; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; @@ -53,6 +51,7 @@ import org.springframework.web.util.UriComponentsBuilder; import org.springframework.web.util.UriUtils; import java.io.IOException; +import java.math.BigDecimal; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.Instant; @@ -194,7 +193,6 @@ public class MoneyApiController { @GetMapping({"/market/api/market/money/getStockDetail", "/api/market/money/getStockDetail"}) @ResponseBody @EncryptFilter(decryptRequest = false) - public ServerResponse getStockDetail(@RequestParam String stockType, @RequestParam String symbol) { MoneyStock moneyStock = moneyStockRepository.findOne(QMoneyStockPO.moneyStockPO.stockType.eq(stockType) .and(QMoneyStockPO.moneyStockPO.moneyScId.eq(symbol)) @@ -220,6 +218,54 @@ public class MoneyApiController { String url = String.format("https://priceapi.moneycontrol.com/pricefeed/%s/equitycash/%s", stockType.toLowerCase(), symbol); int maxRetries = 3; + if (moneyStock.getUseFromBseindia()) { + String bseUrl = "https://api.bseindia.com/BseIndiaAPI/api/getScripHeaderData/w?Debtflag=&scripcode=" + moneyStock.getNseIndiaId() + "&seriesid="; + 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); + + try { + ResponseEntity responseEntity = restTemplate.exchange(bseUrl, HttpMethod.GET, entity, String.class); + if (responseEntity.getStatusCode().value() == 200 && responseEntity.getBody() != null) { + JSONObject bseData = JSONObject.parseObject(responseEntity.getBody()); + JSONObject json1 = new JSONObject(); + json1.put("company", bseData.getJSONObject("Cmpname").getString("FullN")); + json1.put("pricepercentchange", bseData.getJSONObject("CurrRate").getString("PcChg")); + json1.put("stockType", stockType); + json1.put("pricechange", bseData.getJSONObject("CurrRate").getString("Chg")); + json1.put("pricecurrent", bseData.getJSONObject("CurrRate").getString("LTP")); + json1.put("priceprevclose", bseData.getJSONObject("Header").getString("PrevClose")); + json1.put("PREVDATE", ""); + + json1.put("dataSourceType", "3"); + json1.put("symbol", symbol); + json1.put("BSEID", moneyStock.getNseIndiaId()); + json1.put("NSEID", moneyStock.getNseIndiaId()); + json1.put("LTH", bseData.getJSONObject("Header").getString("High")); + json1.put("LTL", bseData.getJSONObject("Header").getString("Low")); + json1.put("OPN", bseData.getJSONObject("Header").getString("Open")); + + + if (moneyStock != null) { + json1.put("id", moneyStock.getId()); + } + + json1.put("VOL", this.getVolume(moneyStock.getNseIndiaId())); + return ServerResponse.createBySuccess(json1); + } + } catch (Exception e) { + System.err.println("Error fetching data from BSE India: " + e.getMessage()); + } + } + for (int retry = 1; retry <= maxRetries; retry++) { try { ResponseEntity responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class); @@ -280,6 +326,33 @@ public class MoneyApiController { return null; } + private String getVolume(String scripcode) { + String url = "https://api.bseindia.com/BseIndiaAPI/api/StockTrading/w?flag="etype=EQ&scripcode=" + 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.GET, entity, String.class); + BigDecimal volume = BigDecimal.ZERO; + + if (response.getStatusCode().value() == 200 && response.getBody() != null) { + JSONObject volumeData = JSONObject.parseObject(response.getBody()); + if (volumeData.getString("TTQ") != null) { + volume = new BigDecimal(volumeData.getString("TTQ")); + } + } + return volume.toString(); + } private static List nseActives() { List list = new ArrayList<>();