当前位置:   article > 正文

易盾逆向分析(滑块、点选、无感知)_易盾滑块

易盾滑块

易盾破解过两个版本,2.19.1和2.21.3,都是之前整过的,现在升级了,由于工作也不需要,就没有再整过了。2.19.1版本,无感知、滑块、点选都整了一遍,写成公共提供调用。

先看下JAVA代码

  1. package com.xxxx.cccc.web;
  2. import lombok.extern.log4j.Log4j;
  3. import lombok.extern.log4j.Log4j2;
  4. import java.io.IOException;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import java.util.UUID;
  8. import org.apache.http.HttpException;
  9. import org.jsoup.helper.StringUtil;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.util.StringUtils;
  12. import org.springframework.web.bind.annotation.RequestBody;
  13. import org.springframework.web.bind.annotation.RequestMapping;
  14. import org.springframework.web.bind.annotation.RequestMethod;
  15. import org.springframework.web.bind.annotation.RestController;
  16. import com.xxxx.cccc.model.CommonRequest;
  17. import com.xxxx.cccc.model.ResultModel;
  18. import com.xxxx.cccc.service.ProxyService;
  19. import com.xxxx.cccc.util.ExceptionUtil;
  20. import com.xxxx.cccc.util.YidunCheckRpcUtil;
  21. import com.xxxx.cccc.util.YidunCheckUtil;
  22. import com.xxxx.cccc.util.YidunCheckUtil2;
  23. import com.xxxx.cccc.util.YidunCheckUtil_2_19_1;
  24. import com.xxxx.cccc.util.YidunCheckUtil_2_21_3;
  25. //公共服务
  26. @RestController
  27. @RequestMapping("/common")
  28. @Log4j
  29. public class CommonController {
  30. @Autowired
  31. ProxyService proxyService;
  32. /**
  33. * 易盾-获取滑块验证后的数据-点选
  34. *
  35. * @param papercheckRequest
  36. * @return
  37. */
  38. @RequestMapping(value ="/yidun/getCheckData" , method = RequestMethod.POST)
  39. public ResultModel getCheckData(@RequestBody CommonRequest commonRequest){
  40. ResultModel resultModel = null;
  41. try {
  42. log.info("易盾-获取滑块验证后的数据-点选,请求入参:"+commonRequest);
  43. if(!commonRequest.checkParam()){
  44. return new ResultModel("-1","输入参数不完整");
  45. }
  46. int len = 1;//循环次数
  47. for(int i=0;i<len;i++){
  48. log.info("yidun getCheckData 次数:"+i);
  49. try {
  50. resultModel = YidunCheckUtil_2_21_3.getCheckData(null,null);
  51. if(resultModel != null && "0".equals(resultModel.getCode())){
  52. return resultModel;
  53. }
  54. } catch (Exception e) {
  55. log.error("error:"+e);
  56. log.error(ExceptionUtil.getMessage(e));
  57. if(i == 2){
  58. return new ResultModel("-1","未知错误");
  59. }
  60. }
  61. }
  62. return resultModel;
  63. } catch (Exception e) {
  64. log.error(ExceptionUtil.getMessage(e));
  65. return new ResultModel("-1","未知错误");
  66. }
  67. }
  68. /**
  69. * 易盾-获取滑块验证后的数据-无感知
  70. *
  71. * @param papercheckRequest
  72. * @return
  73. */
  74. @RequestMapping(value ="/yidun/getWgzData" , method = RequestMethod.POST)
  75. public ResultModel getWgzData(@RequestBody CommonRequest commonRequest){
  76. ResultModel resultModel = null;
  77. try {
  78. log.info("易盾-获取滑块验证后的数据-无感知,请求入参:"+commonRequest);
  79. if(!commonRequest.checkParam()){
  80. return new ResultModel("-1","输入参数不完整");
  81. }
  82. int len = 1;//循环次数
  83. for(int i=0;i<len;i++){
  84. log.info("yidun getWgzData 次数:"+i);
  85. try {
  86. resultModel = YidunCheckUtil.getWgzData(proxyService);
  87. if(resultModel != null && "0".equals(resultModel.getCode())){
  88. return resultModel;
  89. }
  90. } catch (Exception e) {
  91. log.error(ExceptionUtil.getMessage(e));
  92. if(i == 2){
  93. return new ResultModel("-1","未知错误");
  94. }
  95. }
  96. }
  97. return resultModel;
  98. } catch (Exception e) {
  99. log.error(ExceptionUtil.getMessage(e));
  100. return new ResultModel("-1","未知错误");
  101. }
  102. }
  103. /**
  104. * 易盾-获取滑块验证后的数据-滑块
  105. *
  106. * @param papercheckRequest
  107. * @return
  108. */
  109. @RequestMapping(value ="/yidun/getHuaKuaiData" , method = RequestMethod.POST)
  110. public ResultModel getHuaKuaiData(@RequestBody CommonRequest commonRequest){
  111. ResultModel resultModel = null;
  112. try {
  113. log.info("易盾-获取滑块验证后的数据-滑块,请求入参:"+commonRequest);
  114. if(!commonRequest.checkParam()){
  115. return new ResultModel("-1","输入参数不完整");
  116. }
  117. int len = 1;//循环次数
  118. for(int i=0;i<len;i++){
  119. log.info("yidun getHuaKuaiData 次数:"+i);
  120. try {
  121. resultModel = YidunCheckUtil.getHuaKuaiData(proxyService);
  122. if(resultModel != null && "0".equals(resultModel.getCode())){
  123. return resultModel;
  124. }
  125. } catch (Exception e) {
  126. log.error(ExceptionUtil.getMessage(e));
  127. if(i == 2){
  128. return new ResultModel("-1","未知错误");
  129. }
  130. }
  131. }
  132. return resultModel;
  133. } catch (Exception e) {
  134. log.error(ExceptionUtil.getMessage(e));
  135. return new ResultModel("-1","未知错误");
  136. }
  137. }
  138. }
  1. import java.io.FileOutputStream;
  2. import java.net.URLDecoder;
  3. import java.net.URLEncoder;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.UUID;
  9. import org.apache.commons.io.IOUtils;
  10. import org.apache.http.Header;
  11. import org.apache.http.HttpEntity;
  12. import org.apache.http.client.methods.CloseableHttpResponse;
  13. import org.apache.http.client.methods.HttpGet;
  14. import org.apache.http.impl.client.CloseableHttpClient;
  15. import org.apache.http.util.EntityUtils;
  16. import org.eclipse.jetty.util.StringUtil;
  17. import org.springframework.util.StringUtils;
  18. import com.alibaba.fastjson.JSONObject;
  19. import com.baidu.aip.util.Base64Util;
  20. import lombok.extern.log4j.Log4j;
  21. /**
  22. * version 2.17.4
  23. * 易盾-获取滑块验证后的数据
  24. * 1.获取图片的fp指纹参数存在浏览器环境校验,校验不过也会正常返回图片,但是会降低通过率,不到10%
  25. */
  26. @Log4j
  27. public class YidunCheckUtil {
  28. public static String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36";
  29. public static String ipAddress = JsFrontConstants.nodejsUrl;
  30. public static String fpUrl = ipAddress+"/yidun/yzm/fp";
  31. public static String cbUrl = ipAddress+"/yidun/yzm/cb";
  32. public static String callbackUrl = ipAddress+"/yidun/yzm/callback";
  33. public static String getAcTokenUrl = ipAddress+"/yidun/yzm/getAcToken";
  34. public static String getMUrl = ipAddress+"/yidun/yzm/getM";
  35. public static String getPUrl = ipAddress+"/yidun/yzm/getP";
  36. public static String getExtUrl = ipAddress+"/yidun/yzm/getExt";
  37. public static String getDataUrl = ipAddress+"/yidun/yzm/getData";
  38. public static String getDataForWgzUrl = ipAddress+"/yidun/yzm/getDataForWgz";
  39. public static String getTraceUrl = ipAddress+"/yidun/yzm/getTrace";
  40. public static String getTraceForWgzUrl = ipAddress+"/yidun/yzm/getTraceForWgz";
  41. public static String getCn31StrUrl = ipAddress+"/yidun/yzm/getCn31Str";
  42. public static String getDataForHuaKuaiUrl = ipAddress+"/yidun/yzm/getDataForHuakuai";
  43. public static String getTraceForHuakuaiUrl = ipAddress+"/yidun/yzm/getTraceForHuakuai?zuobiao=";
  44. public static IOcr iOcr = new MachineOcr();
  45. /**
  46. * 获取滑块验证后的数据-点选
  47. * @author xxx
  48. * @param
  49. * @return
  50. */
  51. public static ResultModel getCheckData(ProxyService proxyService,List<String> proxyList) throws Exception{
  52. ResultModel resultModel = new ResultModel("0","处理成功");
  53. HttpClientWrapper hw = null;
  54. HttpGet httpGet = null;
  55. CloseableHttpResponse execute = null;
  56. Header[] headers = null;
  57. HttpEntity entity = null;
  58. byte[] bytes = null;
  59. String result = null;
  60. //hw = new HttpClientWrapper(5000,5000, 5000);
  61. if(proxyService == null){
  62. //hw = new HttpClientWrapper(5000,5000, 5000);
  63. }else{
  64. log.info("YidunCheckUtil linshi shiong daili...");
  65. //hw = proxyService.getClientWithProxy(15000,15000,15000,proxyList);
  66. }
  67. hw = new HttpClientWrapper(50000,50000, 50000,"127.0.0.1",8888);
  68. CloseableHttpClient client = hw.getClient();
  69. //1.获取滑块图片地址
  70. String fp = JiangsuTaxbureauUtil.getData(fpUrl);
  71. //fp = "R/9JR4ti/ydmwA6UEJ41QqUdudp/aeDHkOl44riYGdbc56uundMeNHaleXSyME7P0qAzlLc8IARE+pTmovebBp4hW2lPDq\\\\6olZp0QQx9kzO0wdzYD9214KL\\\\Dc+/KYtCSSvS0eMBqzZiAYONRBq0i09nxtXDf\\\\mDdh2U/ReM3ZZZKt+:1655391775324";
  72. //fp = URLEncoder.encode(fp);
  73. String cb = JiangsuTaxbureauUtil.getData(cbUrl);
  74. String callback = JiangsuTaxbureauUtil.getData(callbackUrl);
  75. String url = "https://c.dun.163.com/api/v2/get?referer=https%3A%2F%2Fetax.jiangsu.chinatax.gov.cn%2Fsso%2Flogin&zoneId=CN31&id=1a623022803d4cbc86fa157ec267bb36&fp="+fp+"&https=true&type=undefined&version=2.17.4&dpr=1&dev=1&cb="+cb+"&ipv6=false&runEnv=10&group=&scene=&lang=zh-CN&width=0&audio=false&token=&callback="+callback;
  76. httpGet = new HttpGet(url);
  77. httpGet.setHeader("Host","c.dun.163.com");
  78. httpGet.setHeader("Referer","https://etax.jiangsu.chinatax.gov.cn/");
  79. httpGet.setHeader("User-Agent",userAgent);
  80. httpGet.setHeader("Accept","*/*");
  81. httpGet.setHeader("Accept-Encoding","gzip, deflate, br");
  82. httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9");
  83. httpGet.setHeader("Cache-Control","no-cache");
  84. httpGet.setHeader("Connection","keep-alive");
  85. httpGet.setHeader("Pragma","no-cache");
  86. httpGet.setHeader("sec-ch-ua","\"Chromium\";v=\"92\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"92\"");
  87. httpGet.setHeader("sec-ch-ua-mobile","?0");
  88. httpGet.setHeader("Sec-Fetch-Dest","script");
  89. httpGet.setHeader("Sec-Fetch-Mode","no-cors");
  90. httpGet.setHeader("Sec-Fetch-Site","cross-site");
  91. httpGet.setConfig(hw.getRequestConfig());
  92. execute = client.execute(httpGet);
  93. entity = execute.getEntity();
  94. bytes = EntityUtils.toByteArray(entity);
  95. result = new String(bytes,"UTF-8");
  96. if(StringUtils.isEmpty(result)){
  97. return new ResultModel("-1","获取滑块失败");
  98. }
  99. result = result.substring(result.indexOf("(")+1,result.indexOf(")"));
  100. log.info("YidunCheckUtil getCheckData getYzm result:"+result);
  101. JSONObject objJSon = JSONObject.parseObject(result);
  102. JSONObject dataJSon = objJSon.getJSONObject("data");
  103. String bg = (String)dataJSon.getJSONArray("bg").get(0);//滑块图片
  104. String front = dataJSon.getString("front");//点选文本
  105. String token = dataJSon.getString("token");
  106. String type = dataJSon.getString("type");
  107. String zoneId = dataJSon.getString("zoneId");
  108. log.info("YidunCheckUtil getCheckData bg:"+bg);
  109. log.info("YidunCheckUtil getCheckData front:"+front);
  110. log.info("YidunCheckUtil getCheckData token:"+token);
  111. if(StringUtils.isEmpty(front)){
  112. return new ResultModel("-1","获取滑块失败");
  113. }
  114. //2.获取图片数据
  115. httpGet = new HttpGet(bg);
  116. httpGet.setConfig(hw.getRequestConfig());
  117. execute = client.execute(httpGet);
  118. entity = execute.getEntity();
  119. bytes = EntityUtils.toByteArray(entity);
  120. String zuobiao = "";
  121. String guiji = "";
  122. String baseImage = Base64Util.encode(bytes);
  123. if(StringUtils.isEmpty(baseImage)){
  124. return new ResultModel("-1","获取滑块图片失败");
  125. }
  126. //3.识别图片
  127. String orcData = iOcr.getCodeNormal(baseImage, front);
  128. if(StringUtil.isBlank(orcData) || orcData.indexOf("500 Internal Server") >= 0) {
  129. return new ResultModel("-1","识别滑块失败");
  130. }
  131. JSONObject ocrJson = JSONObject.parseObject(orcData);
  132. zuobiao = ocrJson.getString("points");
  133. guiji = ocrJson.getString("track");
  134. log.info("YidunCheckUtil getCheckData zuobiao:"+zuobiao);
  135. log.info("YidunCheckUtil getCheckData guiji:"+guiji);
  136. //
  137. //调用自己的轨迹算法 测试发现自己的轨迹算法通过率高些
  138. guiji = JiangsuTaxbureauUtil.getData(getTraceUrl+"?urlKey="+zuobiao);
  139. //System.out.println("my guiji:"+guiji);
  140. if(StringUtils.isEmpty(zuobiao) || StringUtils.isEmpty(guiji)){
  141. return new ResultModel("-1","识别滑块失败");
  142. }
  143. url = "https://c.dun.163.com/api/v2/check?referer=https%3A%2F%2Fetax.jiangsu.chinatax.gov.cn%2Fsso%2Flogin&zoneId=CN31&id=1a623022803d4cbc86fa157ec267bb36&width=310&type=3&version=2.17.4&extraData=&bf=0&runEnv=10";
  144. httpGet = new HttpGet(url);
  145. Thread.sleep(100);//故意让程序慢些,避免反爬
  146. //5.校验滑块
  147. url = url +"&token="+token;
  148. url = url +"&callback="+JiangsuTaxbureauUtil.getData(callbackUrl);
  149. url = url +"&acToken="+JiangsuTaxbureauUtil.getData(getAcTokenUrl);
  150. url = url +"&cb="+JiangsuTaxbureauUtil.getData(cbUrl);
  151. String data = JiangsuTaxbureauUtil.getData(getDataUrl+"?guiji="+guiji+"&token="+token+"&zuobiao="+zuobiao);
  152. url = url +"&data="+data;
  153. log.info("YidunCheckUtil getCheckData url:"+url);
  154. httpGet = new HttpGet(url);
  155. httpGet.setHeader("Accept","*/*");
  156. httpGet.setHeader("Accept-Encoding","gzip, deflate, br");
  157. httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9");
  158. httpGet.setHeader("Cache-Control","no-cache");
  159. httpGet.setHeader("Connection","keep-alive");
  160. httpGet.setHeader("Pragma","no-cache");
  161. httpGet.setHeader("Referer","https://etax.jiangsu.chinatax.gov.cn/");
  162. httpGet.setHeader("sec-ch-ua","\"Chromium\";v=\"92\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"92\"");
  163. httpGet.setHeader("sec-ch-ua-mobile","?0");
  164. httpGet.setHeader("Sec-Fetch-Dest","script");
  165. httpGet.setHeader("Sec-Fetch-Mode","no-cors");
  166. httpGet.setHeader("Sec-Fetch-Site","cross-site");
  167. httpGet.setHeader("Host","c.dun.163.com");
  168. httpGet.setHeader("User-Agent",userAgent);
  169. httpGet.setConfig(hw.getRequestConfig());
  170. execute = client.execute(httpGet);
  171. entity = execute.getEntity();
  172. bytes = EntityUtils.toByteArray(entity);
  173. result = new String(bytes,"UTF-8");
  174. log.info("YidunCheckUtil getCheckData validate result:"+result);
  175. if(StringUtils.isEmpty(result)){
  176. return new ResultModel("-1","校验点选返回为空");
  177. }
  178. result = result.substring(result.indexOf("(")+1, result.indexOf(")"));
  179. JSONObject objJson = JSONObject.parseObject(result);
  180. JSONObject dataJson = objJson.getJSONObject("data");
  181. String validate = dataJson.getString("validate");
  182. if(StringUtils.isEmpty(validate)){
  183. return new ResultModel("-1","校验点选失败");
  184. }
  185. //3.获取CN31加密串
  186. Map map = new HashMap();
  187. map.put("validate", validate);
  188. map.put("fp", URLDecoder.decode(fp));
  189. ResponseContent response = HttpHelper.postJsonEntity(getCn31StrUrl, JSONObject.toJSONString(map));
  190. String cn31Str = response.getContent();
  191. log.info("YidunCheckUtil getCheckData cn31Str:"+cn31Str);
  192. resultModel.setData(cn31Str);
  193. if(StringUtils.isEmpty(cn31Str)){
  194. return new ResultModel("-1","获取CN31失败");
  195. }
  196. return resultModel;
  197. }
  198. /**
  199. * 获取滑块验证后的数据-无感知
  200. * @author bree
  201. * @param
  202. * @return
  203. */
  204. public static ResultModel getWgzData(ProxyService proxyService) throws Exception{
  205. ResultModel resultModel = new ResultModel("0","处理成功");
  206. Map dataMap = new HashMap();
  207. HttpClientWrapper hw = null;
  208. HttpGet httpGet = null;
  209. CloseableHttpResponse execute = null;
  210. Header[] headers = null;
  211. HttpEntity entity = null;
  212. byte[] bytes = null;
  213. String res = null;
  214. String result = null;
  215. hw = new HttpClientWrapper(5000,5000, 5000);
  216. CloseableHttpClient client = hw.getClient();
  217. //1.获取验证码
  218. String url = "https://c.dun.163.com/api/v2/get?referer=%s&zoneId=CN31&id=cf15aac06ccf490181f29b72fe13c3d4&fp=%s&https=true&type=undefined&width=0&version=2.16.0&dpr=1.25&dev=1&cb=%s&ipv6=false&runEnv=10&group=&scene=&callback=%s";
  219. String fp = JiangsuTaxbureauUtil.getData(fpUrl);
  220. String cb = JiangsuTaxbureauUtil.getData(cbUrl);
  221. String callback = JiangsuTaxbureauUtil.getData(callbackUrl);
  222. String referer = "https%3A%2F%2Fetax.hunan.chinatax.gov.cn%2Fwsbs%2FtoLogin.do";
  223. url = String.format(url, referer,fp,cb,callback);
  224. httpGet = new HttpGet(url);
  225. httpGet.setHeader("Host","c.dun.163.com");
  226. httpGet.setHeader("Referer","https://etax.hunan.chinatax.gov.cn/");
  227. httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36");
  228. httpGet.setHeader("Accept","*/*");
  229. httpGet.setHeader("Accept-Encoding","gzip, deflate, br");
  230. httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9");
  231. httpGet.setHeader("sec-ch-ua","\"Chromium\";v=\"92\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"92\"");
  232. httpGet.setHeader("sec-ch-ua-mobile","?0");
  233. httpGet.setHeader("Sec-Fetch-Dest","*/*");
  234. httpGet.setHeader("Sec-Fetch-Mode","no-cors");
  235. httpGet.setHeader("Sec-Fetch-Site","cross-site");
  236. httpGet.setConfig(hw.getRequestConfig());
  237. execute = client.execute(httpGet);
  238. entity = execute.getEntity();
  239. bytes = EntityUtils.toByteArray(entity);
  240. result = new String(bytes,"UTF-8");
  241. log.info("yidun wuganzhi get yzm code:"+result);
  242. if(StringUtils.isEmpty(result)){
  243. return new ResultModel("-1","获取滑块失败");
  244. }
  245. result = result.substring(result.indexOf("(")+1,result.indexOf(")"));
  246. JSONObject objJSon = JSONObject.parseObject(result);
  247. JSONObject dataJSon = objJSon.getJSONObject("data");
  248. String error = objJSon.getString("error");
  249. String message = objJSon.getString("msg");
  250. String token = dataJSon.getString("token");
  251. if(!"0".equals(error)){
  252. return new ResultModel("-1",message);
  253. }
  254. Thread.sleep(1000);
  255. //2.校验
  256. url = "https://c.dun.163.com/api/v2/check?referer=%s&zoneId=CN31&id=cf15aac06ccf490181f29b72fe13c3d4&version=2.16.0&cb=%s&extraData=&bf=0&runEnv=10&token=%s&acToken=%s&type=5&width=438&data=%s&callback=%s";
  257. cb = JiangsuTaxbureauUtil.getData(cbUrl);
  258. callback = JiangsuTaxbureauUtil.getData(callbackUrl);
  259. String acToken = JiangsuTaxbureauUtil.getData(getAcTokenUrl);
  260. /* List<String> list = new TraceUtil().getPAndTrace();
  261. String zuobiao = list.get(0);
  262. String guiji = list.get(1);*/
  263. String str = JiangsuTaxbureauUtil.getData(getTraceForWgzUrl);
  264. JSONObject traceJson = JSONObject.parseObject(str);
  265. String zuobiao = traceJson.getString("zuobiao");
  266. String guiji = traceJson.getString("guiji");;
  267. String data = JiangsuTaxbureauUtil.getData(getDataForWgzUrl+"?guiji="+guiji+"&token="+token+"&zuobiao="+zuobiao);
  268. url = String.format(url, referer,cb,token,acToken,data,callback);
  269. log.info("yidun wuganzhi zuobiao:"+zuobiao);
  270. log.info("yidun wuganzhi guiji:"+guiji);
  271. log.info("yidun wuganzhi url:"+url);
  272. httpGet = new HttpGet(url);
  273. httpGet.setHeader("Host","c.dun.163.com");
  274. httpGet.setHeader("Referer","https://etax.hunan.chinatax.gov.cn/");
  275. httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36");
  276. httpGet.setHeader("Accept","*/*");
  277. httpGet.setHeader("Accept-Encoding","gzip, deflate, br");
  278. httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9");
  279. httpGet.setHeader("sec-ch-ua","\"Chromium\";v=\"92\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"92\"");
  280. httpGet.setHeader("sec-ch-ua-mobile","?0");
  281. httpGet.setHeader("Sec-Fetch-Dest","*/*");
  282. httpGet.setHeader("Sec-Fetch-Mode","no-cors");
  283. httpGet.setHeader("Sec-Fetch-Site","cross-site");
  284. httpGet.setHeader("Pragma","no-cache");
  285. httpGet.setConfig(hw.getRequestConfig());
  286. execute = client.execute(httpGet);
  287. entity = execute.getEntity();
  288. bytes = EntityUtils.toByteArray(entity);
  289. result = new String(bytes,"UTF-8");
  290. result = result.substring(result.indexOf("(")+1,result.indexOf(")"));
  291. log.info("yidun wuganzhi check result:"+result);
  292. dataMap.put("checkResult", result);
  293. //3.获取CN31加密串
  294. objJSon = JSONObject.parseObject(result);
  295. dataJSon = objJSon.getJSONObject("data");
  296. boolean resultFlag = dataJSon.getBooleanValue("result");
  297. if(resultFlag){
  298. String validate = dataJSon.getString("validate");
  299. Map map = new HashMap();
  300. map.put("validate", validate);
  301. map.put("fp", URLDecoder.decode(fp));
  302. ResponseContent response = HttpHelper.postJsonEntity(getCn31StrUrl, JSONObject.toJSONString(map));
  303. String cn31Str = response.getContent();
  304. log.info("cn31Str:"+cn31Str);
  305. dataMap.put("cn31Str", cn31Str);
  306. }else{
  307. return new ResultModel("-1","校验失败");
  308. }
  309. resultModel.setData(dataMap);
  310. return resultModel;
  311. }
  312. /**
  313. * 获取滑块验证后的数据-滑块
  314. * @author bree
  315. * @param
  316. * @return
  317. */
  318. public static ResultModel getHuaKuaiData(ProxyService proxyService) throws Exception{
  319. ResultModel resultModel = new ResultModel("0","处理成功");
  320. HttpClientWrapper hw = null;
  321. HttpGet httpGet = null;
  322. CloseableHttpResponse execute = null;
  323. Header[] headers = null;
  324. HttpEntity entity = null;
  325. byte[] bytes = null;
  326. String res = null;
  327. String result = null;
  328. hw = new HttpClientWrapper(5000,5000, 5000);
  329. CloseableHttpClient client = hw.getClient();
  330. //1.获取验证码
  331. String url = "https://c.dun.163.com/api/v2/get?referer=%s&zoneId=CN31&id=07e2387ab53a4d6f930b8d9a9be71bdf&fp=%s&https=true&type=2&version=2.16.0&dpr=1.25&dev=1&cb=%s&ipv6=false&runEnv=10&group=&scene=&lang=zh-CN&width=320&audio=false&token=&callback=%s";
  332. String fp = JiangsuTaxbureauUtil.getData(fpUrl);
  333. String cb = JiangsuTaxbureauUtil.getData(cbUrl);
  334. String callback = JiangsuTaxbureauUtil.getData(callbackUrl);
  335. String referer = "https%3A%2F%2Fdun.163.com%2Ftrial%2Fjigsaw";//如果网站应用了易盾,这里可能需要更改,这里是从官网测试的
  336. url = String.format(url, referer,fp,cb,callback);
  337. httpGet = new HttpGet(url);
  338. httpGet.setHeader("Host","c.dun.163.com");
  339. httpGet.setHeader("Referer","https://dun.163.com/");//如果网站应用了易盾,这里可能需要更改
  340. httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36");
  341. httpGet.setHeader("Accept","*/*");
  342. httpGet.setHeader("Accept-Encoding","gzip, deflate, br");
  343. httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9");
  344. httpGet.setHeader("sec-ch-ua","\"Chromium\";v=\"92\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"92\"");
  345. httpGet.setHeader("sec-ch-ua-mobile","?0");
  346. httpGet.setHeader("Sec-Fetch-Dest","script");
  347. httpGet.setHeader("Sec-Fetch-Mode","no-cors");
  348. httpGet.setHeader("Sec-Fetch-Site","same-site");
  349. httpGet.setConfig(hw.getRequestConfig());
  350. execute = client.execute(httpGet);
  351. entity = execute.getEntity();
  352. bytes = EntityUtils.toByteArray(entity);
  353. result = new String(bytes,"UTF-8");
  354. if(StringUtils.isEmpty(result)){
  355. return new ResultModel("-1","获取滑块失败");
  356. }
  357. result = result.substring(result.indexOf("(")+1,result.indexOf(")"));
  358. log.info("yidun huakuai get yzm code:"+result);
  359. JSONObject objJSon = JSONObject.parseObject(result);
  360. JSONObject dataJSon = objJSon.getJSONObject("data");
  361. String bg = (String)dataJSon.getJSONArray("bg").get(0);//滑块背景图片
  362. String front = (String)dataJSon.getJSONArray("front").get(0);//缺口图片
  363. String token = dataJSon.getString("token");
  364. String type = dataJSon.getString("type");
  365. String zoneId = dataJSon.getString("zoneId");
  366. if(StringUtils.isEmpty(token)){
  367. return new ResultModel("-1","获取滑块失败");
  368. }
  369. log.info("yidun huakuai bg:"+bg);
  370. log.info("yidun huakuai front:"+front);
  371. log.info("yidun huakuai token:"+token);
  372. //2.获取配置
  373. url = "https://c.dun.163.com/api/v2/getconf?referer=%s&zoneId=&id=07e2387ab53a4d6f930b8d9a9be71bdf&ipv6=false&runEnv=10&type=2&loadVersion=2.2.3&callback=%s";
  374. callback = JiangsuTaxbureauUtil.getData(callbackUrl);
  375. url = String.format(url,referer,callback);
  376. httpGet = new HttpGet(url);
  377. httpGet.setHeader("Host","c.dun.163.com");
  378. httpGet.setHeader("Referer","https://dun.163.com/");//如果网站应用了易盾,这里可能需要更改
  379. httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36");
  380. httpGet.setHeader("Accept","*/*");
  381. httpGet.setHeader("Accept-Encoding","gzip, deflate, br");
  382. httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9");
  383. httpGet.setHeader("sec-ch-ua","\"Chromium\";v=\"92\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"92\"");
  384. httpGet.setHeader("sec-ch-ua-mobile","?0");
  385. httpGet.setHeader("Sec-Fetch-Dest","*/*");
  386. httpGet.setHeader("Sec-Fetch-Mode","no-cors");
  387. httpGet.setHeader("Sec-Fetch-Site","same-site");
  388. httpGet.setConfig(hw.getRequestConfig());
  389. execute = client.execute(httpGet);
  390. entity = execute.getEntity();
  391. bytes = EntityUtils.toByteArray(entity);
  392. result = new String(bytes,"UTF-8");
  393. if(StringUtils.isEmpty(token)){
  394. return new ResultModel("-1","获取配置失败");
  395. }
  396. result = result.substring(result.indexOf("(")+1,result.indexOf(")"));
  397. log.info("yidun huakuai get config:"+result);
  398. objJSon = JSONObject.parseObject(result);
  399. dataJSon = objJSon.getJSONObject("data");
  400. JSONObject acJSon = dataJSon.getJSONObject("ac");
  401. String acToken = acJSon.getString("token");
  402. log.info("yidun huakuai acToken:"+acToken);
  403. //3.获取图片数据
  404. httpGet = new HttpGet(bg);
  405. httpGet.setConfig(hw.getRequestConfig());
  406. execute = client.execute(httpGet);
  407. entity = execute.getEntity();
  408. bytes = EntityUtils.toByteArray(entity);
  409. String backImage = Base64Util.encode(bytes);
  410. httpGet = new HttpGet(front);
  411. httpGet.setConfig(hw.getRequestConfig());
  412. execute = client.execute(httpGet);
  413. entity = execute.getEntity();
  414. bytes = EntityUtils.toByteArray(entity);
  415. String frontImage = Base64Util.encode(bytes);
  416. //4.识别图片
  417. String zuobiao = "";
  418. String guiji = "";
  419. zuobiao = iOcr.getX(backImage, frontImage);
  420. if(StringUtils.isEmpty(zuobiao)){
  421. return new ResultModel("-1","识别坐标失败");
  422. }
  423. log.info("yidun huakuai zuobiao:"+zuobiao);
  424. //5.获取轨迹
  425. String str = JiangsuTaxbureauUtil.getData(getTraceForHuakuaiUrl+zuobiao);
  426. JSONObject traceJson = JSONObject.parseObject(str);
  427. guiji = traceJson.getString("guiji");
  428. String zhZuobiao = traceJson.getString("zhZuobiao");//转换坐标
  429. log.info("yidun huakuai zhuanhuanhou zuobiao:"+zhZuobiao);
  430. log.info("yidun huakuai guiji:"+guiji);
  431. Thread.sleep(1000);
  432. //6.校验
  433. url = "https://c.dun.163.com/api/v2/check?referer=%s&zoneId=CN31&id=07e2387ab53a4d6f930b8d9a9be71bdf&token=%s&acToken=%s&data=%s&width=320&type=2&version=2.16.0&cb=%s&extraData=&bf=0&runEnv=10&callback=%s";
  434. cb = JiangsuTaxbureauUtil.getData(cbUrl);
  435. callback = JiangsuTaxbureauUtil.getData(callbackUrl);
  436. //String acToken = JiangsuTaxbureauUtil.getData("http://127.0.0.1:7002/yidun/yzm/getAcToken");
  437. String data = JiangsuTaxbureauUtil.getData(getDataForHuaKuaiUrl+"?guiji="+guiji+"&token="+token+"&zuobiao="+zuobiao);
  438. url = String.format(url, referer,token,acToken,data,cb,callback);
  439. log.info("yidun huakuai request url:"+url);
  440. httpGet = new HttpGet(url);
  441. httpGet.setHeader("Host","c.dun.163.com");
  442. httpGet.setHeader("Referer","https://dun.163.com/trial/jigsaw");
  443. httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36");
  444. httpGet.setHeader("Accept","*/*");
  445. httpGet.setHeader("Accept-Encoding","gzip, deflate, br");
  446. httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9");
  447. httpGet.setHeader("sec-ch-ua","\"Chromium\";v=\"92\", \" Not A;Brand\";v=\"99\", \"Google Chrome\";v=\"92\"");
  448. httpGet.setHeader("sec-ch-ua-mobile","?0");
  449. httpGet.setHeader("Sec-Fetch-Dest","*/*");
  450. httpGet.setHeader("Sec-Fetch-Mode","no-cors");
  451. httpGet.setHeader("Sec-Fetch-Site","cross-site");
  452. httpGet.setHeader("Pragma","no-cache");
  453. httpGet.setConfig(hw.getRequestConfig());
  454. execute = client.execute(httpGet);
  455. entity = execute.getEntity();
  456. bytes = EntityUtils.toByteArray(entity);
  457. result = new String(bytes,"UTF-8");
  458. log.info("yidun huakuai check result:"+result);
  459. result = result.substring(result.indexOf("(")+1,result.indexOf(")"));
  460. resultModel.setData(result);
  461. return resultModel;
  462. }
  463. public static String setCookie(String cookieStr,Header[] headers){
  464. for(Header header: headers){
  465. if("set-cookie".equals(header.getName().toLowerCase())){
  466. cookieStr += header.getValue() + "; ";
  467. }
  468. }
  469. return cookieStr;
  470. }
  471. }
  1. import java.io.FileOutputStream;
  2. import java.net.URLDecoder;
  3. import java.net.URLEncoder;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.List;
  7. import java.util.Map;
  8. import java.util.UUID;
  9. import org.apache.commons.io.IOUtils;
  10. import org.apache.http.Header;
  11. import org.apache.http.HttpEntity;
  12. import org.apache.http.client.methods.CloseableHttpResponse;
  13. import org.apache.http.client.methods.HttpGet;
  14. import org.apache.http.impl.client.CloseableHttpClient;
  15. import org.apache.http.util.EntityUtils;
  16. import org.eclipse.jetty.util.StringUtil;
  17. import org.springframework.util.StringUtils;
  18. import com.alibaba.fastjson.JSONObject;
  19. import com.baidu.aip.util.Base64Util;
  20. import lombok.extern.log4j.Log4j;
  21. /**
  22. * version 2.19.1
  23. * 易盾-获取滑块验证后的数据
  24. * 1.获取图片的fp指纹参数存在浏览器环境校验,校验不过也会正常返回图片,但是会降低通过率,不到10%
  25. * 这点经过测试,初步判断是请求易盾携带头信息不全导致
  26. */
  27. @Log4j
  28. public class YidunCheckUtil_2_21_3 {
  29. public static String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36";
  30. public static IOcr iOcr = new MachineOcr();
  31. public static String getTrace(String zuobiao) throws Exception{
  32. //获取acToken
  33. zuobiao = URLEncoder.encode(zuobiao);
  34. String signUrl = "http://127.0.0.1:5620/business-demo/invoke?action=getTrace&group=yidun&zuobiao="+zuobiao;
  35. ResponseContent response = HttpHelper.getUrlRespContent(signUrl);
  36. String content = response.getContent();
  37. JSONObject contentObj = JSONObject.parseObject(content);
  38. String trace = contentObj.getString("data");
  39. return trace;
  40. }
  41. public static String getAcToken() throws Exception{
  42. //获取acToken
  43. String signUrl = "http://127.0.0.1:5620/business-demo/invoke?action=getAcToken&group=yidun";
  44. ResponseContent response = HttpHelper.getUrlRespContent(signUrl);
  45. String content = response.getContent();
  46. JSONObject contentObj = JSONObject.parseObject(content);
  47. String acToken = contentObj.getString("data");
  48. return acToken;
  49. }
  50. public static JSONObject getYzmParam() throws Exception{
  51. String signUrl = "http://127.0.0.1:5620/business-demo/invoke?action=getYzmParam&group=yidun";
  52. ResponseContent response = HttpHelper.getUrlRespContent(signUrl);
  53. String content = response.getContent();
  54. JSONObject contentObj = JSONObject.parseObject(content);
  55. return contentObj;
  56. }
  57. public static String getData(String zuobiao,String guiji,String token) throws Exception{
  58. String mgetDataUrl = "http://127.0.0.1:5620/business-demo/invoke?action=getData&guiji=%s&token=%s&zuobiao=%s&group=yidun";
  59. mgetDataUrl = mgetDataUrl.format(mgetDataUrl, URLEncoder.encode(guiji),token,URLEncoder.encode(zuobiao));
  60. ResponseContent response = HttpHelper.getUrlRespContent(mgetDataUrl);
  61. String data = response.getContent();
  62. JSONObject objJson = JSONObject.parseObject(data);
  63. JSONObject mObj = new JSONObject();
  64. mObj.put("d", objJson.get("d"));
  65. mObj.put("ext", objJson.get("ext"));
  66. mObj.put("m", objJson.get("m"));
  67. mObj.put("p", objJson.get("p"));
  68. data = URLEncoder.encode(mObj.toJSONString());
  69. return data;
  70. }
  71. /**
  72. * 获取滑块验证后的数据-点选
  73. * @author bree
  74. * @param
  75. * @return
  76. */
  77. public static ResultModel getCheckData(ProxyService proxyService,List<String> proxyList) throws Exception{
  78. ResultModel resultModel = new ResultModel("0","处理成功");
  79. boolean flag = false;
  80. TaxBureauContext context = new TaxBureauContext();
  81. byte[] bytes = null;
  82. context.hw = new HttpClientWrapper(5000,5000, 5000,"127.0.0.1",8888);
  83. CloseableHttpClient client = context.hw.getClient();
  84. context.httpClient = client;
  85. //1.获取验证码
  86. JSONObject contentObj = getYzmParam();
  87. String referer = "https%3A%2F%2Fetax.jiangsu.chinatax.gov.cn%2Fsso%2Flogin";
  88. String fp = URLEncoder.encode(contentObj.getString("fp"));
  89. String cb = URLEncoder.encode(contentObj.getString("cb"));
  90. String callback = contentObj.getString("callback");
  91. String acToken = getAcToken();
  92. String url = "https://c.dun.163.com/api/v3/get?referer=%s&zoneId=CN31&acToken=%s&id=1a623022803d4cbc86fa157ec267bb36&fp=%s&https=true&type=undefined&version=2.21.2&dpr=1&dev=1&cb=%s&ipv6=false&runEnv=10&group=&scene=&lang=zh-CN&sdkVersion=undefined&width=0&audio=false&sizeType=10&smsVersion=v2&token=%s&callback=%s";
  93. url = String.format(url, referer,acToken,fp,cb,"",callback);
  94. context.httpGet = new HttpGet(url);
  95. context.httpGet.setHeader("Host","c.dun.163.com");
  96. context.httpGet.setHeader("Referer","https://etax.jiangsu.chinatax.gov.cn/");
  97. context.httpGet.setHeader("sec-ch-ua","\"Chromium\";v=\"110\", \"Not A(Brand\";v=\"24\", \"Google Chrome\";v=\"110\"");
  98. context.httpGet.setHeader("sec-ch-ua-mobile","?0");
  99. context.httpGet.setHeader("sec-ch-ua-platform","\"Windows\"");
  100. context.httpGet.setHeader("Sec-Fetch-Dest","script");
  101. context.httpGet.setHeader("Sec-Fetch-Mode","no-cors");
  102. context.httpGet.setHeader("Sec-Fetch-Site","cross-site");
  103. context.httpGet.setHeader("User-Agent",userAgent);
  104. context.httpGet.setConfig(context.hw.getRequestConfig());
  105. context.execute = context.httpClient.execute(context.httpGet);
  106. Header[] headers = context.execute.getAllHeaders();
  107. context.httpEntity = context.execute.getEntity();
  108. context.byteArr = EntityUtils.toByteArray(context.httpEntity);
  109. String result = new String(context.byteArr,"utf-8");
  110. System.out.println("result:"+result);
  111. result = result.substring(result.indexOf("(")+1,result.indexOf(")"));
  112. JSONObject objJSon = JSONObject.parseObject(result);
  113. String msg = objJSon.getString("msg");
  114. if(!"ok".equals(msg)) {
  115. resultModel.setCode("-1");
  116. resultModel.setMessage("获取验证码失败");
  117. return resultModel;
  118. }
  119. JSONObject dataJSon = objJSon.getJSONObject("data");
  120. String bg = (String)dataJSon.getJSONArray("bg").get(0);//滑块图片
  121. String front = dataJSon.getString("front");//点选文本
  122. String token = dataJSon.getString("token");
  123. String type = dataJSon.getString("type");
  124. String zoneId = dataJSon.getString("zoneId");
  125. //2.获取图片数据
  126. context.httpGet = new HttpGet(bg);
  127. context.httpGet.setConfig(context.hw.getRequestConfig());
  128. context.execute = client.execute(context.httpGet);
  129. context.httpEntity = context.execute.getEntity();
  130. bytes = EntityUtils.toByteArray(context.httpEntity);
  131. String zuobiao = "";
  132. String guiji = "";
  133. String baseImage = Base64Util.encode(bytes);
  134. if(StringUtils.isEmpty(baseImage)){
  135. resultModel.setCode("-1");
  136. resultModel.setMessage("获取验证码失败");
  137. return resultModel;
  138. }
  139. //3.识别图片
  140. TaxbureauConstants.setOcrUrl("http://monitor.taxservices.cn/");
  141. IOcr iOcr = new MachineOcr();
  142. String orcData = iOcr.getCodeNormal(baseImage, front);
  143. if(StringUtil.isBlank(orcData) || orcData.indexOf("500 Internal Server") >= 0) {
  144. resultModel.setCode("-1");
  145. resultModel.setMessage("识别验证码失败");
  146. return resultModel;
  147. }
  148. JSONObject ocrJson = JSONObject.parseObject(orcData);
  149. zuobiao = ocrJson.getString("points");
  150. //guiji = ocrJson.getString("track");
  151. //
  152. //调用自己的轨迹算法 测试发现自己的轨迹算法通过率高些
  153. guiji = getTrace(zuobiao);
  154. System.out.println("my guiji:"+guiji);
  155. if(StringUtils.isEmpty(zuobiao) || StringUtils.isEmpty(guiji)){
  156. resultModel.setCode("-1");
  157. resultModel.setMessage("识别验证码失败");
  158. return resultModel;
  159. }
  160. //4.校验滑块
  161. url = "https://c.dun.163.com/api/v3/check?referer=%s&zoneId=CN31&id=1a623022803d4cbc86fa157ec267bb36&token=%s&acToken=undefined&width=310&type=3&version=2.21.2&cb=%s&extraData=&bf=0&runEnv=10&sdkVersion=undefined&callback=%s";
  162. Thread.sleep(500);//故意让程序慢些,避免反爬
  163. contentObj = getYzmParam();
  164. cb = URLEncoder.encode(contentObj.getString("cb"));
  165. callback = contentObj.getString("callback");
  166. url = String.format(url, referer,token,cb,callback);
  167. String data = getData(zuobiao,guiji,token);
  168. log.info("YidunCheckUtil data:"+data);
  169. url = url +"&data="+data;
  170. log.info("YidunCheckUtil getCheckData url:"+url);
  171. context.httpGet = new HttpGet(url);
  172. context.httpGet.setHeader("Accept","*/*");
  173. context.httpGet.setHeader("Accept-Encoding","gzip, deflate, br");
  174. context.httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9");
  175. context.httpGet.setHeader("Cache-Control","no-cache");
  176. context.httpGet.setHeader("Connection","keep-alive");
  177. context.httpGet.setHeader("Pragma","no-cache");
  178. context.httpGet.setHeader("Host","c.dun.163.com");
  179. context.httpGet.setHeader("Referer","https://etax.jiangsu.chinatax.gov.cn/");
  180. context.httpGet.setHeader("sec-ch-ua","\"Chromium\";v=\"110\", \"Not A(Brand\";v=\"24\", \"Google Chrome\";v=\"110\"");
  181. context.httpGet.setHeader("sec-ch-ua-mobile","?0");
  182. context.httpGet.setHeader("sec-ch-ua-platform","\"Windows\"");
  183. context.httpGet.setHeader("Sec-Fetch-Dest","script");
  184. context.httpGet.setHeader("Sec-Fetch-Mode","no-cors");
  185. context.httpGet.setHeader("Sec-Fetch-Site","cross-site");
  186. context.httpGet.setHeader("Host","c.dun.163.com");
  187. context.httpGet.setHeader("User-Agent",userAgent);
  188. context.httpGet.setConfig(context.hw.getRequestConfig());
  189. context.execute = client.execute(context.httpGet);
  190. context.httpEntity = context.execute.getEntity();
  191. bytes = EntityUtils.toByteArray(context.httpEntity);
  192. result = new String(bytes,"UTF-8");
  193. log.info("YidunCheckUtil getCheckData validate result:"+result);
  194. if(StringUtils.isEmpty(result)){
  195. resultModel.setCode("-1");
  196. resultModel.setMessage("校验验证码失败");
  197. return resultModel;
  198. }
  199. result = result.substring(result.indexOf("(")+1, result.indexOf(")"));
  200. JSONObject objJson = JSONObject.parseObject(result);
  201. JSONObject dataJson = objJson.getJSONObject("data");
  202. String validate = dataJson.getString("validate");
  203. if(StringUtils.isEmpty(validate)){
  204. resultModel.setCode("-1");
  205. resultModel.setMessage("校验验证码失败");
  206. return resultModel;
  207. }else {
  208. return resultModel;
  209. }
  210. }
  211. }

签名破解使用了补环境方式,采用VM2执行

  1. var express = require('express');
  2. var router = express.Router();
  3. var http = require('http');
  4. var url = require('url');
  5. var traceUtil = require('../tools/traceUtil');
  6. var yidunUtil = require('../tools/yidunUtil');
  7. var yidunWatchUtil = require('../tools/yidunWatchUtil');
  8. var fs = require('fs');
  9. const {VM,VMScript} = require('vm2');//npm install vm2
  10. const file = `${__dirname}/../src/runcode/yidun_huakuai-2.19.1.js`;//需要vm2执行的JS代码
  11. const vm = new VM();
  12. //使用VMScript可以调试,在调试代码中增加debugger即可
  13. const script = new VMScript(fs.readFileSync(file),`${__dirname}.mycode.js`);
  14. router.get('/yzm/cb', function(request, response, next) {
  15. var rdata =
  16. url.parse(request.url,true).query; //获取参数
  17. var urlKey = rdata['urlKey'];
  18. vm.setGlobal('myfunType','cb');//入参传值
  19. vm.run(script);
  20. var cb = vm.getGlobal('myresult');//获取返回值
  21. // console.log('返回结果 cb:\n');
  22. // console.log(cb);
  23. cb = encodeURIComponent(cb);
  24. response.writeHead(200, {'Content-Type': 'application/json'});
  25. response.end(cb);
  26. });
  27. router.get('/yzm/fp', function(request, response, next) {
  28. var rdata = url.parse(request.url,true).query; //获取参数
  29. var urlKey = rdata['urlKey'];
  30. vm.setGlobal('myfunType','fp');//入参传值
  31. vm.run(script);
  32. var fp = vm.getGlobal('myresult');//获取返回值
  33. // console.log('返回结果 fp:\n');
  34. // console.log(fp);
  35. fp = encodeURIComponent(fp);
  36. response.writeHead(200, {'Content-Type': 'application/json'});
  37. response.end(fp);
  38. });
  39. router.get('/yzm/callback', function(request, response, next) {
  40. var rdata = url.parse(request.url,true).query; //获取参数
  41. var urlKey = rdata['urlKey'];
  42. vm.setGlobal('myfunType','callback');//入参传值
  43. vm.run(script);
  44. var callb = vm.getGlobal('myresult');//获取返回值
  45. // console.log('返回结果 callb:\n');
  46. //console.log(callb);
  47. callb = encodeURIComponent(callb);
  48. response.writeHead(200, {'Content-Type': 'application/json'});
  49. response.end(callb);
  50. });
  51. router.get('/yzm/getM', function(request, response, next) {
  52. var rdata = url.parse(request.url,true).query; //获取参数
  53. var urlKey = rdata['urlKey'];//轨迹值
  54. var token = rdata['token'];
  55. vm.setGlobal('myfunType','getM');//入参传值
  56. vm.setGlobal('mytoken',token);
  57. vm.setGlobal('myguiji',urlKey);
  58. vm.run(script);
  59. var mOut = vm.getGlobal('myresult');//获取返回值
  60. // console.log('返回结果 mOut:\n');
  61. //console.log(mOut);
  62. mOut = encodeURIComponent(mOut);
  63. response.writeHead(200, {'Content-Type': 'application/json'});
  64. response.end(mOut);
  65. });
  66. router.get('/yzm/getP', function(request, response, next) {
  67. var rdata = url.parse(request.url,true).query; //获取参数
  68. var urlKey = rdata['urlKey'];//3个坐标值
  69. var token = rdata['token'];
  70. vm.setGlobal('myfunType','getP');//入参传值
  71. vm.setGlobal('mytoken',token);
  72. vm.setGlobal('myzuobiao',urlKey);
  73. vm.run(script);
  74. var pOut = vm.getGlobal('myresult');//获取返回值
  75. // console.log('返回结果 pOut:\n');
  76. // console.log(pOut);
  77. pOut = encodeURIComponent(pOut);
  78. response.writeHead(200, {'Content-Type': 'application/json'});
  79. response.end(pOut);
  80. });
  81. router.get('/yzm/getExt', function(request, response, next) {
  82. var rdata = url.parse(request.url,true).query; //获取参数
  83. var urlKey = rdata['urlKey'];//轨迹值
  84. var token = rdata['token'];
  85. vm.setGlobal('myfunType','getExt');//入参传值
  86. vm.setGlobal('mytoken',token);
  87. vm.setGlobal('myguiji',urlKey);
  88. vm.run(script);
  89. var extOut = vm.getGlobal('myresult');//获取返回值
  90. // console.log('返回结果 extOut:\n');
  91. // console.log(extOut);
  92. extOut = encodeURIComponent(extOut);
  93. response.writeHead(200, {'Content-Type': 'application/json'});
  94. response.end(extOut);
  95. });
  96. router.get('/yzm/getAcToken', function(request, response, next) {
  97. var rdata = url.parse(request.url,true).query; //获取参数
  98. var urlKey = rdata['urlKey'];//轨迹值
  99. var token = rdata['token'];
  100. vm.setGlobal('myfunType','getAcToken');//入参传值
  101. vm.run(script);
  102. var acToken = vm.getGlobal('myresult');//获取返回值
  103. // console.log('返回结果 acToken:\n');
  104. // console.log(acToken);
  105. acToken = encodeURIComponent(acToken);
  106. response.writeHead(200, {'Content-Type': 'application/json'});
  107. response.end(acToken);
  108. });
  109. router.get('/yzm/getTrace', function(request, response, next) {
  110. var rdata = url.parse(request.url,true).query; //获取参数
  111. var urlKey = rdata['urlKey'];//3个坐标值
  112. var trace = traceUtil.getTrace(urlKey);//获取返回值
  113. // console.log('返回结果 trace:\n');
  114. // console.log(trace);
  115. response.writeHead(200, {'Content-Type': 'application/json'});
  116. response.end(trace);
  117. });
  118. router.get('/yzm/getTraceForWgz', function(request, response, next) {
  119. var rdata = url.parse(request.url,true).query; //获取参数
  120. //var urlKey = rdata['urlKey'];//1个坐标值
  121. var trace = traceUtil.getTraceForWgz();//获取返回值
  122. // console.log('返回结果 trace:\n');
  123. // console.log(trace);
  124. response.writeHead(200, {'Content-Type': 'application/json'});
  125. response.end(JSON.stringify(trace));
  126. });
  127. //获取滑块轨迹
  128. router.get('/yzm/getTraceForHuakuai', function(request, response, next) {
  129. var rdata = url.parse(request.url,true).query; //获取参数
  130. var zuobiao = rdata['zuobiao'];//1个坐标值
  131. var trace = traceUtil.getTraceForHuakuai(zuobiao);//获取返回值
  132. // console.log('返回结果 trace:\n');
  133. // console.log(trace);
  134. response.writeHead(200, {'Content-Type': 'application/json'});
  135. response.end(JSON.stringify(trace));
  136. });
  137. router.get('/yzm/getData', function(request, response, next) {
  138. var rdata = url.parse(request.url,true).query; //获取参数
  139. var guiji = rdata['guiji'];//轨迹值
  140. var token = rdata['token'];
  141. var zuobiao = rdata['zuobiao'];
  142. vm.setGlobal('myfunType','getData');//入参传值
  143. vm.setGlobal('mytoken',token);
  144. vm.setGlobal('myguiji',guiji);
  145. vm.setGlobal('myzuobiao',zuobiao);
  146. vm.run(script);
  147. var dataOut = vm.getGlobal('myresult');//获取返回值
  148. // console.log('返回结果 dataOut:\n');
  149. // console.log(dataOut);
  150. response.writeHead(200, {'Content-Type': 'application/json'});
  151. response.end(dataOut);
  152. });
  153. //无感知调用这个,只有ext参数中传输的坐标点数量不同,传1,点选传3
  154. router.get('/yzm/getDataForWgz', function(request, response, next) {
  155. var rdata = url.parse(request.url,true).query; //获取参数
  156. var guiji = rdata['guiji'];//轨迹值
  157. var token = rdata['token'];
  158. var zuobiao = rdata['zuobiao'];
  159. vm.setGlobal('myfunType','getDataForWgz');//入参传值
  160. vm.setGlobal('mytoken',token);
  161. vm.setGlobal('myguiji',guiji);
  162. vm.setGlobal('myzuobiao',zuobiao);
  163. vm.run(script);
  164. var dataOut = vm.getGlobal('myresult');//获取返回值
  165. //console.log('返回结果 dataOut:\n');
  166. // console.log(dataOut);
  167. response.writeHead(200, {'Content-Type': 'application/json'});
  168. response.end(dataOut);
  169. });
  170. //滑块调用这个,只有ext参数中传输的坐标点数量不同,传1,点选传3
  171. router.get('/yzm/getDataForHuakuai', function(request, response, next) {
  172. var rdata = url.parse(request.url,true).query; //获取参数
  173. var guiji = rdata['guiji'];//轨迹值
  174. var token = rdata['token'];
  175. var zuobiao = rdata['zuobiao'];
  176. vm.setGlobal('myfunType','getDataForHuakuai');//入参传值
  177. vm.setGlobal('mytoken',token);
  178. vm.setGlobal('myguiji',guiji);
  179. vm.setGlobal('myzuobiao',zuobiao);
  180. vm.run(script);
  181. var dataOut = vm.getGlobal('myresult');//获取返回值
  182. // console.log('返回结果 dataOut:\n');
  183. // console.log(dataOut);
  184. response.writeHead(200, {'Content-Type': 'application/json'});
  185. response.end(dataOut);
  186. });
  187. //无感知获取CN31加密串
  188. router.post('/yzm/getCn31Str', function(request, response, next) {
  189. var validate = request.body.validate;
  190. var fp = request.body.fp;
  191. vm.setGlobal('myfunType','getCn31Str');//入参传值
  192. vm.setGlobal('wgz_validate',validate);
  193. vm.setGlobal('wgz_fp',fp);
  194. vm.run(script);
  195. var dataOut = vm.getGlobal('myresult');//获取返回值
  196. // console.log('返回结果 dataOut:\n');
  197. // console.log(dataOut);
  198. response.writeHead(200, {'Content-Type': 'application/json'});
  199. response.end(dataOut);
  200. });
  201. router.post('/yzm/getYzmParam', function(request, response, next) {
  202. //var validate = request.body.validate;
  203. var WM_DID = request.body.WM_DID;
  204. var result = {};
  205. result = yidunUtil.getYzmParam(WM_DID);
  206. response.writeHead(200, {'Content-Type': 'application/json'});
  207. response.end(JSON.stringify(result));
  208. });
  209. router.post('/yzm/getCbByV3D', function(request, response, next) {
  210. //var validate = request.body.validate;
  211. //var fp = request.body.fp;
  212. var result = {};
  213. result = yidunWatchUtil.getCbByV3D();
  214. response.writeHead(200, {'Content-Type': 'application/json'});
  215. response.end(JSON.stringify(result));
  216. });
  217. router.post('/yzm/getDByV3D', function(request, response, next) {
  218. var objJson = request.body.objJson;
  219. var result = {};
  220. result = yidunWatchUtil.getDByV3D(objJson);
  221. response.writeHead(200, {'Content-Type': 'application/json'});
  222. response.end(JSON.stringify(result));
  223. });
  224. router.post('/yzm/getData/new', function(request, response, next) {
  225. var guiji = request.body.guiji;
  226. var token = request.body.token;
  227. var zuobiao = request.body.zuobiao;
  228. var data = yidunUtil.getData(token,zuobiao,guiji);
  229. var res = JSON.stringify(data);
  230. res = encodeURIComponent(res);
  231. response.writeHead(200, {'Content-Type': 'application/json'});
  232. response.end(res);
  233. });
  234. router.post('/yzm/getAcTokenWatch', function(request, response, next) {
  235. //var validate = request.body.validate;
  236. var WM_DID = request.body.WM_DID;
  237. var result = {};
  238. result = yidunWatchUtil.getAcToken(WM_DID);
  239. response.writeHead(200, {'Content-Type': 'application/json'});
  240. response.end(JSON.stringify(result));
  241. });
  242. module.exports = router;

补环境是在志远框架上进行了补充编写的。调用的服务层是自己编写。

就是提供个思路,代码已不可用!

纯技术交流,请勿用于非法用途,如有权益问题可以发私信联系我删除.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/521807
推荐阅读
相关标签
  

闽ICP备14008679号