CuiQiuMailServiceImpl.java 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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.mapper.CuiQiuEmailConfigMapper;
  14. import com.cyksj.model.dto.CuiQiuEmailDetailDto;
  15. import com.cyksj.model.dto.CuiQiuEmailDto;
  16. import com.cyksj.model.dto.CuiQiuEmailResultDto;
  17. import com.cyksj.model.entity.CuiQiuEmailConfig;
  18. import com.cyksj.service.mail.CuiQiuMailService;
  19. import com.cyksj.service.relation.GroupsRelationNetflixService;
  20. import lombok.RequiredArgsConstructor;
  21. import lombok.extern.slf4j.Slf4j;
  22. import org.springframework.stereotype.Service;
  23. import javax.annotation.PostConstruct;
  24. import java.util.HashMap;
  25. import java.util.List;
  26. import java.util.Map;
  27. import java.util.stream.Collectors;
  28. /**
  29. * 项目名: yhlxj2
  30. * 文件名: CuiQiuMailServiceImpl
  31. * 创建者: JavaZou
  32. * 创建时间:2024/4/25 15:57
  33. */
  34. @Service
  35. @Slf4j
  36. @RequiredArgsConstructor
  37. public class CuiQiuMailServiceImpl implements CuiQiuMailService {
  38. private final GroupsRelationNetflixService groupsRelationNetflix;
  39. private final static String CUI_QIU_TOKEN = "4ff0341ebf1747cd89a2d1a5a296b68b";
  40. //脆球域名id
  41. private final static String DOMAIN_ID = "1696913058045050661";
  42. //PS 验证码官方
  43. private final static String PS_ADOBE = "Adobe";
  44. private final static String DISNEY = "Disney+";
  45. private final static String NETFLIX = "Netflix";
  46. private static List<CuiQiuEmailConfig> CuiQiuEmailConfigs;
  47. private final CuiQiuEmailConfigMapper CuiQiuEmailConfigMapper;
  48. @PostConstruct
  49. public void getCuiQiuEmailConfig() {
  50. CuiQiuEmailConfigs = CuiQiuEmailConfigMapper.selectList(null);
  51. }
  52. /**
  53. *
  54. * @param type 1:奈飞安全码
  55. * @param linkType 链接 1:同步验证链接
  56. */
  57. @Override
  58. public String getVerifyCode(String email, Long goodsId, Integer type, Integer linkType) throws Exception {
  59. //获取近二十封邮件
  60. String url = "https://domain-open-api.cuiqiu.com/v1/message/list";
  61. Map<String, Object> params = new HashMap<>();
  62. //获取近五分钟的代收邮件
  63. //维度是天
  64. DateTime now = DateTime.now();
  65. params.put("token", CUI_QIU_TOKEN);
  66. String mailId = getAdmainMailId(email);
  67. if (StrUtil.isEmpty(mailId)) {
  68. throw BusinessRuntimeException.getInstance("系统异常,请联系客服..");
  69. }
  70. params.put("mail_id", mailId);
  71. params.put("start_time", DateUtil.offsetDay(now, -1).toDateStr());
  72. params.put("end_time", DateUtil.offsetDay(now, 1).toDateStr());
  73. params.put("to", email);
  74. params.put("limit", 20);
  75. HttpRequest post = HttpUtil.createPost(url);
  76. post.form(params);
  77. HttpResponse execute = post.execute();
  78. CuiQiuEmailResultDto resultDto = Jsons.parseObject(execute.body(), CuiQiuEmailResultDto.class);
  79. if (resultDto.getData().getList() == null) {
  80. return null;
  81. }
  82. List<CuiQiuEmailDto> list = resultDto.getData().getList();
  83. //获取邮箱对应的邮件
  84. list = list.stream().filter(emailInfo -> {
  85. CuiQiuEmailDto.CuiQiuUser from = emailInfo.getFrom().get(0);
  86. CuiQiuEmailDto.CuiQiuUser cuiQiuUser = emailInfo.getTo().get(0);
  87. if (StrUtil.equalsIgnoreCase(cuiQiuUser.getAddress(), email)) {
  88. //PS
  89. if (goodsId == 33l && StrUtil.equals(from.getName(), PS_ADOBE)) {
  90. return true;
  91. }
  92. //Disney
  93. if (goodsId == 3l && StrUtil.equals(from.getName(), DISNEY)) {
  94. return true;
  95. }
  96. if (goodsId == 1l && StrUtil.equals(from.getName(), NETFLIX)) {
  97. return true;
  98. }
  99. }
  100. return false;
  101. }).collect(Collectors.toList());
  102. if (CollUtil.isNotEmpty(list)) {
  103. for (CuiQiuEmailDto CuiQiuEmailDto : list) {
  104. Long messageId = CuiQiuEmailDto.getId();
  105. try {
  106. String code = getVerifyCodeByEmail(messageId, goodsId, type, linkType, mailId);
  107. if (StrUtil.isNotBlank(code)) {
  108. return code;
  109. }
  110. } catch (Exception e) {
  111. }
  112. }
  113. }
  114. return null;
  115. }
  116. @Override
  117. public boolean isCuiQiuEmail(String account) {
  118. for (CuiQiuEmailConfig CuiQiuEmailConfig : CuiQiuEmailConfigs) {
  119. if (account.contains(CuiQiuEmailConfig.getDomainPrefix())) {
  120. return true;
  121. }
  122. }
  123. return false;
  124. }
  125. public String getVerifyCodeByEmail(Long messageId, Long goodsId, Integer type, Integer linkType, String mailId) throws Exception {
  126. String url = "https://domain-open-api.cuiqiu.com/v1/message/detail";
  127. Map<String, Object> params = new HashMap<>();
  128. params.put("token", CUI_QIU_TOKEN);
  129. params.put("mail_id", mailId);
  130. params.put("message_id", messageId);
  131. HttpRequest post = HttpUtil.createPost(url);
  132. post.form(params);
  133. HttpResponse execute = post.execute();
  134. String respBody = execute.body();
  135. CuiQiuEmailDetailDto CuiQiuEmailDetailDto = Jsons.parseObject(respBody, CuiQiuEmailDetailDto.class);
  136. CuiQiuEmailDetailDto.Content content = CuiQiuEmailDetailDto.getData().getContent();
  137. String code = null;
  138. String body = content.getBody();
  139. if (goodsId == 1) {
  140. if (type != null && type == 1) {
  141. String pre = "NetflixSans-Regular, Helvetica, Roboto, Segoe UI, sans-serif; font-weight";
  142. if (body.contains("輸入此代碼登入") || body.contains("输入此代码登录") || body.contains("Enter this code to sign in")) {
  143. code = StrUtil.subAfter(body, pre, false);
  144. if (StrUtil.isEmpty(code)) {
  145. code = StrUtil.subAfter(body, "Enter this code to sign in", true);
  146. }
  147. }
  148. if (StrUtil.isEmpty(code)) {
  149. throw BusinessRuntimeException.getInstance("查询失败,请检查是否发送了登陆码..");
  150. }
  151. } else {
  152. String urlPref;
  153. String nfVerifyUrl;
  154. if (linkType == 1) {
  155. urlPref = "https://www.netflix.com/account/update-primary-location";
  156. nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
  157. } else {
  158. urlPref = "https://www.netflix.com/account/travel/verify";
  159. nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
  160. }
  161. if (StrUtil.isEmpty(nfVerifyUrl)) {
  162. throw BusinessRuntimeException.getInstance("获取认证链接失败,请重新获取");
  163. }
  164. //非点击装置同步更新按钮 直接返回链接
  165. if (linkType == 2) return nfVerifyUrl;
  166. //失败返回验证链接
  167. if (!groupsRelationNetflix.confirmUpdate(nfVerifyUrl)) {
  168. return nfVerifyUrl;
  169. }
  170. return StrUtil.EMPTY;
  171. }
  172. }
  173. if (StrUtil.isEmpty(code)) {
  174. code = TicketCodeCommonUtil.getTicketCodeStr(body, goodsId);
  175. }
  176. int length = 4;
  177. if (goodsId == 33l || goodsId == 45l) {
  178. length = 6;
  179. }
  180. return StringUtil.getVerifyCodePattern(code, length);
  181. }
  182. /**
  183. * 获取接受邮件邮箱id
  184. */
  185. private String getAdmainMailId(String email) {
  186. for (CuiQiuEmailConfig CuiQiuEmailConfig : CuiQiuEmailConfigs) {
  187. if (email.contains(CuiQiuEmailConfig.getDomainPrefix())) {
  188. return CuiQiuEmailConfig.getMailId();
  189. }
  190. }
  191. return null;
  192. }
  193. }