CuiQiuMailServiceImpl.java 6.7 KB

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