23 changed files with 18 additions and 2348 deletions
-
12.settings/org.eclipse.core.resources.prefs
-
141pom.xml
-
24src/main/java/com/bfd/qanda/Application.java
-
35src/main/java/com/bfd/qanda/cache/ConfigCache.java
-
65src/main/java/com/bfd/qanda/cache/LocalCache.java
-
41src/main/java/com/bfd/qanda/controller/QandaController.java
-
152src/main/java/com/bfd/qanda/entity/Constants.java
-
128src/main/java/com/bfd/qanda/handler/MainHandler.java
-
193src/main/java/com/bfd/qanda/process/QandaPorcess.java
-
17src/main/java/com/bfd/qanda/service/QandaService.java
-
58src/main/java/com/bfd/qanda/service/impl/QandaServiceImpl.java
-
93src/main/java/com/bfd/qanda/token/TokenManagerV3.java
-
48src/main/java/com/bfd/qanda/utils/DataUtil.java
-
177src/main/java/com/bfd/qanda/utils/DateUtil.java
-
914src/main/java/com/bfd/qanda/utils/DownLoadUtil.java
-
27src/main/java/com/bfd/qanda/utils/EncryptionUtil.java
-
36src/main/java/com/bfd/qanda/utils/FileUtil.java
-
53src/main/java/com/bfd/qanda/utils/GPTResultParseUtil.java
-
32src/main/java/com/bfd/qanda/utils/JsonUtil.java
-
33src/main/java/com/bfd/qanda/utils/OtherUtils.java
-
18src/main/java/com/bfd/qanda/utils/QueueUtil.java
-
46src/main/java/com/bfd/qanda/utils/SpringBootKafka.java
-
23src/main/java/com/bfd/qanda/utils/ThrowMessageUtil.java
@ -1,13 +1,7 @@ |
|||
<<<<<<< HEAD |
|||
=\=\=\=\=\=\= |
|||
<<<<<<<=HEAD |
|||
>>>>>>>=branch 'master' of http\://82.156.111.58\:3000/maojian/appliction_manager.git |
|||
eclipse.preferences.version=1 |
|||
encoding//src/main/java=UTF-8 |
|||
encoding//src/main/resources=UTF-8 |
|||
encoding//src/test/java=UTF-8 |
|||
encoding/<project>=UTF-8 |
|||
======= |
|||
eclipse.preferences.version=1 |
|||
encoding//src/main/java=UTF-8 |
|||
encoding//src/main/resources=UTF-8 |
|||
encoding//src/test/java=UTF-8 |
|||
encoding/<project>=UTF-8 |
|||
>>>>>>> branch 'master' of http://82.156.111.58:3000/maojian/appliction_manager.git |
@ -1,24 +0,0 @@ |
|||
package com.bfd.qanda; |
|||
|
|||
|
|||
|
|||
import org.springframework.boot.SpringApplication; |
|||
import org.springframework.boot.autoconfigure.SpringBootApplication; |
|||
import org.springframework.kafka.annotation.EnableKafka; |
|||
import org.springframework.scheduling.annotation.EnableScheduling; |
|||
|
|||
/** |
|||
* 主入口 |
|||
* |
|||
* @author jian.mao |
|||
* @date 2023年7月4日 |
|||
* @description |
|||
*/ |
|||
@SpringBootApplication |
|||
@EnableKafka |
|||
public class Application { |
|||
|
|||
public static void main(String[] args) { |
|||
SpringApplication.run(Application.class, args); |
|||
} |
|||
} |
@ -1,35 +0,0 @@ |
|||
package com.bfd.qanda.cache; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import java.util.Map; |
|||
import java.util.concurrent.LinkedBlockingDeque; |
|||
|
|||
/** |
|||
* @author jian.mao |
|||
* @date 2022年11月11日 |
|||
* @description 静态变量类 |
|||
*/ |
|||
@Slf4j |
|||
public class ConfigCache { |
|||
|
|||
/**启动条件**/ |
|||
public static boolean isStart = true; |
|||
/*****任务队列*****/ |
|||
public static LinkedBlockingDeque<Map<String, Object>> taskQueue = new LinkedBlockingDeque<Map<String,Object>>(); |
|||
|
|||
|
|||
/** |
|||
* 队列录入任务 |
|||
* @param queue |
|||
* @param task |
|||
*/ |
|||
public static void putQueue(LinkedBlockingDeque<Map<String, Object>> queue,Map<String, Object> task){ |
|||
//next app 写入队列准备调出 |
|||
try { |
|||
queue.put(task); |
|||
} catch (InterruptedException e) { |
|||
log.error("队列写入data失败---"); |
|||
} |
|||
} |
|||
} |
@ -1,65 +0,0 @@ |
|||
package com.bfd.qanda.cache; |
|||
|
|||
import java.util.Calendar; |
|||
import java.util.Date; |
|||
import java.util.concurrent.ConcurrentHashMap; |
|||
import java.util.concurrent.ConcurrentMap; |
|||
import java.util.concurrent.TimeUnit; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
/** |
|||
* token 缓存 |
|||
* @author jian.mao |
|||
* @date 2023年11月8日 |
|||
* @description |
|||
*/ |
|||
@Slf4j |
|||
public class LocalCache { |
|||
|
|||
private static final ConcurrentMap<String, Value> CACHE = new ConcurrentHashMap<>(64); |
|||
|
|||
private LocalCache() { |
|||
} |
|||
|
|||
public static LocalCache getInstance() { |
|||
return Inner.LOCAL_CACHE; |
|||
} |
|||
|
|||
public static String get(String key) { |
|||
Value v = LocalCache.CACHE.get(key); |
|||
if (v == null || new Date().after(v.end)) { |
|||
return ""; |
|||
} |
|||
|
|||
log.debug("get key:{},time left:{}s", key, (v.end.getTime() - new Date().getTime()) / 1000); |
|||
return v.value; |
|||
} |
|||
|
|||
public static void set(String key, String value, int expire, TimeUnit timeUnit) { |
|||
Calendar calendar = Calendar.getInstance(); |
|||
calendar.add(Calendar.SECOND, (int) timeUnit.toSeconds(expire)); |
|||
Value v = new Value(value, calendar.getTime()); |
|||
log.debug("put key:{}, expire time:{} ", key, calendar.getTime()); |
|||
LocalCache.CACHE.put(key, v); |
|||
} |
|||
|
|||
private static class Value { |
|||
|
|||
String value; |
|||
Date end; |
|||
|
|||
public Value(String value, Date time) { |
|||
this.value = value; |
|||
this.end = time; |
|||
} |
|||
} |
|||
|
|||
private static class Inner { |
|||
|
|||
private static final LocalCache LOCAL_CACHE = new LocalCache(); |
|||
} |
|||
} |
@ -1,41 +0,0 @@ |
|||
package com.bfd.qanda.controller; |
|||
|
|||
import javax.annotation.Resource; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import org.springframework.stereotype.Controller; |
|||
import org.springframework.web.bind.annotation.PostMapping; |
|||
import org.springframework.web.bind.annotation.RequestBody; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RequestMethod; |
|||
import org.springframework.web.bind.annotation.ResponseBody; |
|||
|
|||
import com.bfd.qanda.service.QandaService; |
|||
|
|||
|
|||
/** |
|||
* @author jian.mao |
|||
* @date 2023年11月8日 |
|||
* @description |
|||
*/ |
|||
@Controller |
|||
@RequestMapping("/qanda") |
|||
@Slf4j |
|||
public class QandaController { |
|||
|
|||
@Resource |
|||
private QandaService qandaService; |
|||
@PostMapping("/putQuestion") |
|||
@ResponseBody |
|||
public String putQuestion(@RequestBody String dataJson){ |
|||
String response = qandaService.putQuestion(dataJson); |
|||
return response; |
|||
} |
|||
|
|||
@RequestMapping(value = "/hello", method = RequestMethod.GET) |
|||
@ResponseBody |
|||
public String hello(String param, String token) { |
|||
return "123"; |
|||
} |
|||
} |
@ -1,152 +0,0 @@ |
|||
package com.bfd.qanda.entity; |
|||
|
|||
|
|||
/** |
|||
* 常量实体类 |
|||
* @author jian.mao |
|||
* @date 2022年11月15日 |
|||
* @description |
|||
*/ |
|||
public class Constants { |
|||
|
|||
/*************************蓝图常量key名称*********************************/ |
|||
public final static String SCHEDULING = "scheduling"; |
|||
public final static String TYPE = "type"; |
|||
public final static String INTERVAL = "interval"; |
|||
public final static String CREATED = "created"; |
|||
public final static String LAST_EDIT = "last_edit"; |
|||
public final static String BLUEPRINT_ID = "blueprint_id"; |
|||
public final static String BLUEPRINTID = "blueprintId"; |
|||
public final static String BLUEPRINT_NAME = "name"; |
|||
public final static String SCENARIO = "scenario"; |
|||
public final static String AUTOCOMMITTRIGGERLAST = "autoCommitTriggerLast"; |
|||
public final static String FRESHVARIABLES = "freshVariables"; |
|||
public final static String AUTOCOMMIT = "autoCommit"; |
|||
public final static String MAXERRORS = "maxErrors"; |
|||
public final static String DATALOSS = "dataloss"; |
|||
public final static String POSITION = "position"; |
|||
public final static String SCENES_ID = "scenes_id"; |
|||
public final static String SCENESID = "scenesId"; |
|||
public final static String MULTI_BRANCH = "multi_branch"; |
|||
|
|||
public final static String SINGLE = "single"; |
|||
/**已重试次数**/ |
|||
public final static String ERROR_TIME = "error_time"; |
|||
public final static String PREVIOUS_RESULT = "previous_result"; |
|||
|
|||
/****数据id*****/ |
|||
public final static String BUSINESSKEY = "businessKey"; |
|||
|
|||
|
|||
/*************************metadata常量key名称*********************************/ |
|||
public final static String LABEL_COL = "label_col"; |
|||
public final static String LABEL = "label"; |
|||
public final static String USER = "user"; |
|||
public final static String ADMIN = "admin"; |
|||
public final static String ADDRESS = "address"; |
|||
public final static String DATASOURCE = "datasource"; |
|||
public final static String INDEX = "index"; |
|||
|
|||
/*************************app常量key名称*********************************/ |
|||
public final static String APPS = "apps"; |
|||
public final static String TRANSFER_ID = "transfer_id"; |
|||
public final static String MODULE = "module"; |
|||
public final static String VERSION = "version"; |
|||
public final static String METADATA = "metadata"; |
|||
public final static String APP_NAME = "name"; |
|||
public final static String DESCRIBE = "describe"; |
|||
public final static String NEXT_APP_ID = "next_app_id"; |
|||
public final static String EDGE_ID = "edge_id"; |
|||
public final static String START_ID = "start_id"; |
|||
public final static String END_ID = "end_id"; |
|||
|
|||
public final static String WAIT_CONDITION = "wait_condition"; |
|||
public final static String START_TAG = "start_tag"; |
|||
|
|||
/*************************module类型*********************************/ |
|||
public final static String FILE = "file"; |
|||
public final static String OCR = "OCR"; |
|||
public final static String FILTER = "Filter"; |
|||
public final static String CHATGPT = "ChatGPT"; |
|||
public final static String MYSQL = "mysql"; |
|||
|
|||
/*************************other类型*********************************/ |
|||
public final static String UNDERLINE = "_"; |
|||
public final static String RESULT_TOPIC = null; |
|||
public static final String EMPTY = ""; |
|||
public static final String HTTP = "http"; |
|||
public static final String REQUEST_ERROR_MESSAGE = "Download failed error is"; |
|||
public static final String REQUEST_RESULT = "result"; |
|||
public static final String REQUEST_RESULT_RESULTS = "results"; |
|||
public static final String MAP_TYPE = "Map"; |
|||
public static final String LIST_TYPE = "List"; |
|||
public static final String STRING_TYPE = "String"; |
|||
public static final String DOCUMENT_TYPE = "doc"; |
|||
public static final String FILTER_ZH = "过滤器"; |
|||
|
|||
public static final String JSON_SELE_SYMBOL = "$."; |
|||
public static final String LEFT_BRACKETS = "["; |
|||
public static final String RIGTH_BRACKETS = "]"; |
|||
public static final String TASKTYPE = "taskType"; |
|||
public static final Integer USER_TYPE = 1; |
|||
public static final Integer KEYWORD_TYPE = 0; |
|||
public static final Integer DETAIL_TYPE = 2; |
|||
public static final String CID = "cid"; |
|||
public static final String SITETYPE = "siteType"; |
|||
public static final Integer DEFULT_SUBJECTID = 304864; |
|||
public static final Integer DEFULT_CRAWLCYCLICITYTIME = 1440; |
|||
public static final String CRAWLENDTIME = "crawlEndTime"; |
|||
public static final String CRAWLSTARTTIME = "crawlStartTime"; |
|||
public static final String CRAWLPAGETYPES = "crawlPageTypes"; |
|||
public static final String APPID = "113ic"; |
|||
public static final String APP_ID = "appId"; |
|||
public final static String ID = "id"; |
|||
public static final Integer DEFULT_CRAWLPERIODHOUR = 24; |
|||
public static final String CREATEUSERID = "662015832180933762"; |
|||
public static final String CRAWL_ADD_URL = "https://caiji.percent.cn/api/crawl/remote/task/save"; |
|||
public static final String CRAWLKEYWORD = "crawlKeyword"; |
|||
public static final String ATTACHTAG = "attachTag"; |
|||
public static final String ATTACHTAG_VALUE = "analyze"; |
|||
public static final String KEYWORD = "keyword"; |
|||
public static final String SITEID = "siteId"; |
|||
public static final String RESULTS = "results"; |
|||
public static final String RESULT = "result"; |
|||
public static final String CRAWLDATAFLAG = "crawlDataFlag"; |
|||
public static final String CRAWLDATAFLAG_PREFIX = "\"crawlDataFlag\":\"keyword:"; |
|||
public static final String TID = "tid"; |
|||
public static final Long TIME_OUT = 1800000L; |
|||
public static final String ATTR = "attr"; |
|||
public static final String HASVIDEO = "hasVideo"; |
|||
public static final String CRAWL_END_MARK = "crawl_end_mark"; |
|||
public static final String CRAWL_END_MESSAGE = "crawl_end_message"; |
|||
public static final String CRAWL_END_MESSAGE_VALUE = "数据采集完成"; |
|||
public static final String SUBJECTID = "subjectId"; |
|||
public static final String TASKID = "taskId"; |
|||
public static final int SUCCESS_CODE = 200; |
|||
public static final String WEB_URL_SUFFIX = "/api/aogeo/api/cda/caiji/status"; |
|||
public static final String STATUS = "status"; |
|||
/************************redis*************************************/ |
|||
public static final String LOCK_KEY = "myLock"; |
|||
public static final long LOCK_EXPIRE_TIME = 300000; |
|||
|
|||
/************************应用参数*************************************/ |
|||
public static final String CODE = "code"; |
|||
public static final String MESSAGE = "message"; |
|||
public static final String INPUT = "input"; |
|||
public static final String OUTPUT = "output"; |
|||
public static final String FORM = "form"; |
|||
public static final String FIELD = "field"; |
|||
public static final String VALUE = "value"; |
|||
public static final String DATA = "data"; |
|||
public static final String COLON_EN = ":"; |
|||
/******************************admin*******************************/ |
|||
public static final String AUTHORIZATION = "authorization"; |
|||
public static final String TEMPERATURE = "temperature"; |
|||
public static final String FIELDTYPE = "fieldType"; |
|||
public static final String TOP_P = "top_p"; |
|||
public static final String MODEL = "model"; |
|||
public static final String PROMPT = "prompt"; |
|||
public static final String CHATGLM_TURBO_URL = "https://open.bigmodel.cn/api/paas/v4/chat/completions"; |
|||
public static final String CHOICES = "choices"; |
|||
public static final String CONTENT = "content"; |
|||
} |
@ -1,128 +0,0 @@ |
|||
package com.bfd.qanda.handler; |
|||
|
|||
import java.io.File; |
|||
import java.io.IOException; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
import java.util.concurrent.LinkedBlockingDeque; |
|||
|
|||
import javax.annotation.Resource; |
|||
|
|||
import com.bfd.util.PauseTool; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import org.apache.commons.io.FileUtils; |
|||
import org.springframework.beans.factory.annotation.Value; |
|||
import org.springframework.boot.ApplicationArguments; |
|||
import org.springframework.boot.ApplicationRunner; |
|||
import org.springframework.core.annotation.Order; |
|||
import org.springframework.data.redis.core.StringRedisTemplate; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.bfd.qanda.cache.ConfigCache; |
|||
import com.bfd.qanda.process.QandaPorcess; |
|||
import com.bfd.qanda.utils.FileUtil; |
|||
|
|||
|
|||
/** |
|||
* 启动处理入口 |
|||
* |
|||
* @author jian.mao |
|||
* @date 2023年11月3日 |
|||
* @description |
|||
*/ |
|||
|
|||
@Component |
|||
@Order(value = 1) |
|||
@Slf4j |
|||
public class MainHandler implements ApplicationRunner { |
|||
|
|||
@Value("${task.task-queue-path}") |
|||
private String taskPath; |
|||
@Value("${task.thread-num}") |
|||
private Integer threadNum; |
|||
@Resource |
|||
QandaPorcess qandaPorcess; |
|||
@Resource |
|||
private StringRedisTemplate stringRedisTemplate; |
|||
@Value("${zookeeper.connection-string}") |
|||
private String connectionString; |
|||
@Value("${zookeeper.publish-node}") |
|||
private String nodePath; |
|||
|
|||
@Override |
|||
public void run(ApplicationArguments args) throws Exception { |
|||
PauseTool pauseTool = new PauseTool(); |
|||
pauseTool.initializeRedisCache(stringRedisTemplate); |
|||
pauseTool.setupZookeeperListener(connectionString, nodePath); |
|||
for (Integer i = 0; i < threadNum; i++) { |
|||
//开启问答处理线程 |
|||
new Thread(qandaPorcess).start(); |
|||
log.info("开启问答处理线程-----"); |
|||
} |
|||
|
|||
//停止处理 |
|||
waitDown(); |
|||
//启动加载缓存任务 |
|||
readTask(taskPath, ConfigCache.taskQueue); |
|||
} |
|||
|
|||
|
|||
@SuppressWarnings("unchecked") |
|||
public static void readTask(String path, LinkedBlockingDeque<Map<String, Object>> queue) { |
|||
File file = new File(path); |
|||
if (file.exists()) { |
|||
List<String> tasks = null; |
|||
try { |
|||
tasks = FileUtils.readLines(file, "UTF-8"); |
|||
} catch (IOException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
for (String taskStr : tasks) { |
|||
Map<String, Object> task = JSONObject.parseObject(taskStr); |
|||
try { |
|||
queue.put(task); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
file.delete(); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 结束触发钩子 |
|||
*/ |
|||
public void waitDown() { |
|||
Runtime.getRuntime().addShutdownHook(new Thread() { |
|||
@Override |
|||
public void run() { |
|||
// 停止线程 |
|||
ConfigCache.isStart = false; |
|||
log.info("stop-------"); |
|||
writeTsskToFile(); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 任务持久化到硬盘 |
|||
*/ |
|||
public void writeTsskToFile() { |
|||
while (true) { |
|||
if (ConfigCache.taskQueue.size() > 0) { |
|||
try { |
|||
Map<String, Object> task = ConfigCache.taskQueue.take(); |
|||
FileUtil.writeFile(taskPath, JSONObject.toJSONString(task)); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} else { |
|||
log.info("taskQueue write is file end"); |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
@ -1,193 +0,0 @@ |
|||
package com.bfd.qanda.process; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
import java.util.UUID; |
|||
|
|||
import com.bfd.qanda.utils.GPTResultParseUtil; |
|||
import com.bfd.util.PauseTool; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.beans.factory.annotation.Value; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.bfd.qanda.cache.ConfigCache; |
|||
import com.bfd.qanda.entity.Constants; |
|||
import com.bfd.qanda.token.TokenManagerV3; |
|||
import com.bfd.qanda.utils.DataUtil; |
|||
import com.bfd.qanda.utils.DownLoadUtil; |
|||
import com.bfd.qanda.utils.SpringBootKafka; |
|||
|
|||
/** |
|||
* @author jian.mao |
|||
* @date 2023年11月8日 |
|||
* @description |
|||
*/ |
|||
@Component |
|||
@Slf4j |
|||
public class QandaPorcess implements Runnable { |
|||
private static final int CHAT_TYPE_ONE = 1; |
|||
@Autowired |
|||
private SpringBootKafka springBootKafka; |
|||
@Value("${customize-kafka.producer.topic}") |
|||
private String topic; |
|||
|
|||
@Override |
|||
public void run() { |
|||
while (ConfigCache.isStart) { |
|||
Map<String, Object> task = null; |
|||
try { |
|||
task = ConfigCache.taskQueue.take(); |
|||
//结果接收 |
|||
Map<String, Object> result = new HashMap<String, Object>(16); |
|||
//结果内容 |
|||
StringBuffer chatContent = new StringBuffer(); |
|||
//输入配置 |
|||
Map<String, Object> input = (Map<String, Object>) task.get(Constants.INPUT); |
|||
//输出配置 |
|||
Map<String, Object> output = (Map<String, Object>) task.get(Constants.OUTPUT); |
|||
//数据源 |
|||
Map<String, Object> data = (Map<String, Object>) task.get(Constants.DATA); |
|||
int scenesId = (int) task.get(Constants.SCENES_ID); |
|||
int version = (int) task.get(Constants.VERSION); |
|||
String pauseKey = scenesId + "_" + version; |
|||
if (!PauseTool.CACHE.containsKey(pauseKey)) { |
|||
log.info("流程:{}的版本:{}已失效,任务跳过", scenesId, version); |
|||
continue; |
|||
} |
|||
//请求身份校验 api-key |
|||
String authorization = (String) input.get(Constants.AUTHORIZATION); |
|||
//fieldType:自定义输出字段: 0 关闭,1-开启,如果开启则拼接form到output里(如果关闭,则取默认的output拼接) |
|||
int fieldType = (int) input.get(Constants.FIELDTYPE); |
|||
Float temperature = Float.valueOf(input.get(Constants.TEMPERATURE).toString()); |
|||
Float topP = Float.valueOf(input.get(Constants.TOP_P).toString()); |
|||
String model = (String) input.get(Constants.MODEL).toString(); |
|||
List<Map<String, Object>> prompt = (List<Map<String, Object>>) input.get(Constants.PROMPT); |
|||
String answerStr = qandaRequest(authorization, model, temperature, topP, prompt, data); |
|||
log.info("answerStr:" + answerStr); |
|||
Map<String, Object> answer = JSONObject.parseObject(answerStr); |
|||
try { |
|||
//请求成功,正常解析 |
|||
List<Map<String, Object>> choices = (List<Map<String, Object>>) answer.get(Constants.CHOICES); |
|||
Map<String, Object> message = (Map<String, Object>) choices.get(0).get(Constants.MESSAGE); |
|||
chatContent.append(message.get(Constants.CONTENT)); |
|||
} catch (Exception e) { |
|||
log.error("问答接口响应体异常:{}", answerStr, e); |
|||
// TODO: handle exception |
|||
continue; |
|||
} |
|||
Map<String, Object> results = new HashMap<String, Object>(16); |
|||
results.put(Constants.ID, UUID.randomUUID().toString()); |
|||
results.put(Constants.CONTENT, chatContent.toString()); |
|||
if (fieldType != 0) { |
|||
results.remove(Constants.CONTENT); |
|||
try { |
|||
//请求成功,正常解析 |
|||
List<Map<String, Object>> choices = (List<Map<String, Object>>) answer.get(Constants.CHOICES); |
|||
Map<String, Object> message = (Map<String, Object>) choices.get(0).get(Constants.MESSAGE); |
|||
String reponseContent = (String) message.get(Constants.CONTENT); |
|||
Map<String, Object> stringObjectMap = GPTResultParseUtil.parseGPTResult(output, reponseContent); |
|||
results.putAll(stringObjectMap); |
|||
} catch (Exception e) { |
|||
log.error("问答接口响应体异常:{}", answerStr, e); |
|||
// TODO: handle exception |
|||
continue; |
|||
} |
|||
} |
|||
results.put("isLast", 1); |
|||
result.put(Constants.RESULTS, JSONObject.toJSONString(results)); |
|||
result.put(Constants.MESSAGE, "成功"); |
|||
result.put(Constants.STATUS, 1); |
|||
task.put(Constants.RESULT, result); |
|||
// //发送kafka |
|||
springBootKafka.send(topic, JSONObject.toJSONString(task)); |
|||
log.info("数据流转至下游-------"); |
|||
} catch (Exception e) { |
|||
log.error("问答处理异常,", e); |
|||
//结果集 |
|||
Map<String, Object> results = new HashMap<String, Object>(16); |
|||
|
|||
Map<String, Object> result = new HashMap<String, Object>(16); |
|||
//遍历入库返回结果,拼接响应内容 |
|||
results.put("isLast", 1); |
|||
results.put("content", e.getMessage()); |
|||
result.put(Constants.RESULTS, JSONObject.toJSONString(results)); |
|||
result.put(Constants.MESSAGE, "异常"); |
|||
result.put(Constants.STATUS, 2); |
|||
task.put(Constants.RESULT, result); |
|||
//发送kafka |
|||
springBootKafka.send(topic, JSONObject.toJSONString(task)); |
|||
log.info("数据流转至下游-------"); |
|||
|
|||
|
|||
} |
|||
|
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 问题请求 |
|||
* |
|||
* @param authorization |
|||
* @param temperature |
|||
* @param topP |
|||
* @param prompt |
|||
* @return |
|||
*/ |
|||
private String qandaRequest(String authorization, String model, Float temperature, Float topP, List<Map<String, Object>> prompt, Map<String, Object> data) { |
|||
//新建聊天话术 |
|||
StringBuffer chatContent = new StringBuffer(); |
|||
for (Map<String, Object> map : prompt) { |
|||
if (Integer.valueOf(map.get(Constants.TYPE).toString()) == CHAT_TYPE_ONE) { |
|||
chatContent.append(map.get(Constants.VALUE)); |
|||
} else { |
|||
String jsonPath = (String) map.get(Constants.VALUE); |
|||
chatContent.append(DataUtil.getValue(jsonPath, data).toString()); |
|||
} |
|||
} |
|||
//拆分authorization |
|||
String[] apiCombination = authorization.split("\\."); |
|||
//获取token |
|||
String token = TokenManagerV3.getToken(apiCombination[0], apiCombination[1]); |
|||
StringBuffer encryptionAuthorization = new StringBuffer("Bearer "); |
|||
encryptionAuthorization.append(token); |
|||
Map<String, Object> headers = new HashMap<String, Object>(16); |
|||
Map<String, Object> params = new HashMap<String, Object>(16); |
|||
List<Map<String, Object>> prompts = buildParam(chatContent.toString(), data); |
|||
|
|||
params.put("model", model); |
|||
params.put("messages", prompts); |
|||
params.put("temperature", temperature); |
|||
params.put("top_p", topP); |
|||
|
|||
headers.put("Authorization", encryptionAuthorization.toString()); |
|||
headers.put("Content-Type", "application/json"); |
|||
String html = DownLoadUtil.doPost(Constants.CHATGLM_TURBO_URL, JSONObject.toJSONString(params), headers); |
|||
return html; |
|||
} |
|||
|
|||
/** |
|||
* 参数构建 |
|||
* |
|||
* @param prompt |
|||
* @param data |
|||
* @return |
|||
*/ |
|||
private List<Map<String, Object>> buildParam(String prompt, Map<String, Object> data) { |
|||
//聊天体 |
|||
List<Map<String, Object>> prompts = new ArrayList<Map<String, Object>>(); |
|||
log.info("question---{}", prompt); |
|||
Map<String, Object> chat1 = new HashMap<String, Object>(16); |
|||
chat1.put("role", "user"); |
|||
chat1.put("content", prompt); |
|||
prompts.add(chat1); |
|||
return prompts; |
|||
} |
|||
|
|||
|
|||
} |
@ -1,17 +0,0 @@ |
|||
package com.bfd.qanda.service; |
|||
|
|||
/** |
|||
* 问答业务层 |
|||
* @author jian.mao |
|||
* @date 2023年11月8日 |
|||
* @description |
|||
*/ |
|||
public interface QandaService { |
|||
|
|||
/** |
|||
* 问答 |
|||
* @param dataJson 接口参数 |
|||
* @return |
|||
*/ |
|||
public String putQuestion(String dataJson); |
|||
} |
@ -1,58 +0,0 @@ |
|||
package com.bfd.qanda.service.impl; |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.bfd.qanda.cache.ConfigCache; |
|||
import com.bfd.qanda.entity.Constants; |
|||
import com.bfd.qanda.service.QandaService; |
|||
|
|||
/** |
|||
* 业务层实现类 |
|||
* |
|||
* @author jian.mao |
|||
* @date 2023年11月8日 |
|||
* @description |
|||
*/ |
|||
@Service |
|||
@Slf4j |
|||
public class QandaServiceImpl implements QandaService { |
|||
|
|||
@Override |
|||
public String putQuestion(String dataJson) { |
|||
String trace = "trace"; |
|||
Map<String, Object> response = new HashMap<>(16); |
|||
int code = 200; |
|||
String message = "success"; |
|||
Map<String, Object> task = null; |
|||
try { |
|||
task = JSONObject.parseObject(dataJson); |
|||
} catch (Exception e) { |
|||
log.error("参数结构不合法,", e); |
|||
code = 100010; |
|||
message = "参数不合法"; |
|||
} |
|||
// 写入队列 |
|||
try { |
|||
if (task.containsKey(trace) && (Boolean) task.get(trace)==true) { |
|||
log.info("测试流程,插入队首"); |
|||
ConfigCache.taskQueue.putFirst(task); |
|||
}else { |
|||
ConfigCache.taskQueue.put(task); |
|||
} |
|||
} catch (InterruptedException e) { |
|||
log.error("任务写入等待队列异常,", e); |
|||
code = 100011; |
|||
message = "任务写入等待队列失败"; |
|||
} |
|||
response.put(Constants.CODE, code); |
|||
response.put(Constants.MESSAGE, message); |
|||
return JSONObject.toJSONString(response); |
|||
} |
|||
|
|||
} |
@ -1,93 +0,0 @@ |
|||
package com.bfd.qanda.token; |
|||
|
|||
import java.util.Calendar; |
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
import java.util.concurrent.TimeUnit; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import com.auth0.jwt.JWT; |
|||
import com.auth0.jwt.algorithms.Algorithm; |
|||
import com.bfd.qanda.cache.LocalCache; |
|||
import com.bfd.qanda.entity.Constants; |
|||
|
|||
/** |
|||
* token管理类 |
|||
* @author jian.mao |
|||
* @date 2023年11月8日 |
|||
* @description |
|||
*/ |
|||
@Slf4j |
|||
public class TokenManagerV3 { |
|||
|
|||
private static final String TOKENV3KEYPREFIX = "zhipu_oapi_token_v3"; |
|||
private static final String ALG = "HS256"; |
|||
/***默认过期时间30分钟****/ |
|||
private static final int EXPIREMILLIS = 30 * 60 * 1000; |
|||
|
|||
/** |
|||
* token 获取方法 |
|||
* @param apiKey 用户id |
|||
* @param apiSecret 生成key |
|||
* @return |
|||
*/ |
|||
public static String getToken(String apiKey,String apiSecret) { |
|||
String tokenCacheKey = genTokenCacheKey(apiKey); |
|||
String cacheToken = LocalCache.get(tokenCacheKey); |
|||
if(cacheToken != null && !cacheToken.equals(Constants.EMPTY)){ |
|||
return cacheToken; |
|||
} |
|||
String newToken = createJwt(apiKey,apiSecret); |
|||
LocalCache.set(tokenCacheKey, newToken, EXPIREMILLIS, TimeUnit.MILLISECONDS); |
|||
return newToken; |
|||
} |
|||
|
|||
/** |
|||
* token 计算 |
|||
* @param apiKey |
|||
* @param apiSecret |
|||
* @return |
|||
*/ |
|||
private static String createJwt(String apiKey,String apiSecret) { |
|||
Algorithm alg; |
|||
String hs = "HS256"; |
|||
if (ALG.equals(hs)) { |
|||
//alg = Algorithm.HMAC256(config.getApiSecret()); |
|||
try { |
|||
alg = Algorithm.HMAC256(apiSecret.getBytes("utf-8")); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
return null; |
|||
} |
|||
} else { |
|||
// 目前仅支持HS256 |
|||
log.error("algorithm: %s not supported", ALG); |
|||
return null; |
|||
} |
|||
|
|||
Map<String, Object> payload = new HashMap<>(16); |
|||
payload.put("api_key", apiKey); |
|||
payload.put("exp", System.currentTimeMillis() + EXPIREMILLIS); |
|||
payload.put("timestamp", Calendar.getInstance().getTimeInMillis()); |
|||
Map<String, Object> headerClaims = new HashMap<>(16); |
|||
headerClaims.put("alg", "HS256"); |
|||
headerClaims.put("sign_type", "SIGN"); |
|||
String token = JWT.create().withPayload(payload).withHeader(headerClaims).sign(alg); |
|||
return token; |
|||
} |
|||
|
|||
/** |
|||
* 获取缓存key |
|||
* @param apiKey |
|||
* @return |
|||
*/ |
|||
private static String genTokenCacheKey(String apiKey) { |
|||
return String.format("%s-%s", TOKENV3KEYPREFIX, apiKey); |
|||
} |
|||
public static void main(String[] args) { |
|||
String apiKey ="53dbef19a3252a292890408707190f9f"; |
|||
String apiSecret="5An47w6PngrTFw19"; |
|||
System.out.println(getToken(apiKey,apiSecret)); |
|||
} |
|||
} |
@ -1,48 +0,0 @@ |
|||
package com.bfd.qanda.utils; |
|||
|
|||
import com.alibaba.fastjson.JSON; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.alibaba.fastjson.JSONPath; |
|||
|
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* @author:jinming |
|||
* @className:DataUtil |
|||
* @version:1.0 |
|||
* @description: 获取dataValue的值 |
|||
* @Date:2023/11/1 9:54 |
|||
*/ |
|||
public class DataUtil { |
|||
/** |
|||
* |
|||
* @param key 传入的key |
|||
* @param dataMap 数据map |
|||
* @return 根据传入的参数进行判断解析,返回正确的dataValue |
|||
*/ |
|||
public static Object getValue(String key, Map dataMap) { |
|||
Object dataValue; |
|||
String isJson = "#json#"; |
|||
if (key.contains(isJson)) { |
|||
//进行第一次拆分,获取#json#前面的部分 |
|||
String[] keySplit = key.split(isJson); |
|||
String firstDataKey = keySplit[0]; |
|||
String[] firstDataKeySplit = firstDataKey.split(":"); |
|||
//取出前半部分对应的JSON数据并转换为JSONObject |
|||
String dataJson = (String) dataMap.get(firstDataKeySplit[0]); |
|||
JSONObject dataJsonObject = JSON.parseObject(dataJson); |
|||
//根据key的后半部分取出对应JSONObject中的值 |
|||
String firstDataKeyJson = (String) JSONPath.eval(dataJsonObject, firstDataKeySplit[1]); |
|||
String secDataKey = keySplit[1]; |
|||
JSONObject firstDataJsonObject = JSON.parseObject(firstDataKeyJson); |
|||
dataValue = JSONPath.eval(firstDataJsonObject, secDataKey); |
|||
return dataValue; |
|||
} |
|||
String[] keySplit = key.split(":"); |
|||
String jsonPath = keySplit[1]; |
|||
String dataJson = (String) dataMap.get(keySplit[0]); |
|||
JSONObject dataJsonObject = JSON.parseObject(dataJson); |
|||
dataValue = JSONPath.eval(dataJsonObject, jsonPath); |
|||
return dataValue; |
|||
} |
|||
} |
@ -1,177 +0,0 @@ |
|||
package com.bfd.qanda.utils; |
|||
|
|||
|
|||
import java.math.BigInteger; |
|||
import java.security.MessageDigest; |
|||
import java.security.NoSuchAlgorithmException; |
|||
import java.text.ParseException; |
|||
import java.text.SimpleDateFormat; |
|||
import java.time.LocalDateTime; |
|||
import java.time.format.DateTimeFormatter; |
|||
import java.util.Date; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import com.alibaba.fastjson.JSON; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
|
|||
/** |
|||
* 日期工具类 |
|||
* |
|||
* @author jian.mao |
|||
* @date 2022年11月15日 |
|||
* @description |
|||
*/ |
|||
@Slf4j |
|||
public class DateUtil { |
|||
|
|||
/** |
|||
* @return |
|||
*/ |
|||
public static String getTimeStrForNow() { |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH"); |
|||
return sdf.format(new Date()); |
|||
} |
|||
|
|||
|
|||
public static String getTimeStrForDay(long time) { |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); |
|||
|
|||
return sdf.format(new Date(time * 1000)); |
|||
} |
|||
|
|||
public static String getTimeStrForDay() { |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); |
|||
|
|||
return sdf.format(new Date()); |
|||
} |
|||
|
|||
|
|||
public static String getDateTime() { |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|||
String time = sdf.format(new Date()); |
|||
return time; |
|||
} |
|||
|
|||
public static String getDateTime(Long timestap) { |
|||
|
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|||
String time = sdf.format(new Date(timestap)); |
|||
return time; |
|||
} |
|||
|
|||
public static String getDate(Long timestap) { |
|||
|
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
|||
String time = sdf.format(new Date(timestap)); |
|||
return time; |
|||
} |
|||
|
|||
public static String getDateTimeForMonth() { |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM"); |
|||
String time = sdf.format(new Date()); |
|||
return time; |
|||
} |
|||
|
|||
/** |
|||
* 休眠 |
|||
* |
|||
* @param millis 毫秒 |
|||
*/ |
|||
public static void sleep(long millis) { |
|||
try { |
|||
Thread.sleep(millis); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 1. @Description:时间戳转时间 |
|||
* 2. @Author: ying.zhao |
|||
* 3. @Date: 2023/3/28 |
|||
*/ |
|||
|
|||
public static String timestampToDate(String time) { |
|||
int thirteen = 13; |
|||
int ten = 10; |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|||
// if (time.length() == thirteen) { |
|||
if (time.length() > ten) { |
|||
return sdf.format(new Date(Long.parseLong(time))); |
|||
} else { |
|||
return sdf.format(new Date(Integer.parseInt(time) * 1000L)); |
|||
} |
|||
} |
|||
|
|||
public static String parseCreated(String jsonTime){ |
|||
String formattedDateTime = getDateTime(); |
|||
try { |
|||
// 使用fastjson解析JSON数据 |
|||
JSONObject jsonObject = JSON.parseObject(jsonTime); |
|||
// 获取日期和时间的值 |
|||
JSONObject dateObject = jsonObject.getJSONObject("date"); |
|||
int day = dateObject.getIntValue("day"); |
|||
int month = dateObject.getIntValue("month"); |
|||
int year = dateObject.getIntValue("year"); |
|||
|
|||
JSONObject timeObject = jsonObject.getJSONObject("time"); |
|||
int hour = timeObject.getIntValue("hour"); |
|||
int minute = timeObject.getIntValue("minute"); |
|||
int second = timeObject.getIntValue("second"); |
|||
|
|||
// 创建LocalDateTime对象 |
|||
LocalDateTime dateTime = LocalDateTime.of(year, month, day, hour, minute, second); |
|||
|
|||
// 定义日期时间格式化器 |
|||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); |
|||
|
|||
// 格式化日期时间 |
|||
formattedDateTime = dateTime.format(formatter); |
|||
} catch (Exception e) { |
|||
log.info("日期转换失败:{}",e); |
|||
} |
|||
return formattedDateTime; |
|||
} |
|||
|
|||
/** |
|||
* 字符串转换日期 |
|||
* @param format |
|||
* @param date |
|||
* @return |
|||
*/ |
|||
public static Date strToDate(String format,String date){ |
|||
SimpleDateFormat sdf = new SimpleDateFormat(format); |
|||
if (date == null || date.equals("")){ |
|||
return new Date(); |
|||
}else{ |
|||
Date ru = null; |
|||
try { |
|||
ru = sdf.parse(date); |
|||
} catch (ParseException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
return ru; |
|||
} |
|||
} |
|||
/** |
|||
* 日期格式话 |
|||
* @param format 日期格式 |
|||
* @param dater 要转换的日期,默认当前时间 |
|||
* @return |
|||
*/ |
|||
public static String FormatDate(String format,Date date){ |
|||
String fromatDate = null; |
|||
SimpleDateFormat sdf = new SimpleDateFormat(format); |
|||
if (date == null){ |
|||
fromatDate = sdf.format(new Date()); |
|||
}else{ |
|||
fromatDate = sdf.format(date); |
|||
} |
|||
return fromatDate; |
|||
} |
|||
public static void main(String[] args) { |
|||
String time = timestampToDate("955814400000"); |
|||
System.out.println(time); |
|||
} |
|||
} |
@ -1,914 +0,0 @@ |
|||
package com.bfd.qanda.utils; |
|||
|
|||
import java.io.IOException; |
|||
import java.security.KeyManagementException; |
|||
import java.security.NoSuchAlgorithmException; |
|||
import java.security.cert.CertificateException; |
|||
import java.util.LinkedList; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
import javax.net.ssl.SSLContext; |
|||
import javax.net.ssl.TrustManager; |
|||
import javax.net.ssl.X509TrustManager; |
|||
|
|||
import org.apache.http.HttpEntity; |
|||
import org.apache.http.HttpHost; |
|||
import org.apache.http.HttpResponse; |
|||
import org.apache.http.NameValuePair; |
|||
import org.apache.http.StatusLine; |
|||
import org.apache.http.auth.AuthScope; |
|||
import org.apache.http.auth.UsernamePasswordCredentials; |
|||
import org.apache.http.client.AuthCache; |
|||
import org.apache.http.client.ClientProtocolException; |
|||
import org.apache.http.client.CredentialsProvider; |
|||
import org.apache.http.client.HttpClient; |
|||
import org.apache.http.client.HttpRequestRetryHandler; |
|||
import org.apache.http.client.config.RequestConfig; |
|||
import org.apache.http.client.entity.UrlEncodedFormEntity; |
|||
import org.apache.http.client.methods.CloseableHttpResponse; |
|||
import org.apache.http.client.methods.HttpGet; |
|||
import org.apache.http.client.methods.HttpPost; |
|||
import org.apache.http.client.protocol.HttpClientContext; |
|||
import org.apache.http.config.Registry; |
|||
import org.apache.http.config.RegistryBuilder; |
|||
import org.apache.http.config.SocketConfig; |
|||
import org.apache.http.conn.socket.ConnectionSocketFactory; |
|||
import org.apache.http.conn.socket.LayeredConnectionSocketFactory; |
|||
import org.apache.http.conn.socket.PlainConnectionSocketFactory; |
|||
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; |
|||
import org.apache.http.entity.StringEntity; |
|||
import org.apache.http.impl.auth.BasicScheme; |
|||
import org.apache.http.impl.client.BasicAuthCache; |
|||
import org.apache.http.impl.client.BasicCredentialsProvider; |
|||
import org.apache.http.impl.client.CloseableHttpClient; |
|||
import org.apache.http.impl.client.HttpClientBuilder; |
|||
import org.apache.http.impl.client.HttpClients; |
|||
import org.apache.http.impl.client.LaxRedirectStrategy; |
|||
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; |
|||
import org.apache.http.message.BasicNameValuePair; |
|||
import org.apache.http.util.EntityUtils; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import com.bfd.qanda.entity.Constants; |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
/** |
|||
* 下载工具类 |
|||
* @author jian.mao |
|||
* @date 2023年9月19日 |
|||
* @description |
|||
*/ |
|||
public class DownLoadUtil { |
|||
|
|||
private static String ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36"; |
|||
private final static Logger log = LoggerFactory.getLogger(DownLoadUtil.class); |
|||
/** 代理服务器(产品官网 www.16yun.cn) **/ |
|||
final static String PROXYHOST = "u270.40.tp.16yun.cn"; |
|||
final static Integer PROXYPORT = 6448; |
|||
/** 代理验证信息 **/ |
|||
final static String PROXYUSER = "16HFBVJC"; |
|||
final static String PROXYPASS = "897944"; |
|||
|
|||
private static PoolingHttpClientConnectionManager cm = null; |
|||
private static HttpRequestRetryHandler httpRequestRetryHandler = null; |
|||
private static HttpHost proxy = null; |
|||
|
|||
private static CredentialsProvider credsProvider = null; |
|||
private static RequestConfig reqConfig = null; |
|||
|
|||
static { |
|||
ConnectionSocketFactory plainsf = PlainConnectionSocketFactory |
|||
.getSocketFactory(); |
|||
LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory |
|||
.getSocketFactory(); |
|||
|
|||
Registry registry = RegistryBuilder.create().register("http", plainsf) |
|||
.register("https", sslsf).build(); |
|||
|
|||
cm = new PoolingHttpClientConnectionManager(registry); |
|||
cm.setMaxTotal(20); |
|||
cm.setDefaultMaxPerRoute(5); |
|||
|
|||
proxy = new HttpHost(PROXYHOST, PROXYPORT, "https"); |
|||
|
|||
credsProvider = new BasicCredentialsProvider(); |
|||
credsProvider.setCredentials(AuthScope.ANY, |
|||
new UsernamePasswordCredentials(PROXYUSER, PROXYPASS)); |
|||
|
|||
reqConfig = RequestConfig.custom().setConnectionRequestTimeout(5000) |
|||
.setConnectTimeout(5000).setSocketTimeout(5000) |
|||
.setExpectContinueEnabled(false) |
|||
.setProxy(new HttpHost(PROXYHOST, PROXYPORT)).build(); |
|||
} |
|||
|
|||
/** |
|||
* 模拟客户端get请求 |
|||
* |
|||
* @param url |
|||
* 模拟请求得url |
|||
* @param headers |
|||
* 头部信息,没有可以不传 |
|||
* @return |
|||
*/ |
|||
@SafeVarargs |
|||
public static String proxyDoGet(String url, Map<String, Object>... headers) { |
|||
// 设置超时时间 |
|||
int timeout = 30; |
|||
RequestConfig config = RequestConfig.custom() |
|||
.setConnectTimeout(timeout * 1000) |
|||
.setConnectionRequestTimeout(timeout * 1000) |
|||
.setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(timeout * 1000) |
|||
.setTcpNoDelay(true).build(); |
|||
AuthCache authCache = new BasicAuthCache(); |
|||
authCache.put(proxy, new BasicScheme()); |
|||
HttpClientContext localContext = HttpClientContext.create(); |
|||
localContext.setAuthCache(authCache); |
|||
HttpClientBuilder httpBuilder = HttpClientBuilder.create(); |
|||
CloseableHttpClient httpClient = httpBuilder |
|||
.setDefaultSocketConfig(socketConfig) |
|||
.setDefaultRequestConfig(config) |
|||
.setDefaultCredentialsProvider(credsProvider).build(); |
|||
HttpGet httpGet = new HttpGet(url); |
|||
httpGet.setConfig(reqConfig); |
|||
if (headers != null && headers.length > 0) { |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpGet.setHeader(key, tempHeaders.get(key).toString()); |
|||
} |
|||
} else { |
|||
httpGet.setHeader("Accept", |
|||
"application/json, text/javascript, */*; q=0.01"); |
|||
httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); |
|||
} |
|||
CloseableHttpResponse response = null; |
|||
String html = ""; |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
try { |
|||
response = httpClient.execute(httpGet, localContext); |
|||
// 从响应模型中获取响应实体 |
|||
HttpEntity responseEntity = response.getEntity(); |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
if (statusLine.getStatusCode() == successCode) { |
|||
if (responseEntity != null) { |
|||
html = EntityUtils.toString(responseEntity, "utf-8"); |
|||
System.out.println("响应内容长度为:" |
|||
+ responseEntity.getContentLength()); |
|||
// 下载结果为空不正常 |
|||
if (html.equals(Constants.EMPTY)) { |
|||
html = "Download failed error is:reslut is null"; |
|||
} |
|||
} |
|||
} else if (statusLine.getStatusCode() == notFundCode) { |
|||
html = "<h2>页面404,正常结束请求即可</h2>"; |
|||
} else { |
|||
throw new Exception("请求错误,code码为:" + statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:reslut is null"; |
|||
}finally{ |
|||
try { |
|||
response.close(); |
|||
httpClient.close(); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
return html; |
|||
|
|||
} |
|||
|
|||
|
|||
public static String httpsslProxyGet(String url, Map<String, Object>... headers) throws Exception { |
|||
//采用绕过验证的方式处理https请求 |
|||
SSLContext sslcontext = createIgnoreVerifySSL(); |
|||
|
|||
// 设置协议http和https对应的处理socket链接工厂的对象 |
|||
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() |
|||
.register("http", PlainConnectionSocketFactory.INSTANCE) |
|||
.register("https", new SSLConnectionSocketFactory(sslcontext)) |
|||
.build(); |
|||
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); |
|||
connManager.setMaxTotal(50); |
|||
connManager.setDefaultMaxPerRoute(10); |
|||
HttpClients.custom().setConnectionManager(connManager); |
|||
// 设置超时时间 |
|||
int timeout = 30; |
|||
RequestConfig config = RequestConfig.custom() |
|||
.setConnectTimeout(timeout * 1000) |
|||
.setConnectionRequestTimeout(timeout * 1000) |
|||
.setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(timeout * 1000) |
|||
.setTcpNoDelay(true).build(); |
|||
AuthCache authCache = new BasicAuthCache(); |
|||
authCache.put(proxy, new BasicScheme()); |
|||
HttpClientContext localContext = HttpClientContext.create(); |
|||
localContext.setAuthCache(authCache); |
|||
HttpClientBuilder httpBuilder = HttpClientBuilder.create(); |
|||
CloseableHttpClient httpClient = httpBuilder |
|||
.setConnectionManager(connManager) |
|||
.setDefaultSocketConfig(socketConfig) |
|||
.setDefaultRequestConfig(config) |
|||
.setDefaultCredentialsProvider(credsProvider).build(); |
|||
HttpGet httpGet = new HttpGet(url); |
|||
httpGet.setConfig(reqConfig); |
|||
if (headers != null && headers.length > 0) { |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpGet.setHeader(key, tempHeaders.get(key).toString()); |
|||
} |
|||
} else { |
|||
httpGet.setHeader("Accept", |
|||
"application/json, text/javascript, */*; q=0.01"); |
|||
httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); |
|||
} |
|||
CloseableHttpResponse response = null; |
|||
String html = ""; |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
try { |
|||
response = httpClient.execute(httpGet, localContext); |
|||
// 从响应模型中获取响应实体 |
|||
HttpEntity responseEntity = response.getEntity(); |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
if (statusLine.getStatusCode() == successCode) { |
|||
if (responseEntity != null) { |
|||
html = EntityUtils.toString(responseEntity, "utf-8"); |
|||
System.out.println("响应内容长度为:" |
|||
+ responseEntity.getContentLength()); |
|||
// 下载结果为空不正常 |
|||
if (html.equals(Constants.EMPTY)) { |
|||
html = "Download failed error is:reslut is null"; |
|||
} |
|||
} |
|||
} else if (statusLine.getStatusCode() == notFundCode) { |
|||
html = "<h2>页面404,正常结束请求即可</h2>"; |
|||
} else { |
|||
throw new Exception("请求错误,code码为:" + statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:reslut is null"; |
|||
}finally{ |
|||
try { |
|||
response.close(); |
|||
httpClient.close(); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
return html; |
|||
|
|||
} |
|||
|
|||
|
|||
/** |
|||
* json参数方式POST提交 |
|||
* @param url |
|||
* @param params |
|||
* @return |
|||
*/ |
|||
public static String doPost(String url, String params, Map<String, Object>... headers){ |
|||
String strResult = ""; |
|||
//设置超时时间 |
|||
int timeout = 60; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(timeout * 1000) |
|||
.setTcpNoDelay(true).build(); |
|||
// AuthCache authCache = new BasicAuthCache(); |
|||
// authCache.put(proxy, new BasicScheme()); |
|||
// HttpClientContext localContext = HttpClientContext.create(); |
|||
// localContext.setAuthCache(authCache); |
|||
// 1. 获取默认的client实例 |
|||
HttpClientBuilder httpBuilder = HttpClientBuilder.create(); |
|||
httpBuilder.setUserAgent(ua); |
|||
HttpClient client = httpBuilder.setDefaultSocketConfig(socketConfig).setDefaultRequestConfig(config).build(); |
|||
// HttpClient client = httpBuilder.setDefaultSocketConfig(socketConfig).setDefaultRequestConfig(config).setConnectionManager(cm) |
|||
// .setDefaultCredentialsProvider(credsProvider).build(); |
|||
// 2. 创建httppost实例 |
|||
HttpPost httpPost = new HttpPost(url); |
|||
// httpPost.setConfig(reqConfig); |
|||
if (headers != null && headers.length > 0) { |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpPost.setHeader(key, tempHeaders.get(key).toString()); |
|||
} |
|||
} else { |
|||
httpPost.addHeader("Content-Type", "application/json;charset=utf-8"); |
|||
} |
|||
HttpResponse resp = null; |
|||
try { |
|||
httpPost.setEntity(new StringEntity(params,"utf-8")); |
|||
resp = client.execute(httpPost); |
|||
// resp = client.execute(httpPost,localContext); |
|||
StatusLine statusLine = resp.getStatusLine(); |
|||
System.out.println("响应状态为:" + resp.getStatusLine()); |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
// 7. 获取响应entity |
|||
HttpEntity respEntity = resp.getEntity(); |
|||
strResult = EntityUtils.toString(respEntity, "UTF-8"); |
|||
if(strResult.equals(Constants.EMPTY)){ |
|||
strResult = "Download failed error is:reslut is null"; |
|||
} |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
strResult = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
} |
|||
return strResult; |
|||
} |
|||
public static String httpPost(String url,String params) { |
|||
String html=""; |
|||
html = doPost(url,params); |
|||
int i = 1; |
|||
while(true){ |
|||
if(html.contains("Download failed error is:")){ |
|||
log.error("DownLoadUtil------------->download is failure,url is:"+url); |
|||
DateUtil.sleep(5000); |
|||
i++; |
|||
}else{ |
|||
break; |
|||
} |
|||
if(i > 5){ |
|||
break; |
|||
} |
|||
html = doPost(url,params); |
|||
} |
|||
return html; |
|||
} |
|||
/** |
|||
* 绕过验证 |
|||
* |
|||
* @return |
|||
* @throws NoSuchAlgorithmException |
|||
* @throws KeyManagementException |
|||
*/ |
|||
public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException { |
|||
SSLContext sc = SSLContext.getInstance("SSLv3"); |
|||
|
|||
// 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法 |
|||
X509TrustManager trustManager = new X509TrustManager() { |
|||
@Override |
|||
public void checkClientTrusted( |
|||
java.security.cert.X509Certificate[] paramArrayOfX509Certificate, |
|||
String paramString) throws CertificateException { |
|||
} |
|||
|
|||
@Override |
|||
public void checkServerTrusted( |
|||
java.security.cert.X509Certificate[] paramArrayOfX509Certificate, |
|||
String paramString) throws CertificateException { |
|||
} |
|||
|
|||
@Override |
|||
public java.security.cert.X509Certificate[] getAcceptedIssuers() { |
|||
return null; |
|||
} |
|||
}; |
|||
|
|||
sc.init(null, new TrustManager[] { trustManager }, null); |
|||
return sc; |
|||
} |
|||
/** |
|||
* 模拟请求 |
|||
* |
|||
* @param url 资源地址 |
|||
* @param map 参数列表 |
|||
* @param encoding 编码 |
|||
* @return |
|||
* @throws NoSuchAlgorithmException |
|||
* @throws KeyManagementException |
|||
* @throws IOException |
|||
* @throws ClientProtocolException |
|||
*/ |
|||
public static String httpsslGet(String url,Map<String, Object> ... headers) { |
|||
String html=""; |
|||
CloseableHttpClient client = null; |
|||
HttpEntity responseEntity = null; |
|||
CloseableHttpResponse response = null; |
|||
try { |
|||
log.debug("DownLoadUtil------------->设置下载相关信息, start...."); |
|||
//采用绕过验证的方式处理https请求 |
|||
SSLContext sslcontext = createIgnoreVerifySSL(); |
|||
|
|||
// 设置协议http和https对应的处理socket链接工厂的对象 |
|||
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() |
|||
.register("http", PlainConnectionSocketFactory.INSTANCE) |
|||
.register("https", new SSLConnectionSocketFactory(sslcontext)) |
|||
.build(); |
|||
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); |
|||
connManager.setMaxTotal(50); |
|||
connManager.setDefaultMaxPerRoute(10); |
|||
HttpClients.custom().setConnectionManager(connManager); |
|||
//设置超时时间 |
|||
int timeout = 30; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(10000) |
|||
.setTcpNoDelay(true).build(); |
|||
// 设置重定向策略 |
|||
LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy(); |
|||
//创建自定义的httpclient对象 |
|||
client = HttpClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(config).setRedirectStrategy(redirectStrategy).setDefaultSocketConfig(socketConfig).setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36").build(); |
|||
// CloseableHttpClient client = HttpClients.createDefault(); |
|||
|
|||
HttpGet httpGet = new HttpGet(url); |
|||
if(headers != null && headers.length > 0){ |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpGet.setHeader(key,tempHeaders.get(key).toString()); |
|||
} |
|||
}else{ |
|||
httpGet.setHeader("Accept", "application/json, text/javascript, */*; q=0.01"); |
|||
httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8"); |
|||
httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"); |
|||
} |
|||
log.debug("DownLoadUtil------------->设置下载相关信息, end...."); |
|||
try { |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
log.debug("DownLoadUtil------------->下载执行,start...."); |
|||
httpGet.setConfig(config); |
|||
response = client.execute(httpGet); |
|||
log.debug("DownLoadUtil------------->下载执行,end...."); |
|||
// 从响应模型中获取响应实体 |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
log.debug("DownLoadUtil------------->响应状态为:" + response.getStatusLine()+",下载请求没问题url:"+url+",read is start ...."); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
responseEntity = response.getEntity(); |
|||
log.debug("DownLoadUtil------------->响应状态为:" + response.getStatusLine()+",下载请求没问题url:"+url+",read is end ...."); |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
if (responseEntity != null) { |
|||
html=EntityUtils.toString(responseEntity,"utf-8"); |
|||
System.out.println("响应内容长度为:" + responseEntity.getContentLength()); |
|||
} |
|||
}else if(statusLine.getStatusCode() == notFundCode){ |
|||
html = "<h2>页面404,正常结束请求即可</h2>"; |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
|
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
}finally{ |
|||
try { |
|||
responseEntity.getContent().close(); |
|||
response.close(); |
|||
client.close(); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
return html; |
|||
} |
|||
|
|||
public static String httpSSLGet(String url,Map<String, Object> ... headers) { |
|||
String html=""; |
|||
html = httpsslGet(url,headers); |
|||
int i = 1; |
|||
while(true){ |
|||
if(html.contains("Download failed error is:")){ |
|||
log.error("DownLoadUtil------------->download is failure,url is:"+url); |
|||
DateUtil.sleep(30000); |
|||
i++; |
|||
}else{ |
|||
break; |
|||
} |
|||
if(i > 5){ |
|||
break; |
|||
} |
|||
html = httpsslGet(url,headers); |
|||
} |
|||
return html; |
|||
} |
|||
public static String doPostFrom(String url,Map<String, Object> param,Map<String, Object> ... headers){ |
|||
//设置超时时间 |
|||
int timeout = 15; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(10000) |
|||
.setTcpNoDelay(true).build(); |
|||
// AuthCache authCache = new BasicAuthCache(); |
|||
// authCache.put(proxy, new BasicScheme()); |
|||
// HttpClientContext localContext = HttpClientContext.create(); |
|||
// localContext.setAuthCache(authCache); |
|||
HttpClientBuilder httpBuilder = HttpClientBuilder.create(); |
|||
httpBuilder.setUserAgent(ua); |
|||
// HttpClient httpClient = httpBuilder.setDefaultSocketConfig(socketConfig).setDefaultRequestConfig(config).setConnectionManager(cm) |
|||
// .setDefaultCredentialsProvider(credsProvider).build(); |
|||
HttpClient httpClient = httpBuilder.setDefaultSocketConfig(socketConfig).setDefaultRequestConfig(config).build(); |
|||
HttpPost httpPost = new HttpPost(url); |
|||
// httpPost.setConfig(reqConfig); |
|||
if(headers != null && headers.length > 0){ |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpPost.setHeader(key,tempHeaders.get(key).toString()); |
|||
} |
|||
}else{ |
|||
httpPost.addHeader("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); |
|||
httpPost.addHeader("accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); |
|||
httpPost.addHeader("content-type", "application/x-www-form-urlencoded"); |
|||
httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"); |
|||
// httpPost.addHeader("Referer", "http://www.neeq.com.cn/rule/Business_rules.html"); |
|||
} |
|||
// 创建请求参数 |
|||
List<NameValuePair> list = new LinkedList<>(); |
|||
for (String key : param.keySet()) { |
|||
BasicNameValuePair param1 = new BasicNameValuePair(key,param.get(key).toString()); |
|||
list.add(param1); |
|||
} |
|||
// 使用URL实体转换工具 |
|||
String html=""; |
|||
try { |
|||
UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(list, "UTF-8"); |
|||
httpPost.setEntity(entityParam); |
|||
HttpResponse response = httpClient.execute(httpPost); |
|||
// HttpResponse response = httpClient.execute(httpPost,localContext); |
|||
// 从响应模型中获取响应实体 |
|||
HttpEntity responseEntity = response.getEntity(); |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
if (responseEntity != null) { |
|||
html=EntityUtils.toString(responseEntity,"utf-8"); |
|||
} |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
|
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
} |
|||
|
|||
return html; |
|||
|
|||
} |
|||
public static String httpPostForm(String url,Map<String,Object> params,Map<String, Object> ... headers) { |
|||
String html=""; |
|||
html = doPostFrom(url,params); |
|||
int i = 1; |
|||
while(true){ |
|||
if(html.contains("Download failed error is:")){ |
|||
log.error("DownLoadUtil------------->download is failure,url is:"+url); |
|||
DateUtil.sleep(5000); |
|||
i++; |
|||
}else{ |
|||
break; |
|||
} |
|||
if(i > 5){ |
|||
break; |
|||
} |
|||
html = doPostFrom(url,params,headers); |
|||
} |
|||
return html; |
|||
} |
|||
|
|||
public static String dosslPost(String url,String params,Map<String, Object> ... headers) { |
|||
String html=""; |
|||
CloseableHttpClient client = null; |
|||
HttpEntity responseEntity = null; |
|||
CloseableHttpResponse response = null; |
|||
try { |
|||
//采用绕过验证的方式处理https请求 |
|||
SSLContext sslcontext = createIgnoreVerifySSL(); |
|||
// 设置协议http和https对应的处理socket链接工厂的对象 |
|||
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() |
|||
.register("http", PlainConnectionSocketFactory.INSTANCE) |
|||
.register("https", new SSLConnectionSocketFactory(sslcontext)) |
|||
.build(); |
|||
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); |
|||
HttpClients.custom().setConnectionManager(connManager); |
|||
//设置超时时间 |
|||
int timeout = 5; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(10000) |
|||
.setTcpNoDelay(true).build(); |
|||
//创建自定义的httpclient对象 |
|||
client = HttpClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(config).setDefaultSocketConfig(socketConfig).build(); |
|||
// CloseableHttpClient client = HttpClients.createDefault(); |
|||
// 2. 创建httppost实例 |
|||
HttpPost httpPost = new HttpPost(url); |
|||
// httpPost.setConfig(reqConfig); |
|||
httpPost.addHeader("Content-Type", "application/json;charset=utf-8"); |
|||
if(headers != null && headers.length > 0){ |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpPost.setHeader(key,tempHeaders.get(key).toString()); |
|||
} |
|||
}else{ |
|||
httpPost.setHeader("Accept", "application/json, text/javascript, */*; q=0.01"); |
|||
httpPost.setHeader("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8"); |
|||
httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"); |
|||
} |
|||
|
|||
try { |
|||
httpPost.setEntity(new StringEntity(params,"utf-8")); |
|||
response = client.execute(httpPost); |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
// 从响应模型中获取响应实体 |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
responseEntity = response.getEntity(); |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
if (responseEntity != null) { |
|||
html=EntityUtils.toString(responseEntity,"utf-8"); |
|||
System.out.println("响应内容长度为:" + responseEntity.getContentLength()); |
|||
} |
|||
}else if(statusLine.getStatusCode() == notFundCode){ |
|||
html = "<h2>页面404,正常结束请求即可</h2>"; |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
|
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
}finally{ |
|||
try { |
|||
responseEntity.getContent().close(); |
|||
response.close(); |
|||
client.close(); |
|||
} catch (UnsupportedOperationException e) { |
|||
e.printStackTrace(); |
|||
} catch (IOException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
return html; |
|||
} |
|||
public static String dosslPostForm(String url,Map<String, Object> param,Map<String, Object> ... headers) { |
|||
String html=""; |
|||
try { |
|||
//采用绕过验证的方式处理https请求 |
|||
SSLContext sslcontext = createIgnoreVerifySSL(); |
|||
|
|||
// 设置协议http和https对应的处理socket链接工厂的对象 |
|||
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() |
|||
.register("http", PlainConnectionSocketFactory.INSTANCE) |
|||
.register("https", new SSLConnectionSocketFactory(sslcontext)) |
|||
.build(); |
|||
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); |
|||
HttpClients.custom().setConnectionManager(connManager); |
|||
//设置超时时间 |
|||
int timeout = 5; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(10000) |
|||
.setTcpNoDelay(true).build(); |
|||
//创建自定义的httpclient对象 |
|||
CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(config).setDefaultSocketConfig(socketConfig).build(); |
|||
// CloseableHttpClient client = HttpClients.createDefault(); |
|||
// 2. 创建httppost实例 |
|||
HttpPost httpPost = new HttpPost(url); |
|||
// httpPost.setConfig(reqConfig); |
|||
if(headers != null && headers.length > 0){ |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpPost.setHeader(key,tempHeaders.get(key).toString()); |
|||
} |
|||
}else{ |
|||
httpPost.setHeader("Accept", "application/json, text/javascript, */*; q=0.01"); |
|||
httpPost.setHeader("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8"); |
|||
httpPost.addHeader("content-type", "application/x-www-form-urlencoded"); |
|||
httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"); |
|||
} |
|||
|
|||
// 创建请求参数 |
|||
List<NameValuePair> list = new LinkedList<>(); |
|||
for (String key : param.keySet()) { |
|||
BasicNameValuePair param1 = new BasicNameValuePair(key,param.get(key).toString()); |
|||
list.add(param1); |
|||
} |
|||
// 使用URL实体转换工具 |
|||
try { |
|||
UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(list, "UTF-8"); |
|||
httpPost.setEntity(entityParam); |
|||
HttpResponse response = client.execute(httpPost); |
|||
// HttpResponse response = httpClient.execute(httpPost,localContext); |
|||
// 从响应模型中获取响应实体 |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
HttpEntity responseEntity = response.getEntity(); |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
if (responseEntity != null) { |
|||
html=EntityUtils.toString(responseEntity,"utf-8"); |
|||
} |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
|
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
} |
|||
|
|||
|
|||
return html; |
|||
} |
|||
public static String httpSSLPostForm(String url,Map<String, Object> params,Map<String, Object> ...headers) { |
|||
String html=""; |
|||
try { |
|||
html = dosslPostForm(url,params,headers); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
// TODO: handle exception |
|||
html = "Download failed error is:Exception!"; |
|||
} |
|||
int i = 1; |
|||
while(true){ |
|||
if(html.contains("Download failed error is:")){ |
|||
log.error("DownLoadUtil------------->download is failure,url is:"+url); |
|||
DateUtil.sleep(30000); |
|||
i++; |
|||
}else{ |
|||
break; |
|||
} |
|||
if(i > 5){ |
|||
break; |
|||
} |
|||
try { |
|||
html = dosslPostForm(url,params,headers); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
// TODO: handle exception |
|||
html = "Download failed error is:Exception!"; |
|||
} |
|||
} |
|||
return html; |
|||
} |
|||
public static String httpSSLPost(String url,String params,Map<String, Object> ...headers) { |
|||
String html=""; |
|||
try { |
|||
html = dosslPost(url,params,headers); |
|||
} catch (Throwable e) { |
|||
e.printStackTrace(); |
|||
// TODO: handle exception |
|||
html = "Download failed error is:Exception!"; |
|||
} |
|||
int i = 1; |
|||
while(true){ |
|||
if(html.contains("Download failed error is:")){ |
|||
log.error("DownLoadUtil------------->download is failure,url is:"+url); |
|||
DateUtil.sleep(30000); |
|||
i++; |
|||
}else{ |
|||
break; |
|||
} |
|||
if(i > 5){ |
|||
break; |
|||
} |
|||
try { |
|||
html = dosslPost(url,params,headers); |
|||
} catch (Throwable e) { |
|||
e.printStackTrace(); |
|||
// TODO: handle exception |
|||
html = "Download failed error is:Exception!"; |
|||
} |
|||
} |
|||
return html; |
|||
} |
|||
|
|||
/** |
|||
* 模拟客户端get请求 |
|||
* @param url 模拟请求得url |
|||
* @param headers 头部信息,没有可以不传 |
|||
* @return |
|||
*/ |
|||
public static String doGet(String url,Map<String, Object> ... headers){ |
|||
//设置超时时间 |
|||
int timeout = 15; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(10000) |
|||
.setTcpNoDelay(true).build(); |
|||
HttpClientBuilder httpBuilder = HttpClientBuilder.create(); |
|||
httpBuilder.setUserAgent(ua); |
|||
HttpClient httpClient = httpBuilder.setDefaultSocketConfig(socketConfig).setDefaultRequestConfig(config).build(); |
|||
HttpGet httpGet = new HttpGet(url); |
|||
if(headers != null && headers.length > 0){ |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpGet.setHeader(key,tempHeaders.get(key).toString()); |
|||
} |
|||
}else{ |
|||
httpGet.setHeader("Accept", "application/json, text/javascript, */*; q=0.01"); |
|||
httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8"); |
|||
} |
|||
String html=""; |
|||
try { |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
HttpResponse response = httpClient.execute(httpGet); |
|||
// 从响应模型中获取响应实体 |
|||
HttpEntity responseEntity = response.getEntity(); |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
if (responseEntity != null) { |
|||
html=EntityUtils.toString(responseEntity,"utf-8"); |
|||
if(html.equals("")){ |
|||
html = "Download failed error is:reslut is null"; |
|||
} |
|||
} |
|||
}else if(statusLine.getStatusCode() == notFundCode){ |
|||
html = "<h2>页面404,正常结束请求即可</h2>"; |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
} |
|||
return html; |
|||
|
|||
} |
|||
public static void main(String[] args) throws Exception { |
|||
|
|||
} |
|||
} |
@ -1,27 +0,0 @@ |
|||
package com.bfd.qanda.utils; |
|||
|
|||
import java.security.MessageDigest; |
|||
import java.security.NoSuchAlgorithmException; |
|||
|
|||
/** |
|||
* @author jian.mao |
|||
* @date 2023年3月10日 |
|||
* @description |
|||
*/ |
|||
public class EncryptionUtil { |
|||
public static String md5(String text) { |
|||
try { |
|||
MessageDigest md = MessageDigest.getInstance("MD5"); |
|||
md.update(text.getBytes()); |
|||
byte[] bytes = md.digest(); |
|||
StringBuilder sb = new StringBuilder(); |
|||
for (byte b : bytes) { |
|||
sb.append(String.format("%02x", b & 0xff)); |
|||
} |
|||
return sb.toString(); |
|||
} catch (NoSuchAlgorithmException e) { |
|||
e.printStackTrace(); |
|||
return null; |
|||
} |
|||
} |
|||
} |
@ -1,36 +0,0 @@ |
|||
package com.bfd.qanda.utils; |
|||
|
|||
import java.io.FileWriter; |
|||
import java.io.IOException; |
|||
import java.util.ArrayList; |
|||
import java.util.HashMap; |
|||
import java.util.HashSet; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
import java.util.Set; |
|||
|
|||
/** |
|||
* 文件工具类 |
|||
* @author jian.mao |
|||
* @date 2023年7月14日 |
|||
* @description |
|||
*/ |
|||
public class FileUtil { |
|||
|
|||
/** |
|||
* 数据写入文件 |
|||
* @param Path 文件路径 |
|||
* @param result 数据 |
|||
* @throws IOException |
|||
*/ |
|||
public static void writeFile(String path,String result){ |
|||
try { |
|||
FileWriter fw = new FileWriter(path,true); |
|||
fw.write(result+"\n"); |
|||
fw.flush(); |
|||
fw.close(); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
} |
@ -1,53 +0,0 @@ |
|||
package com.bfd.qanda.utils; |
|||
import com.alibaba.fastjson.JSON; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.alibaba.fastjson.JSONException; |
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
import java.util.regex.Matcher; |
|||
import java.util.regex.Pattern; |
|||
|
|||
/** |
|||
* @author:jinming |
|||
* @className:GPTResultParseUtil |
|||
* @version:1.0 |
|||
* @description: |
|||
* @Date:2024/6/28 10:11 |
|||
*/ |
|||
public class GPTResultParseUtil { |
|||
public static Map<String, Object> parseGPTResult(Map<String, Object> output, String gptContent) { |
|||
Map<String, Object> jsonResult = new HashMap<>(); |
|||
try { |
|||
// 替换```json, ``` 和 \n |
|||
String jsonContent = gptContent.replace("```json", "").replace("```", "").replace("\n", ""); |
|||
JSONObject jsonGPT = JSON.parseObject(jsonContent); |
|||
|
|||
for (String key : output.keySet()) { |
|||
if (jsonGPT.containsKey(key)) { |
|||
jsonResult.put(key, jsonGPT.get(key)); |
|||
} |
|||
} |
|||
return jsonResult; |
|||
} catch (JSONException e) { |
|||
try { |
|||
// 直接解析失败,使用正则表达式匹配外层的 {} |
|||
Pattern pattern = Pattern.compile("\\{.*\\}", Pattern.DOTALL); |
|||
Matcher matcher = pattern.matcher(gptContent.replace("\n", "")); |
|||
if (matcher.find()) { |
|||
JSONObject jsonGPT = JSON.parseObject(matcher.group()); |
|||
for (String key : output.keySet()) { |
|||
if (jsonGPT.containsKey(key)) { |
|||
jsonResult.put(key, jsonGPT.get(key)); |
|||
} |
|||
} |
|||
return jsonResult; |
|||
} else { |
|||
return null; |
|||
} |
|||
} catch (Exception ex) { |
|||
ex.printStackTrace(); |
|||
return null; |
|||
} |
|||
} |
|||
} |
|||
} |
@ -1,32 +0,0 @@ |
|||
package com.bfd.qanda.utils; |
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.bfd.qanda.entity.Constants; |
|||
|
|||
/** |
|||
* json工具 |
|||
* @author jian.mao |
|||
* @date 2023年7月10日 |
|||
* @description |
|||
*/ |
|||
public class JsonUtil { |
|||
|
|||
/** |
|||
* 校验字符串是list/map/str |
|||
* @param jsonString |
|||
* @return |
|||
*/ |
|||
public static String checkJsonType(String jsonString) { |
|||
try { |
|||
JSONObject.parseObject(jsonString); |
|||
return Constants.MAP_TYPE; |
|||
} catch (Exception e) { |
|||
try { |
|||
JSONObject.parseArray(jsonString); |
|||
return Constants.LIST_TYPE; |
|||
} catch (Exception ex) { |
|||
return Constants.STRING_TYPE; |
|||
} |
|||
} |
|||
} |
|||
} |
@ -1,33 +0,0 @@ |
|||
package com.bfd.qanda.utils; |
|||
|
|||
import java.security.MessageDigest; |
|||
|
|||
/** |
|||
* 其他工具类 |
|||
* @author jian.mao |
|||
* @date 2023年9月19日 |
|||
* @description |
|||
*/ |
|||
public class OtherUtils { |
|||
|
|||
|
|||
|
|||
public static String getMd5(String string) { |
|||
try { |
|||
MessageDigest md5 = MessageDigest.getInstance("MD5"); |
|||
byte[] bs = md5.digest(string.getBytes("UTF-8")); |
|||
StringBuilder sb = new StringBuilder(40); |
|||
for (byte x : bs) { |
|||
if ((x & 0xff) >> 4 == 0) { |
|||
sb.append("0").append(Integer.toHexString(x & 0xff)); |
|||
} else { |
|||
sb.append(Integer.toHexString(x & 0xff)); |
|||
} |
|||
} |
|||
return sb.toString(); |
|||
} catch (Exception e) { |
|||
|
|||
return "nceaform" + System.currentTimeMillis(); |
|||
} |
|||
} |
|||
} |
@ -1,18 +0,0 @@ |
|||
package com.bfd.qanda.utils; |
|||
|
|||
import java.util.Map; |
|||
import java.util.concurrent.LinkedBlockingDeque; |
|||
|
|||
/** |
|||
* @author:jinming |
|||
* @className:QueueUtil |
|||
* @version:1.0 |
|||
* @description: |
|||
* @Date:2023/7/13 15:00 |
|||
*/ |
|||
public class QueueUtil { |
|||
|
|||
public static LinkedBlockingDeque<Map<String, Object>> taskQueue = new LinkedBlockingDeque<Map<String, Object>>(); |
|||
|
|||
public static LinkedBlockingDeque<String> sendQueue = new LinkedBlockingDeque<String>(); |
|||
} |
@ -1,46 +0,0 @@ |
|||
package com.bfd.qanda.utils; |
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.kafka.core.KafkaTemplate; |
|||
import org.springframework.kafka.support.SendResult; |
|||
import org.springframework.stereotype.Component; |
|||
import org.springframework.util.concurrent.ListenableFuture; |
|||
import org.springframework.util.concurrent.ListenableFutureCallback; |
|||
|
|||
/** |
|||
* @PROJECT_NAME: companybusinesscrawl |
|||
* @DESCRIPTION:SpringBootKafka 工具类 |
|||
* @AUTHOR: ying.zhao |
|||
* @DATE: 2023/4/6 11:09 |
|||
*/ |
|||
@Slf4j |
|||
@Component |
|||
public class SpringBootKafka { |
|||
@Autowired |
|||
private KafkaTemplate<String, Object> kafkaTemplate; |
|||
/** |
|||
* 自定义topicKafkaTemplate |
|||
*/ |
|||
/** |
|||
* public static final String TOPIC = "companyBussTest"; |
|||
**/ |
|||
public void send(String topic, String message) { |
|||
//发送消息 |
|||
ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(topic, message); |
|||
future.addCallback(new ListenableFutureCallback<SendResult<String, Object>>() { |
|||
@Override |
|||
public void onFailure(Throwable throwable) { |
|||
//发送失败的处理 |
|||
log.info(topic + " - 生产者 发送消息失败:" + throwable.getMessage()); |
|||
} |
|||
|
|||
@Override |
|||
public void onSuccess(SendResult<String, Object> stringObjectSendResult) { |
|||
//成功的处理 |
|||
log.info(topic + " - 生产者 发送消息成功" ); |
|||
} |
|||
}); |
|||
} |
|||
} |
@ -1,23 +0,0 @@ |
|||
package com.bfd.qanda.utils; |
|||
|
|||
import java.io.PrintWriter; |
|||
import java.io.StringWriter; |
|||
|
|||
/** |
|||
* @author jian.mao |
|||
* @date 2023年3月22日 |
|||
* @description |
|||
*/ |
|||
public class ThrowMessageUtil { |
|||
|
|||
/** |
|||
* 获取异常信息 |
|||
* @param t |
|||
* @return |
|||
*/ |
|||
public static String getErrmessage(Throwable t){ |
|||
StringWriter stringWriter=new StringWriter(); |
|||
t.printStackTrace(new PrintWriter(stringWriter,true)); |
|||
return stringWriter.getBuffer().toString(); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue