CuiQiuMailServiceImpl.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package com.cyksj.service.mail.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.date.DateTime;
  4. import cn.hutool.core.date.DateUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import cn.hutool.http.HttpRequest;
  7. import cn.hutool.http.HttpResponse;
  8. import cn.hutool.http.HttpUtil;
  9. import com.cyksj.common.exception.BusinessRuntimeException;
  10. import com.cyksj.common.util.Jsons;
  11. import com.cyksj.common.util.StringUtil;
  12. import com.cyksj.common.util.TicketCodeCommonUtil;
  13. import com.cyksj.model.dto.CuiQiuEmailDetailDto;
  14. import com.cyksj.model.dto.CuiQiuEmailDto;
  15. import com.cyksj.model.dto.CuiQiuEmailResultDto;
  16. import com.cyksj.service.mail.CuiQiuMailService;
  17. import com.cyksj.service.relation.GroupsRelationNetflixService;
  18. import lombok.RequiredArgsConstructor;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.springframework.stereotype.Service;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. import java.util.Map;
  24. import java.util.stream.Collectors;
  25. /**
  26. * 项目名: yhlxj2
  27. * 文件名: CuiQiuMailServiceImpl
  28. * 创建者: JavaZou
  29. * 创建时间:2024/4/25 15:57
  30. */
  31. @Service
  32. @Slf4j
  33. @RequiredArgsConstructor
  34. public class CuiQiuMailServiceImpl implements CuiQiuMailService {
  35. private final GroupsRelationNetflixService groupsRelationNetflix;
  36. private final static String CUI_QIU_TOKEN = "4ff0341ebf1747cd89a2d1a5a296b68b";
  37. //脆球域名id
  38. private final static String DOMAIN_ID = "1696913058045050661";
  39. //代收管理员邮件id
  40. private final static String ADMIN_MAIL_ID = "1696913058063659217";
  41. //PS 验证码官方
  42. private final static String PS_ADOBE = "Adobe";
  43. private final static String DISNEY = "Disney+";
  44. private final static String NETFLIX = "Netflix";
  45. @Override
  46. public String getVerifyCode(String email, Long goodsId, Integer type, Boolean sync) throws Exception {
  47. //获取近二十封邮件
  48. String url = "https://domain-open-api.cuiqiu.com/v1/message/list";
  49. Map<String, Object> params = new HashMap<>();
  50. //获取近五分钟的代收邮件
  51. //维度是天
  52. DateTime now = DateTime.now();
  53. params.put("token", CUI_QIU_TOKEN);
  54. params.put("mail_id", ADMIN_MAIL_ID);
  55. params.put("start_time", DateUtil.offsetDay(now, -1).toDateStr());
  56. params.put("end_time", DateUtil.offsetDay(now, 1).toDateStr());
  57. params.put("to", email);
  58. params.put("limit", 20);
  59. HttpRequest post = HttpUtil.createPost(url);
  60. post.form(params);
  61. HttpResponse execute = post.execute();
  62. CuiQiuEmailResultDto resultDto = Jsons.parseObject(execute.body(), CuiQiuEmailResultDto.class);
  63. if (resultDto.getData().getList() == null) {
  64. return null;
  65. }
  66. List<CuiQiuEmailDto> list = resultDto.getData().getList();
  67. //获取邮箱对应的邮件
  68. list = list.stream().filter(emailInfo -> {
  69. CuiQiuEmailDto.CuiQiuUser from = emailInfo.getFrom().get(0);
  70. CuiQiuEmailDto.CuiQiuUser cuiQiuUser = emailInfo.getTo().get(0);
  71. if (StrUtil.equalsIgnoreCase(cuiQiuUser.getAddress(), email)) {
  72. //PS
  73. if (goodsId == 33l && StrUtil.equals(from.getName(), PS_ADOBE)) {
  74. return true;
  75. }
  76. //Disney
  77. if (goodsId == 3l && StrUtil.equals(from.getName(), DISNEY)) {
  78. return true;
  79. }
  80. if (goodsId == 1l && StrUtil.equals(from.getName(), NETFLIX)) {
  81. return true;
  82. }
  83. }
  84. return false;
  85. }).collect(Collectors.toList());
  86. if (CollUtil.isNotEmpty(list)) {
  87. for (CuiQiuEmailDto cuiQiuEmailDto : list) {
  88. Long messageId = cuiQiuEmailDto.getId();
  89. try {
  90. String code = getVerifyCodeByEmail(messageId, goodsId, type, sync);
  91. if (StrUtil.isNotBlank(code)) {
  92. return code;
  93. }
  94. } catch (Exception e) {
  95. }
  96. }
  97. }
  98. return null;
  99. }
  100. public String getVerifyCodeByEmail(Long messageId, Long goodsId, Integer type, Boolean sync) throws Exception {
  101. String url = "https://domain-open-api.cuiqiu.com/v1/message/detail";
  102. Map<String, Object> params = new HashMap<>();
  103. params.put("token", CUI_QIU_TOKEN);
  104. params.put("mail_id", ADMIN_MAIL_ID);
  105. params.put("message_id", messageId);
  106. HttpRequest post = HttpUtil.createPost(url);
  107. post.form(params);
  108. HttpResponse execute = post.execute();
  109. String respBody = execute.body();
  110. CuiQiuEmailDetailDto cuiQiuEmailDetailDto = Jsons.parseObject(respBody, CuiQiuEmailDetailDto.class);
  111. CuiQiuEmailDetailDto.Content content = cuiQiuEmailDetailDto.getData().getContent();
  112. String code = null;
  113. String body = content.getBody();
  114. if (goodsId == 1) {
  115. if (type != null && type == 1) {
  116. String pre = "NetflixSans-Regular, Helvetica, Roboto, Segoe UI, sans-serif; font-weight";
  117. if (body.contains("輸入此代碼登入") || body.contains("输入此代码登录")) {
  118. code = StrUtil.subAfter(body, pre, false);
  119. }
  120. if (StrUtil.isEmpty(code)) {
  121. throw BusinessRuntimeException.getInstance("查询失败,请检查是否发送了登陆码..");
  122. }
  123. } else {
  124. String urlPref = "https://www.netflix.com/account/update-primary-location";
  125. String nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
  126. if (StrUtil.isEmpty(nfVerifyUrl)) {
  127. urlPref = "https://www.netflix.com/account/travel/verify";
  128. nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
  129. if (StrUtil.isEmpty(nfVerifyUrl)) {
  130. throw BusinessRuntimeException.getInstance("获取认证链接失败,请重新获取");
  131. }
  132. }
  133. //非点击装置同步更新按钮 直接返回链接
  134. if (!sync) return nfVerifyUrl;
  135. //失败返回验证链接
  136. if (!groupsRelationNetflix.confirmUpdate(nfVerifyUrl)) {
  137. return nfVerifyUrl;
  138. }
  139. return StrUtil.EMPTY;
  140. }
  141. }
  142. if (StrUtil.isEmpty(code)) {
  143. code = TicketCodeCommonUtil.getTicketCodeStr(body, goodsId);
  144. }
  145. int length = 4;
  146. if (goodsId == 33l) {
  147. length = 6;
  148. }
  149. return StringUtil.getVerifyCodePattern(code, length);
  150. }
  151. }