Compare commits

...

17 Commits

Author SHA1 Message Date
Congkiet4695
4a29bf6659 update crawl img news 2024-09-02 13:46:22 +07:00
gavin
5b2eb8519a 大盘缓存数据改为6秒 2024-07-26 15:04:56 +08:00
gavin
2e4449bd64 大盘数据更换moneycontrol 数据源 2024-07-26 14:53:50 +08:00
Thanh Nguyen
b321fd9d4e Update automatic-deployment link 2024-07-23 09:39:48 +07:00
gavin
2f9e54bf4f 更改数据库连接
更新新闻时间格式为24小时制
2024-07-12 15:33:25 +08:00
3bb354bbc6 Merge remote-tracking branch 'origin/develop' into develop 2024-07-08 12:38:26 +08:00
a403cba964 fix: 时间字段错乱 2024-07-08 12:38:13 +08:00
Achilles
99bde81670 Merge remote-tracking branch 'origin/develop' into develop 2024-06-28 17:00:04 +08:00
Achilles
bae941828e 代码优化和优化 2024-06-28 16:59:58 +08:00
gs
2f86571578 价格问题处理 2024-06-25 18:00:21 +08:00
gs
d491bef735 新闻时间处理 2024-06-25 17:45:15 +08:00
gs
74c64eb7d4 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	src/main/java/cn/stock/market/web/StockApiController.java
2024-06-20 16:55:50 +08:00
gs
f50b6b5519 新闻时间处理 2024-06-20 16:54:56 +08:00
2446d89b30 fix: 时间字段错乱 2024-06-20 16:33:38 +08:00
gs
33a68eb7e8 新闻处理 2024-06-20 14:50:15 +08:00
gs
7b0a08150d Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	src/main/java/cn/stock/market/domain/basic/service/StockService.java
2024-06-20 14:47:53 +08:00
gs
146e9d9bc0 新闻处理 2024-06-20 14:47:04 +08:00
9 changed files with 121 additions and 37 deletions

View File

@@ -2,7 +2,7 @@ stages:
# 构建 # 构建
- build - build
- dockerize - dockerize
- webhook - deploy
build: build:
image: maven:3.6.3-openjdk-8 image: maven:3.6.3-openjdk-8
@@ -60,16 +60,20 @@ dockerize:
- docker push juyoutech/india_stock_market:latest - docker push juyoutech/india_stock_market:latest
- docker push juyoutech/india_stock_market:$CI_PIPELINE_ID - docker push juyoutech/india_stock_market:$CI_PIPELINE_ID
- docker push juyoutech/india_stock_market:$CI_COMMIT_BRANCH - docker push juyoutech/india_stock_market:$CI_COMMIT_BRANCH
webhook: deploy-dev:
stage: webhook stage: deploy
only: only:
- develop - develop
script: script:
- echo ">>>>>>Start Deploy<<<<<<" - echo "Deploying application..."
- ls - ls
- apt-get update - apt-get update
- apt-get install -y curl - apt-get install -y curl
- curl --max-time 30 http://149.88.86.7:11113/api/webhook/justpull?project=india_market_java\&setenv_file=alpha.sh\&publish_env=alpha\&shell=deploy-test.sh - |
- echo ">>>>>>Start Deploy Finish<<<<<<" curl -X POST \
-H "Content-Type: application/json" \
-d '{"namespace":"yddev", "deployment_name":"india-stock-market"}' \
https://updater-yddev.moneytj.com/restart-deployment
- echo "Application successfully deployed."

View File

@@ -30,6 +30,8 @@ import org.apache.commons.lang3.StringUtils;
import cn.stock.market.infrastructure.db.po.QStockPO; import cn.stock.market.infrastructure.db.po.QStockPO;
import org.jsoup.Jsoup; import org.jsoup.Jsoup;
import org.jsoup.nodes.Document; import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.http.HttpEntity; import org.springframework.http.HttpEntity;
@@ -252,7 +254,13 @@ public class StockService {
.header("Referer", "https://www.business-standard.com/") .header("Referer", "https://www.business-standard.com/")
.header("Accept-Language", "en-US,en;q=0.9") .header("Accept-Language", "en-US,en;q=0.9")
.get(); .get();
result = doc.html().substring(doc.html().indexOf("<div class=\"shortvideoimg\" style=\"position:relative\">"),doc.html().lastIndexOf("<div class=\"shortvideoimg\" style=\"position:relative\">")+1200); // result = doc.html().substring(doc.html().indexOf("<div class=\"listingstyle_shortvideoimg__0TWuX shortvideoimg\">"),doc.html().lastIndexOf("<div class=\"listingstyle_shortvideoimg__0TWuX shortvideoimg\">")+500);
Elements divElements = doc.select("div.listingstyle_cardlistlist__dfq57");
StringBuilder sb = new StringBuilder();
for (Element divElement : divElements) {
sb.append(divElement.outerHtml()).append("\n");
}
result = sb.toString();
} catch (Exception e) { } catch (Exception e) {
return e.toString(); return e.toString();
} }
@@ -974,7 +982,7 @@ public class StockService {
String exchange = "bse"; String exchange = "bse";
IndiaIndexVo vo1 = new IndiaIndexVo(); IndiaIndexVo vo1 = new IndiaIndexVo();
String coCode = "20558"; String coCode = "20558";
JSONObject object = TodayApis.getStockDetail(exchange, coCode); JSONObject object = TodayApis.getStockDetail("in%3BSEN", coCode);
IndiaStockVO market = objToVo(object); IndiaStockVO market = objToVo(object);
market.setName("BSESENSEX指数"); market.setName("BSESENSEX指数");
vo1.setIndexVo(market); vo1.setIndexVo(market);
@@ -1004,7 +1012,7 @@ public class StockService {
String exchange = "nse"; String exchange = "nse";
IndiaIndexVo vo1 = new IndiaIndexVo(); IndiaIndexVo vo1 = new IndiaIndexVo();
String coCode = "20559"; String coCode = "20559";
JSONObject object = TodayApis.getStockDetail(exchange, coCode); JSONObject object = TodayApis.getStockDetail("in%3BNSX", coCode);
IndiaStockVO market = objToVo(object); IndiaStockVO market = objToVo(object);
market.setName("NIFTY50指数"); market.setName("NIFTY50指数");
vo1.setIndexVo(market); vo1.setIndexVo(market);
@@ -1034,23 +1042,23 @@ public class StockService {
} }
private IndiaStockVO objToVo(JSONObject object){ private IndiaStockVO objToVo(JSONObject object){
IndiaStockVO market = new IndiaStockVO(); IndiaStockVO market = new IndiaStockVO();
if(object.containsKey("prev_close")){ if(object.containsKey("priceprevclose")){
market.setClose(object.getString("prev_close")); market.setClose(object.getString("priceprevclose"));
} }
if(object.containsKey("price")){ if(object.containsKey("pricecurrent")){
market.setNowPrice(object.getString("price")); market.setNowPrice(object.getString("pricecurrent"));
} }
if(object.containsKey("perchg")){ if(object.containsKey("pricepercentchange")){
market.setRate(object.getString("perchg")); market.setRate(object.getString("pricepercentchange"));
} }
if(object.containsKey("high_price")){ if(object.containsKey("HIGH")){
market.setHigh(object.getString("high_price")); market.setHigh(object.getString("HIGH"));
} }
if(object.containsKey("low_price")){ if(object.containsKey("LOW")){
market.setLow(object.getString("low_price")); market.setLow(object.getString("LOW"));
} }
if(object.containsKey("open_price")){ if(object.containsKey("OPEN")){
market.setOpen(object.getString("open_price")); market.setOpen(object.getString("OPEN"));
} }
return market; return market;
// stockListVO.setName(jsonObject.getString("companyname")); // stockListVO.setName(jsonObject.getString("companyname"));

View File

@@ -187,18 +187,17 @@ public class TodayApis {
//获取详情 //获取详情
public static JSONObject getStockDetail(String exchange,String coCode){ public static JSONObject getStockDetail(String exchange,String coCode){
String url = String.format("https://marketapi.intoday.in/widget/stockdetail/pullview?co_code=%s&exchange=%s",coCode,exchange); String url = String.format("https://priceapi.moneycontrol.com/pricefeed/notapplicable/inidicesindia/%s",exchange);
String str = get(url); String str = get(url);
JSONObject object = JSON.parseObject(str); JSONObject object = JSON.parseObject(str);
boolean bool = false; boolean bool = false;
if(object.containsKey("success")){ if(object.containsKey("code")){
bool = object.getBoolean("success"); bool = object.getInteger("code") == 200;
} }
if(!bool){ if(!bool){
return new JSONObject(); return new JSONObject();
} }
JSONArray jsonArray = JSON.parseArray(object.getString("data")); JSONObject entity = JSON.parseObject(object.getString("data"));
JSONObject entity = JSON.parseObject(jsonArray.get(0).toString());
return entity; return entity;
} }

View File

@@ -7,6 +7,7 @@ import cn.stock.market.domain.basic.repository.StockRepository;
import cn.stock.market.domain.basic.service.StockService; import cn.stock.market.domain.basic.service.StockService;
import cn.stock.market.infrastructure.api.investing.InvestingInvokerApis; import cn.stock.market.infrastructure.api.investing.InvestingInvokerApis;
import cn.stock.market.infrastructure.db.po.QSiteNewsPO; import cn.stock.market.infrastructure.db.po.QSiteNewsPO;
import cn.stock.market.utils.DateTimeUtil;
import cn.stock.market.utils.Utils; import cn.stock.market.utils.Utils;
import com.ag.utils.CollectionUtils; import com.ag.utils.CollectionUtils;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
@@ -25,6 +26,8 @@ import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Slf4j @Slf4j
@Component @Component
@@ -118,8 +121,16 @@ public class InvestingTask {
newsList.forEach( n -> { newsList.forEach( n -> {
String contentUrl = n.substring(1, n.indexOf("class=\"img-smllnews\"") - 2); String contentUrl = n.substring(1, n.indexOf("class=\"img-smllnews\"") - 2);
String id = contentUrl.substring(contentUrl.lastIndexOf("-") + 1, contentUrl.lastIndexOf("_")); String id = contentUrl.substring(contentUrl.lastIndexOf("-") + 1, contentUrl.lastIndexOf("_"));
String imgUrl = n.substring(n.indexOf("img loading=\"lazy\" src=") + 24, n.indexOf("?")); // String imgUrl = n.substring(n.indexOf("img loading=\"lazy\" src=") + 24, n.indexOf("?"));
String time = n.substring(n.indexOf("Last Updated") + 23, n.indexOf("IST") - 9); String imgUrl = extractImgSrc(n);
// String time = n.substring(n.indexOf("Last Updated") + 23, n.indexOf("IST") - 9);
// Extract the date and time using regex
Pattern pattern = Pattern.compile("Updated On :<!-- --> <!-- -->(.*?)<!-- -->");
Matcher matcher = pattern.matcher(n);
String time = "";
if (matcher.find()) {
time = DateTimeUtil.formatDateTimeFor24H(matcher.group(1).trim(),"dd MMM yyyy | hh:mm a");
}
SiteNews siteNews = new SiteNews(); SiteNews siteNews = new SiteNews();
siteNews.setAddTime(new Date()); siteNews.setAddTime(new Date());
@@ -140,4 +151,22 @@ public class InvestingTask {
} }
} }
public static String extractImgSrc(String htmlData) {
String searchString = "<noscript>";
int startPos = htmlData.indexOf(searchString);
if (startPos != -1) {
String startTag = "src=";
startPos = htmlData.indexOf(startTag, startPos) + startTag.length() + 1;
int endPos = htmlData.indexOf("?", startPos);
if (endPos != -1) {
return htmlData.substring(startPos, endPos);
}
}
return null;
}
} }

View File

@@ -5,6 +5,8 @@ import java.sql.Timestamp;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Calendar; import java.util.Calendar;
import java.util.Locale;
import org.joda.time.DateTime; import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.DateTimeFormatter;
@@ -186,6 +188,25 @@ public class DateTimeUtil {
} }
public static String formatDateTimeFor24H(String inputDateTime,String inputFormatStr){
String outputDateTime = "";
// 1. 解析日期时间
SimpleDateFormat inputFormat = new SimpleDateFormat(inputFormatStr, Locale.ENGLISH);
Date date = null;
try {
date = inputFormat.parse(inputDateTime);
} catch (Exception e) {
e.printStackTrace();
}
if (date != null) {
// 2. 转换为24小时制
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
outputDateTime = outputFormat.format(date);
}
return outputDateTime;
}
public static void main(String[] args) { public static void main(String[] args) {
parseToDateByMinute(10); parseToDateByMinute(10);
} }

View File

@@ -22,6 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -159,6 +160,19 @@ public class BTodayStockController {
String forObject = restTemplate.getForObject(apiUrl, String.class); String forObject = restTemplate.getForObject(apiUrl, String.class);
JSONObject jsonObject = JSON.parseObject(forObject); JSONObject jsonObject = JSON.parseObject(forObject);
JSONArray arryData = jsonObject.getJSONArray("data");
if (arryData != null&&arryData.size()>0) {
try {
JSONObject jsonObject1 = arryData.getJSONObject(0);
String price = jsonObject1.getString("price");
double priceValue = Double.parseDouble(price);
DecimalFormat df = new DecimalFormat("0.00");
jsonObject1.put("price", df.format(priceValue));
} catch (NumberFormatException e) {
// Handle the case where price is not a valid double
e.printStackTrace();
}
}
jsonObject.put("id",btodayStock.getId()); jsonObject.put("id",btodayStock.getId());
return jsonObject; return jsonObject;
} }

View File

@@ -191,7 +191,7 @@ public class MoneyApiController {
if (responseEntity.getStatusCode().value() == 200 && responseEntity.getBody() != null ) { if (responseEntity.getStatusCode().value() == 200 && responseEntity.getBody() != null ) {
JSONObject data = JSONObject.parseObject(responseEntity.getBody()).getJSONObject("data"); JSONObject data = JSONObject.parseObject(responseEntity.getBody()).getJSONObject("data");
if(data!=null){ if(data!=null){
json1.put("company",data.getString("company")); json1.put("company",data.getString("SC_FULLNM"));
json1.put("pricepercentchange",data.getString("pricepercentchange")); json1.put("pricepercentchange",data.getString("pricepercentchange"));
json1.put("stockType",stockType); json1.put("stockType",stockType);
json1.put("pricechange",data.getString("pricechange")); json1.put("pricechange",data.getString("pricechange"));

View File

@@ -3,6 +3,8 @@ package cn.stock.market.web;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@@ -169,7 +171,7 @@ public class StockApiController {
@RequestMapping({"test.do"}) @RequestMapping({"test.do"})
@ResponseBody @ResponseBody
public ServerResponse test(@RequestParam("url") String url, @RequestParam("pageNum") Integer pageNum) { public ServerResponse test(/*@RequestParam("url") String url, @RequestParam("pageNum") Integer pageNum*/) {
String news = stockService.getNews(); String news = stockService.getNews();
List<String> newsList = Arrays.asList(news.split("<a href=")); List<String> newsList = Arrays.asList(news.split("<a href="));
newsList = newsList.subList(1, newsList.size()); newsList = newsList.subList(1, newsList.size());
@@ -177,7 +179,14 @@ public class StockApiController {
String contentUrl = n.substring(1, n.indexOf("class=\"img-smllnews\"") - 2); String contentUrl = n.substring(1, n.indexOf("class=\"img-smllnews\"") - 2);
String id = contentUrl.substring(contentUrl.lastIndexOf("-") + 1, contentUrl.lastIndexOf("_")); String id = contentUrl.substring(contentUrl.lastIndexOf("-") + 1, contentUrl.lastIndexOf("_"));
String imgUrl = n.substring(n.indexOf("img loading=\"lazy\" src=") + 24, n.indexOf("?")); String imgUrl = n.substring(n.indexOf("img loading=\"lazy\" src=") + 24, n.indexOf("?"));
String time = n.substring(n.indexOf("Last Updated") + 23, n.indexOf("IST") - 9); // String time = n.substring(n.indexOf("Last Updated") + 23, n.indexOf("IST") - 9);
// Extract the date and time using regex
Pattern pattern = Pattern.compile("Updated On :<!-- --> <!-- -->(.*?)<!-- -->");
Matcher matcher = pattern.matcher(n);
String time = "";
if (matcher.find()) {
time = matcher.group(1).trim();
}
SiteNews siteNews = new SiteNews(); SiteNews siteNews = new SiteNews();
siteNews.setAddTime(new Date()); siteNews.setAddTime(new Date());
@@ -238,7 +247,7 @@ public class StockApiController {
@ResponseBody @ResponseBody
public ServerResponse getIndiaIndexByToday() { public ServerResponse getIndiaIndexByToday() {
String INDEX_CODE = "TODAY_INDEX"; String INDEX_CODE = "TODAY_INDEX";
return RequestCacheUtils.cache("getIndiaIndexByToday.do", INDEX_CODE,60000, (string) -> { return RequestCacheUtils.cache("getIndiaIndexByToday.do", INDEX_CODE,6000, (string) -> {
return this.stockService.getIndexByBtoday(); return this.stockService.getIndexByBtoday();
}); });
} }

View File

@@ -3,9 +3,9 @@ spring:
show-sql: true show-sql: true
# Redis配置 # Redis配置
redis: redis:
host: 43.132.212.180 host: lb-b6sze686-7db6hgvsx05ef8nz.clb.sg-tencentclb.net
password: ruTZ9J3gaDhknJ password: a5v8b86P4mVzFlUqJV
port: 36379 port: 56379
database: 1 database: 1
lettuce: lettuce:
pool: pool:
@@ -17,9 +17,9 @@ spring:
datasource: datasource:
stock-market: stock-market:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://149.88.86.7:33306/india_stock?useUnicode=true&characterEncoding=utf-8 url: jdbc:mysql://lb-1ju43bvw-p0ecnv4by9ju8six.clb.ap-singapore.tencentclb.com:53306/india_stock?useUnicode=true&characterEncoding=utf-8
username: root username: root
password: 33BsUUcnXRYgwtIND password: uNejHIFQGJOUtYTmE
maxActive: 500 maxActive: 500
testWhileIdle: true testWhileIdle: true
validationQuery: SELECT 1 validationQuery: SELECT 1