weverse-api/ruoyi-admin/src/main/java/com/ruoyi/web/task/RyTask.java

281 lines
10 KiB
Java
Raw Normal View History

2025-02-11 07:25:18 +00:00
package com.ruoyi.web.task;
2025-03-04 08:49:35 +00:00
import com.alibaba.fastjson2.JSONObject;
2025-02-21 07:51:44 +00:00
import com.fasterxml.jackson.databind.ObjectMapper;
2025-02-11 07:25:18 +00:00
import com.ruoyi.quartz.domain.SysJob;
import com.ruoyi.quartz.service.ISysJobService;
2025-02-21 07:51:44 +00:00
import com.ruoyi.system.domain.Apply;
2025-02-12 06:56:32 +00:00
import com.ruoyi.system.domain.Perform;
2025-02-21 07:51:44 +00:00
import com.ruoyi.system.mapper.ApplyMapper;
2025-02-12 06:56:32 +00:00
import com.ruoyi.system.mapper.PerformMapper;
2025-02-21 07:51:44 +00:00
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
2025-02-11 07:25:18 +00:00
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
2025-03-04 08:49:35 +00:00
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
2025-02-11 07:25:18 +00:00
import java.net.URI;
2025-03-04 08:49:35 +00:00
import java.net.URLDecoder;
import java.net.URLEncoder;
2025-02-11 07:25:18 +00:00
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
2025-03-04 08:49:35 +00:00
import java.time.Duration;
2025-02-21 07:51:44 +00:00
import java.util.*;
2025-02-11 07:25:18 +00:00
import java.util.concurrent.CompletableFuture;
/**
* 定时任务调度测试
*
* @author ruoyi
*/
@Component("ryTask")
public class RyTask {
@Autowired
private ISysJobService jobService;
2025-02-12 06:56:32 +00:00
@Autowired
private PerformMapper performMapper;
2025-02-21 07:51:44 +00:00
@Autowired
private ApplyMapper applyMapper;
private static final Logger log = LoggerFactory.getLogger(RyTask.class);
2025-02-11 07:25:18 +00:00
2025-03-04 08:49:35 +00:00
/**
* 获取wmd
*
* @return
*/
private String getWMD(String data) {
try {
// 密钥secret key
String secret = "1b9cb6378d959b45714bec49971ade22e6e24e42";
// 要哈希的消息数据
// 创建HMAC算法实例指定算法为HmacSHA1
Mac hmac = Mac.getInstance("HmacSHA1");
// 创建密钥对象
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA1");
// 初始化HMAC算法实例
hmac.init(secretKey);
// 计算消息的HMAC值结果是一个字节数组
byte[] hmacBytes = hmac.doFinal(data.getBytes());
// 将字节数组转换为Base64编码的字符串
String base64Hmac = Base64.getEncoder().encodeToString(hmacBytes);
// 输出生成的HMAC Base64编码值
System.out.println("HMAC-SHA1 (Base64): " + base64Hmac);
// 指定使用的字符编码如UTF-8
String charset = "UTF-8";
// 进行URL编码
return URLEncoder.encode(base64Hmac, charset);
} catch (Exception e) {
log.error(e.getMessage());
}
return null;
}
/**
* 获取参数
*
* @param pid
* @param jobId
* @throws Exception
*/
public void get(Long pid, Long jobId) throws Exception {
//执行完成停止任务
SysJob job = new SysJob();
job.setJobId(jobId);
job.setStatus("1");
jobService.changeStatus(job);
//演出
Perform perform = performMapper.selectPerformById(pid);
if (perform == null) {
throw new Exception("未找到演出");
}
long time = System.currentTimeMillis();
String data = "/notice/v1.0/notice-" + perform.getNotice() + "?fieldSet=noticeV1&appId=be4d79eb8fc7bd008ee82c8ec4ff6fd4&language=zh-cn&os=WEB&platform=WEB&wpf=pc";
String base = "https://global.apis.naver.com/weverse/wevweb";
String wmd = getWMD(data + time);
if (wmd == null || wmd.isEmpty()) {
throw new Exception("wmd解析失败");
}
// 创建HttpClient实例
HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10))
.build();
// 创建HttpRequest
String url = base + data + "&wmsgpad=" + time + "&wmd=" + wmd;
System.out.println(url);
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI(url))
.GET()
.header("Authorization", "Bearer " + "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIyMGI1YTU1Mjg4M2I0YzIxYjJlYzA2YTI0NjE4YmYwMzoxIiwic3ViIjoiNzNkOWJmZDc5NTk4NDBlODg5NGRhZDg5ODIwODNhNDk2MDMiLCJpYXQiOjE3NDA5ODYzMTksImV4cCI6MTc0MTI0NTUxOSwiaXNzIjoiaHR0cHM6Ly9hY2NvdW50YXBpLndldmVyc2UuaW8vd2ViIiwiYXVkIjoiaHR0cHM6Ly9hY2NvdW50YXBpLndldmVyc2UuaW8iLCJ2ZXIiOjIsImNsaWVudF9pZCI6IndldmVyc2UiLCJwbGF0Zm9ybSI6IldFQiJ9.aQGNsvIRaUAwr9iFNOYsuTF69h_lIu2i6MDhq8JX9w4")
.header("Origin", "https://weverse.io")
.header("Referer", "https://weverse.io/")
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
.build();
// 发送请求并获取响应
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
String eValue = null;
// 检查响应状态码
if (response.statusCode() == 403) {
// 打印响应体
String responseBody = response.body();
WeverseResponse weverseResponse = JSONObject.parseObject(responseBody, WeverseResponse.class);
if (weverseResponse == null || weverseResponse.getData() == null ||
weverseResponse.getData().getButton() == null ||
weverseResponse.getData().getButton().getWebLink() == null ||
weverseResponse.getData().getButton().getWebLink().getUrl() == null ||
weverseResponse.getData().getButton().getWebLink().getUrl().isEmpty()) {
throw new Exception("button获取失败");
}
URI uri = new URI(weverseResponse.getData().getButton().getWebLink().getUrl());
String query = uri.getQuery();
String[] params = query.split("&");
Map<String, String> paramMap = new HashMap<>();
for (String param : params) {
String[] keyValue = param.split("=");
String key = URLDecoder.decode(keyValue[0], "UTF-8");
String value = URLDecoder.decode(keyValue[1], "UTF-8");
paramMap.put(key, value);
}
// 获取参数e的值
eValue = paramMap.get("e");
System.out.println(weverseResponse);
} else {
throw new Exception("button请求失败");
}
if (eValue == null || eValue.isEmpty()) {
throw new Exception("button为空");
}
Perform perform1 = new Perform();
perform1.setId(pid);
perform1.setNum(eValue);
performMapper.updatePerform(perform1);
}
2025-02-11 07:25:18 +00:00
/**
* 抢票
*
* @param pid
*/
2025-02-21 07:51:44 +00:00
public void rob(Long pid, Long jobId) throws Exception {
//status
Perform pStatus1 = new Perform();
pStatus1.setStatus("2");
pStatus1.setId(pid);
performMapper.updatePerform(pStatus1);
//执行完成停止任务
SysJob job = new SysJob();
job.setJobId(jobId);
job.setStatus("1");
jobService.changeStatus(job);
//演出
Perform perform = performMapper.selectPerformById(pid);
if (perform == null) {
throw new Exception("未找到演出");
}
//URL
String url = String.format("https://faneventapi.weverse.io/api/v1/events/%s/register", perform.getNum());
//人员
Apply apply = new Apply();
apply.setPerformId(pid);
List<Apply> applies = applyMapper.selectApplyListAllow(apply);
if (applies == null || applies.isEmpty()) {
throw new Exception("没有参与人员");
}
if (perform.getAgree() == null || "".equals(perform.getAgree())) {
throw new Exception("协议为空");
}
//协议
String[] agree = perform.getAgree().split(",");
int[] agrees = Arrays.stream(agree).mapToInt(Integer::parseInt).toArray();
2025-02-12 06:56:32 +00:00
2025-02-11 07:25:18 +00:00
2025-02-21 07:51:44 +00:00
List<MyReq> req = new ArrayList<>();
for (Apply a : applies) {
// 准备JSON负载
Map<String, Object> eventData = new HashMap<>();
eventData.put("eventId", Integer.parseInt(perform.getNum()));
eventData.put("language", "zh-cn");
Map<String, Object> data = new HashMap<>();
data.put("birthDate", a.getBirthday());
data.put("phoneNumber", a.getCountryCode() + " " + a.getPhoneNum());
data.put("agreedTermIds", agrees);
eventData.put("data", data);
ObjectMapper mapper = new ObjectMapper();
String jsonPayload = mapper.writeValueAsString(eventData);
System.out.println(jsonPayload);
2025-02-11 07:25:18 +00:00
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
2025-02-21 07:51:44 +00:00
.uri(URI.create(url))
.header("Content-Type", "application/json")
.header("Authorization", "Bearer " + a.getToken())
.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
.POST(HttpRequest.BodyPublishers.ofString(jsonPayload))
2025-02-11 07:25:18 +00:00
.build();
2025-02-24 01:01:16 +00:00
req.add(new MyReq(client, request, a.getName()));
2025-02-21 07:51:44 +00:00
}
Calendar calendar = Calendar.getInstance();
calendar.setTime(perform.getStartTime());
calendar.add(Calendar.HOUR_OF_DAY, -1);
long start = calendar.getTimeInMillis();
long now = System.currentTimeMillis();
Thread.sleep(start - now);
log.info("抢票开始了");
for (MyReq r : req) {
2025-03-04 08:49:35 +00:00
log.info("【用户】:" + r.getUser());
2025-02-11 07:25:18 +00:00
// 发起异步请求,但不等待结果
2025-02-21 07:51:44 +00:00
CompletableFuture<HttpResponse<String>> future2 = r.getClient().sendAsync(r.getRequest(), HttpResponse.BodyHandlers.ofString());
2025-02-11 07:25:18 +00:00
future2.thenAccept(response -> {
// 处理响应(例如,记录日志)
2025-03-04 08:49:35 +00:00
log.info("Response received: " + response.statusCode());
log.info(response.body());
2025-02-11 07:25:18 +00:00
}).exceptionally(ex -> {
// 处理异常
ex.printStackTrace();
return null;
});
}
2025-02-21 07:51:44 +00:00
//status
Perform pStatus2 = new Perform();
pStatus2.setStatus("3");
pStatus2.setId(pid);
performMapper.updatePerform(pStatus2);
2025-02-11 07:25:18 +00:00
}
2025-03-04 08:49:35 +00:00
2025-02-11 07:25:18 +00:00
}