CuiQiuMailServiceImpl.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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. /**
  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. private static List<CuiQiuEmailConfig> CuiQiuEmailConfigs;
  42. private final CuiQiuEmailConfigMapper CuiQiuEmailConfigMapper;
  43. public static String CUI_QIU_API_DOMAIN = "https://api-1760339128.cuiqiu.vip";
  44. @PostConstruct
  45. public void getCuiQiuEmailConfig() {
  46. CuiQiuEmailConfigs = CuiQiuEmailConfigMapper.selectList(null);
  47. }
  48. /**
  49. * @param type 1:奈飞安全码
  50. * @param linkType 链接 1:同步验证链接
  51. * @param isReturnDeviceUrl true 直接返回同步装置url
  52. */
  53. @Override
  54. public String getVerifyCode(String email, String relateEmail, Long goodsId, Integer type, Integer linkType, Boolean isReturnDeviceUrl) throws Exception {
  55. //获取近十封邮件
  56. String url = CUI_QIU_API_DOMAIN + "/v1/message/list";
  57. Map<String, Object> params = new HashMap<>();
  58. //获取近五分钟的代收邮件
  59. //维度是天
  60. DateTime now = DateTime.now();
  61. params.put("token", CUI_QIU_TOKEN);
  62. //关联邮件域名
  63. String mailId = getAdmainMailId(StrUtil.isNotEmpty(relateEmail) ? relateEmail : email);
  64. if (StrUtil.isEmpty(mailId)) {
  65. throw BusinessRuntimeException.getInstance("系统异常,请联系客服..");
  66. }
  67. params.put("mail_id", mailId);
  68. params.put("start_time", DateUtil.offsetDay(now, -1).toDateStr());
  69. params.put("end_time", DateUtil.offsetDay(now, 1).toDateStr());
  70. params.put("to", email);
  71. params.put("limit", 10);
  72. HttpRequest post = HttpUtil.createPost(url);
  73. post.form(params);
  74. HttpResponse execute = post.execute();
  75. CuiQiuEmailResultDto resultDto = Jsons.parseObject(execute.body(), CuiQiuEmailResultDto.class);
  76. if (resultDto.getData().getList() == null) {
  77. throw BusinessRuntimeException.getInstance("未收到对应邮件");
  78. }
  79. List<CuiQiuEmailDto> list = resultDto.getData().getList();
  80. //获取邮箱对应的邮件
  81. // list = list.stream().filter(emailInfo -> {
  82. // CuiQiuEmailDto.CuiQiuUser from = emailInfo.getFrom().get(0);
  83. // CuiQiuEmailDto.CuiQiuUser to = emailInfo.getTo().get(0);
  84. // CuiQiuEmailDto.CuiQiuUser cuiQiuUser = emailInfo.getTo().get(0);
  85. // if (StrUtil.equalsIgnoreCase(cuiQiuUser.getAddress(), email)) {
  86. // String toEmail = to.getAddress();
  87. // //通过直达邮件判断
  88. // if (StrUtil.equals(toEmail, email) || StrUtil.equals(toEmail, relateEmail)) {
  89. // //PS
  90. // if (Constant.PS_GIDS.contains(goodsId) && from.getName().contains(Constant.PS_ADOBE)) {
  91. // return true;
  92. // }
  93. // //Disney
  94. // if (goodsId == Constant.DISNEY_GID && from.getName().contains(Constant.DISNEY)) {
  95. // return true;
  96. // }
  97. // if (goodsId == Constant.NETFLIX_GID && from.getName().contains(Constant.NETFLIX)) {
  98. // return true;
  99. // }
  100. // }
  101. // }
  102. // return false;
  103. // }).collect(Collectors.toList());
  104. if (CollUtil.isNotEmpty(list)) {
  105. for (CuiQiuEmailDto CuiQiuEmailDto : list) {
  106. Long messageId = CuiQiuEmailDto.getId();
  107. try {
  108. String code = getVerifyCodeByEmail(messageId, goodsId, type, linkType, mailId, isReturnDeviceUrl);
  109. if (StrUtil.isNotBlank(code)) {
  110. return code;
  111. }
  112. } catch (Exception e) {
  113. }
  114. }
  115. }
  116. throw BusinessRuntimeException.getInstance("未收到对应邮件");
  117. }
  118. @Override
  119. public boolean isCuiQiuEmail(String account) {
  120. for (CuiQiuEmailConfig CuiQiuEmailConfig : CuiQiuEmailConfigs) {
  121. if (account.contains(CuiQiuEmailConfig.getDomainPrefix())) {
  122. return true;
  123. }
  124. }
  125. return false;
  126. }
  127. public String getVerifyCodeByEmail(Long messageId, Long goodsId, Integer type, Integer linkType, String mailId, Boolean isReturnDeviceUrl) throws Exception {
  128. String url = CUI_QIU_API_DOMAIN + "/v1/message/detail";
  129. Map<String, Object> params = new HashMap<>();
  130. params.put("token", CUI_QIU_TOKEN);
  131. params.put("mail_id", mailId);
  132. params.put("message_id", messageId);
  133. HttpRequest post = HttpUtil.createPost(url);
  134. post.form(params);
  135. HttpResponse execute = post.execute();
  136. String respBody = execute.body();
  137. CuiQiuEmailDetailDto CuiQiuEmailDetailDto = Jsons.parseObject(respBody, CuiQiuEmailDetailDto.class);
  138. CuiQiuEmailDetailDto.Content content = CuiQiuEmailDetailDto.getData().getContent();
  139. String code = null;
  140. String body = content.getBody();
  141. if (goodsId == 1) {
  142. if (type != null && type == 1) {
  143. String pre = "NetflixSans-Regular, Helvetica, Roboto, Segoe UI, sans-serif; font-weight";
  144. if (body.contains("輸入此代碼登入") || body.contains("输入此代码登录") || body.contains("Enter this code to sign in")) {
  145. code = StrUtil.subAfter(body, pre, false);
  146. if (StrUtil.isEmpty(code)) {
  147. code = StrUtil.subAfter(body, "font-weight: 400; color: #232323; padding-top: 20px;", true);
  148. }
  149. if (StrUtil.isEmpty(code)) {
  150. code = StrUtil.subAfter(body, "Enter this code to sign in", true);
  151. }
  152. }
  153. if (StrUtil.isEmpty(code)) {
  154. throw BusinessRuntimeException.getInstance("查询失败,请检查是否发送了登陆码..");
  155. }
  156. int length = 4;
  157. return StringUtil.getVerifyCodePattern(code, length);
  158. } else {
  159. String urlPref;
  160. String nfVerifyUrl;
  161. if (linkType == 1) {
  162. urlPref = "https://www.netflix.com/account/update-primary-location";
  163. nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
  164. } else {
  165. urlPref = "https://www.netflix.com/account/travel/verify";
  166. nfVerifyUrl = TicketCodeCommonUtil.extractUrl(body, urlPref);
  167. }
  168. if (StrUtil.isEmpty(nfVerifyUrl)) {
  169. throw BusinessRuntimeException.getInstance("请在奈飞端点击“传送电子邮件”");
  170. }
  171. //非点击装置同步更新按钮 直接返回链接
  172. if (linkType == 2) return nfVerifyUrl;
  173. //直接返回同步装置url
  174. if (isReturnDeviceUrl) {
  175. return nfVerifyUrl;
  176. }
  177. //失败返回验证链接
  178. if (!groupsRelationNetflix.confirmUpdate(nfVerifyUrl)) {
  179. return nfVerifyUrl;
  180. }
  181. return StrUtil.EMPTY;
  182. }
  183. }
  184. if (StrUtil.isEmpty(code)) {
  185. code = TicketCodeCommonUtil.getTicketCodeStr(body, goodsId);
  186. }
  187. if (StrUtil.isEmpty(code)) {
  188. throw BusinessRuntimeException.getInstance("请重新发送对应邮件");
  189. }
  190. return code;
  191. }
  192. /**
  193. * 获取接受邮件邮箱id
  194. */
  195. private String getAdmainMailId(String email) {
  196. for (CuiQiuEmailConfig CuiQiuEmailConfig : CuiQiuEmailConfigs) {
  197. if (email.contains(CuiQiuEmailConfig.getDomainPrefix())) {
  198. return CuiQiuEmailConfig.getMailId();
  199. }
  200. }
  201. return null;
  202. }
  203. }