فهرست منبع

!增加查询广告是否开启接口

竺森洋 5 ماه پیش
والد
کامیت
5aa7d6ca35

+ 7 - 0
src/main/java/io/renren/application/common/controller/ChaoXiangController.java

@@ -6,6 +6,7 @@ import io.renren.application.common.service.SysPublicParamService;
 import io.renren.application.common.vo.ChaoXiangParamVo;
 import io.renren.application.common.vo.Results;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
@@ -36,8 +37,14 @@ public class ChaoXiangController {
     public Results<Integer> getAdsTime(){
         return sysPublicParamService.getAdsTime();
     }
+
     @PostMapping("/modifyAdsTime")
     public Results modifyAdsTime(@RequestBody ChaoXiangTimeDto dto){
         return sysPublicParamService.modifyAdsTime(dto);
     }
+    @GetMapping("/hasStock")
+    @ApiOperation("查询领券库存情况 data>0 有库存 data=0 不看广告 data<0 无库存")
+    public Results hasStock(){
+        return sysPublicParamService.hasStock();
+    }
 }

+ 2 - 0
src/main/java/io/renren/application/common/service/SysPublicParamService.java

@@ -19,4 +19,6 @@ public interface SysPublicParamService extends IService<SysPublicParam> {
     Results<Integer> getAdsTime();
 
     Results modifyAdsTime(@RequestBody ChaoXiangTimeDto dto);
+
+    Results hasStock();
 }

+ 35 - 0
src/main/java/io/renren/application/common/service/imp/SysPublicParamServiceImpl.java

@@ -8,22 +8,28 @@ import io.renren.application.common.dto.ChaoXiangTimeDto;
 import io.renren.application.common.entity.SysPublicParam;
 import io.renren.application.common.mapper.SysPublicParamMapper;
 import io.renren.application.common.service.SysPublicParamService;
+import io.renren.application.common.util.ChaoXiangUtils;
 import io.renren.application.common.vo.ChaoXiangParamVo;
 import io.renren.application.common.vo.Results;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
 import java.time.DayOfWeek;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 
 @Service
 @RequiredArgsConstructor
+@Slf4j
 public class SysPublicParamServiceImpl extends ServiceImpl<SysPublicParamMapper, SysPublicParam> implements SysPublicParamService {
 
     String CHAO_XIANG_PARAM_PRE = "CHAO_XIANG_PARAM_QRCODE_WEEK_";
     String CHAO_XIANG_ADS_TIME_KEY = "CHAO_XIANG_ADS_TIME";
+    String CHAO_XIANG_ADS_END_TIME = "CHAO_XIANG_ADS_END_TIME";
     @Override
     public Results modeifyParam(ChaoXiangParamDto dto) {
         if (dto.getValues()==null){
@@ -140,4 +146,33 @@ public class SysPublicParamServiceImpl extends ServiceImpl<SysPublicParamMapper,
         return Results.success();
     }
 
+    @Override
+    public Results hasStock() {
+        SysPublicParam publicParam = getOne(Wrappers.<SysPublicParam>lambdaQuery().eq(SysPublicParam::getPublicKey,CHAO_XIANG_ADS_END_TIME));
+        String time = "20:05:00";
+        if (publicParam!=null&&StringUtils.isNotBlank(publicParam.getPublicValue())){
+            time = publicParam.getPublicValue();
+        }
+        LocalDateTime today = LocalDateTime.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String endTimeStr = today.format(formatter)+" "+time;
+        DateTimeFormatter endFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime endTime = LocalDateTime.parse(endTimeStr,endFormatter);
+        if (today.isAfter(endTime)){
+            log.info("超出限制时间,不再强制要求观看广告");
+            return Results.success(0);
+        }
+        try {
+            String id = getWeekParam().getData();
+            log.info("开始查询库存 id:{}",getWeekParam().getData());
+            Integer stock = ChaoXiangUtils.getStock(id);
+            if (stock!=null&&stock>0){
+                return Results.success(stock);
+            }
+        } catch (IOException e) {
+            return Results.success(-1);
+        }
+        return Results.success(-1);
+    }
+
 }

+ 80 - 0
src/main/java/io/renren/application/common/util/BaiduUtils.java

@@ -0,0 +1,80 @@
+package io.renren.application.common.util;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+@Slf4j
+public class BaiduUtils {
+    private static final String API_KEY="BaOevEgABbOPTfJo686CJvRL";
+    private static final String API_SECRET="PrFtaiHcU2KkGS5apqIhRlP1K7sgCzHw";
+    private static final CacheToken cacheToken = new CacheToken();
+
+
+    private static String getCacheToken(){
+        if (cacheToken.getToken()!=null&&cacheToken.getExpireTime().isAfter(LocalDateTime.now())){
+            return cacheToken.getToken();
+        }
+        return getBaiduToken();
+    }
+
+    private static String getBaiduToken(){
+        Map param = new HashMap();
+        param.put("grant_type","client_credentials");
+        param.put("client_id",API_KEY);
+        param.put("client_secret",API_SECRET);
+        String result = HttpUtil.get("https://aip.baidubce.com/oauth/2.0/token",param);
+        log.info("获取百度token结果:{}",result);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        cacheToken.setToken(jsonObject.getString("access_token"));
+        cacheToken.setExpireTime(LocalDateTime.now().plusSeconds(jsonObject.getInteger("expires_in")-10));
+        return jsonObject.getString("access_token");
+    }
+
+    public static String getImageText(String image){
+        HttpRequest request = HttpRequest.post("https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic?access_token="+
+                getCacheToken());
+        request.header("Content-Type","application/x-www-form-urlencoded");
+        Map<String,String> param = new HashMap<>();
+        param.put("url",image);
+        request.body(JSONObject.toJSONString(param));
+        request.form("url",image);
+        String result = request.execute().body();
+        log.info("图像识别请求结果:{}",result);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        String words = jsonObject.getJSONArray("words_result").getJSONObject(0).getString("words").trim().replace(" ","");
+        return words;
+    }
+    public static String getImageTextBase64(String image) throws IOException {
+        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
+        // image 可以通过 getFileContentAsBase64("C:\fakepath\code.jfif") 方法获取,如果Content-Type是application/x-www-form-urlencoded时,第二个参数传true
+        RequestBody body = RequestBody.create(mediaType, "image="+image+"&detect_direction=false&detect_language=false&paragraph=false&probability=false");
+        Request request = new Request.Builder()
+                .url("https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + getCacheToken())
+                .method("POST", body)
+                .addHeader("Content-Type", "application/x-www-form-urlencoded")
+                .addHeader("Accept", "application/json")
+                .build();
+        OkHttpClient client = new OkHttpClient();
+        Response response = client.newCall(request).execute();
+        String result = response.body().string();
+        log.info("图像识别请求结果:{}",result);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        String words = jsonObject.getJSONArray("words_result").getJSONObject(0).getString("words").trim().replace(" ","");
+        return words;
+    }
+    @Data
+    public static class CacheToken{
+        String token;
+        LocalDateTime expireTime;
+    }
+}

+ 175 - 0
src/main/java/io/renren/application/common/util/ChaoXiangUtils.java

@@ -0,0 +1,175 @@
+package io.renren.application.common.util;
+
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+@Slf4j
+public class ChaoXiangUtils {
+
+    private static final String CODE_URL = "https://applet.diandian11.com/gwx/api-business/code?randomStr=";
+
+    private static final String LOGIN_URL = "https://applet.diandian11.com/gwx/api-business/oauth/token?randomStr=RANDOM&code=CODE";
+
+    private static final String SEND_INFO_URL = "https://applet.diandian11.com/gwx/api-business/tenant/coupon/web/quantityReceivedList?couponId=";
+
+    private static final String USER_NAME = "admin";
+
+    private static final String PASSWORD = "cdzcx0712";
+
+    private static final String TOKEN_KEY = "authorization";
+
+    private static final CX_Token cacheToken = new CX_Token();
+
+    private static String getToken() throws IOException {
+        if (cacheToken.getToken()!=null&&cacheToken.getExpireTime().isAfter(LocalDateTime.now())){
+            return cacheToken.getToken();
+        }
+        return login();
+    }
+
+    public static Integer getStock(String id) throws IOException {
+
+        OkHttpClient client = new OkHttpClient();
+        String url = SEND_INFO_URL+id;
+        log.info("url:{}",url);
+//        MediaType mediaType = MediaType.parse("application/json");
+//        RequestBody body = RequestBody.create(mediaType, "{\"loginName\":\"admin\",\"password\":\"cdzcx0712\",\"grantType\":\"password\",\"accountType\":0}");
+        Request request = new Request.Builder()
+                .url(url)
+//                .post(body)
+                .addHeader("Accept", "application/json, text/plain, */*")
+                .addHeader("Accept-Encoding", "gzip, deflate, br, zstd")
+                .addHeader("Accept-Language", "zh-CN,zh;q=0.9")
+                .addHeader("Authorization", getToken())
+                .addHeader("Cache-Control", "no-cache")
+                .addHeader("Connection", "keep-alive")
+//                .addHeader("Content-Length", "83")
+//                .addHeader("Content-Type", "application/json;charset=UTF-8")
+                .addHeader("DNT", "1")
+                .addHeader("Host", "applet.diandian11.com")
+                .addHeader("Origin", "http://manage.diandian11.com")
+                .addHeader("Pragma", "no-cache")
+                .addHeader("Referer", "http://manage.diandian11.com/")
+                .addHeader("Sec-Fetch-Dest", "empty")
+                .addHeader("Sec-Fetch-Mode", "cors")
+                .addHeader("Sec-Fetch-Site", "cross-site")
+                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36")
+                .addHeader("dt", "0")
+                .addHeader("region", "%E5%85%A8%E5%9B%BD,saas")
+                .addHeader("sec-ch-ua", "\"Chromium\";v=\"124\", \"Google Chrome\";v=\"124\", \"Not-A.Brand\";v=\"99\"")
+                .addHeader("sec-ch-ua-mobile", "?0")
+                .addHeader("sec-ch-ua-platform", "\"Windows\"")
+//                .addHeader("content-type", "application/json")
+                .build();
+        Long start = System.currentTimeMillis();
+        Response response = client.newCall(request).execute();
+        String result = response.body().string();
+        log.info("查询库存信息结果:{}",result);
+        Long cost = System.currentTimeMillis()-start;
+        log.info("耗时:{}ms",cost);
+        JSONArray array = JSONObject.parseObject(result).getJSONArray("data");
+        if (array!=null&&!array.isEmpty()){
+            Integer sum = array.getJSONObject(0).getInteger("ruleNumber");
+            Integer send = array.getJSONObject(0).getInteger("receiveCount");
+            return sum-send;
+        }
+        return 0;
+    }
+
+    private static String login() throws IOException {
+        String randomStr = RandomUtil.randomString(4).toUpperCase();
+        OkHttpClient client = new OkHttpClient();
+        Request imageRequest = new Request.Builder()
+                .url(CODE_URL+randomStr)
+                .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7")
+                .addHeader("Accept-Encoding", "gzip, deflate, br, zstd")
+                .addHeader("Accept-Language", "zh-CN,zh;q=0.9")
+//                .addHeader("Authorization", "")
+                .addHeader("Cache-Control", "no-cache")
+                .addHeader("Connection", "keep-alive")
+//                .addHeader("Content-Length", "83")
+//                .addHeader("Content-Type", "application/json;charset=UTF-8")
+                .addHeader("DNT", "1")
+                .addHeader("Host", "applet.diandian11.com")
+                .addHeader("Origin", "http://manage.diandian11.com")
+                .addHeader("Pragma", "no-cache")
+                .addHeader("Referer", "http://manage.diandian11.com/")
+                .addHeader("Sec-Fetch-Dest", "empty")
+                .addHeader("Sec-Fetch-Mode", "cors")
+                .addHeader("Sec-Fetch-Site", "cross-site")
+                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36")
+                .addHeader("dt", "0")
+                .addHeader("region", "%E5%85%A8%E5%9B%BD,saas")
+                .addHeader("sec-ch-ua", "\"Chromium\";v=\"124\", \"Google Chrome\";v=\"124\", \"Not-A.Brand\";v=\"99\"")
+                .addHeader("sec-ch-ua-mobile", "?0")
+                .addHeader("sec-ch-ua-platform", "\"Windows\"")
+//                .addHeader("content-type", "application/json")
+                .build();
+
+        Response response1 = client.newCall(imageRequest).execute();
+        String base64 =
+                Base64.encodeBase64String(IOUtils.toByteArray(response1.body().byteStream()));
+        log.info("base64:{}",base64);
+        base64 = URLEncoder.encode(base64, "utf-8");
+        String code =  BaiduUtils.getImageTextBase64(base64);
+
+        MediaType mediaType = MediaType.parse("application/json");
+        RequestBody body = RequestBody.create(mediaType, "{\"loginName\":\"admin\",\"password\":\"cdzcx0712\",\"grantType\":\"password\",\"accountType\":0}");
+        Request request = new Request.Builder()
+                .url("https://applet.diandian11.com/gwx/api-business/oauth/token?randomStr="+randomStr+"&code="+code)
+                .post(body)
+                .addHeader("Accept", "application/json, text/plain, */*")
+                .addHeader("Accept-Encoding", "gzip, deflate, br, zstd")
+                .addHeader("Accept-Language", "zh-CN,zh;q=0.9")
+                .addHeader("Authorization", "")
+                .addHeader("Cache-Control", "no-cache")
+                .addHeader("Connection", "keep-alive")
+                .addHeader("Content-Length", "83")
+                .addHeader("Content-Type", "application/json;charset=UTF-8")
+                .addHeader("DNT", "1")
+                .addHeader("Host", "applet.diandian11.com")
+                .addHeader("Origin", "http://manage.diandian11.com")
+                .addHeader("Pragma", "no-cache")
+                .addHeader("Referer", "http://manage.diandian11.com/")
+                .addHeader("Sec-Fetch-Dest", "empty")
+                .addHeader("Sec-Fetch-Mode", "cors")
+                .addHeader("Sec-Fetch-Site", "cross-site")
+                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36")
+                .addHeader("dt", "0")
+                .addHeader("region", "%E5%85%A8%E5%9B%BD,saas")
+                .addHeader("sec-ch-ua", "\"Chromium\";v=\"124\", \"Google Chrome\";v=\"124\", \"Not-A.Brand\";v=\"99\"")
+                .addHeader("sec-ch-ua-mobile", "?0")
+                .addHeader("sec-ch-ua-platform", "\"Windows\"")
+                .addHeader("content-type", "application/json")
+                .build();
+
+        Response response = client.newCall(request).execute();
+        String token = JSONObject.parseObject(response.body().string()).getJSONObject("data").getString("accessToken");
+        cacheToken.setToken(token);
+        cacheToken.setExpireTime(LocalDateTime.now().plusHours(24));
+        log.info("登入信息:{}",cacheToken);
+        return token;
+    }
+
+    @Data
+    public static class CX_Token{
+        String token;
+        LocalDateTime expireTime;
+    }
+}