package com.yeshi.fanli.service.manger.goods;
|
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.HashSet;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Set;
|
import java.util.regex.Matcher;
|
import java.util.regex.Pattern;
|
|
import javax.annotation.Resource;
|
|
import org.springframework.stereotype.Component;
|
import org.yeshi.utils.StringUtil;
|
|
import com.yeshi.fanli.dto.pdd.PDDPromotionUrl;
|
import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief;
|
import com.yeshi.fanli.entity.taobao.TaoKeAppInfo;
|
import com.yeshi.fanli.exception.goods.ConvertLinkExceptionException;
|
import com.yeshi.fanli.service.inter.taobao.TaoBaoBuyRelationMapService;
|
import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
|
import com.yeshi.fanli.service.manger.goods.tb.TaoBaoTokenAuctionIdMapManager;
|
import com.yeshi.fanli.util.RedisKeyEnum;
|
import com.yeshi.fanli.util.RedisManager;
|
import com.yeshi.fanli.util.TaoBaoConstant;
|
import com.yeshi.fanli.util.jd.JDApiUtil;
|
import com.yeshi.fanli.util.jd.JDUtil;
|
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoApiUtil;
|
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoUtil;
|
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
|
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
|
|
/**
|
* 转链组件
|
*
|
* @author Administrator
|
*
|
*/
|
@Component
|
public class ConvertLinkManager {
|
|
@Resource
|
private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
|
|
@Resource
|
private TaoBaoBuyRelationMapService taoBaoBuyRelationMapService;
|
|
@Resource
|
private RedisManager redisManager;
|
|
@Resource
|
private TaoBaoTokenAuctionIdMapManager taoBaoTokenAuctionIdMapManager;
|
|
/**
|
*
|
* @Title: convertJDLinkFromText @Description:转链文本中的京东短链 @param text @param
|
* uid @param share @return @throws Exception String 返回类型 @throws
|
*/
|
|
public String convertJDLinkFromText(String text, Long uid, boolean share) throws Exception {
|
|
StringBuilder builder = new StringBuilder(text);
|
String newText = builder.toString();
|
// 京东转链
|
// 提取京东所有的链接
|
List<String> jdShortLink = JDUtil.getJDShortLinksFromText(text);
|
Set<String> linkSet = new HashSet<>();
|
Map<String, String> linkMap = new HashMap<>();
|
if (jdShortLink != null && jdShortLink.size() > 0) {
|
linkSet.addAll(jdShortLink);
|
for (String shortLink : linkSet) {
|
String link = null;
|
if (share)
|
link = JDApiUtil.convertLinkWithSubUnionId(shortLink, null, JDApiUtil.POSITION_SHARE + "",
|
uid + "");
|
else
|
link = JDApiUtil.convertLinkWithSubUnionId(shortLink, null, JDApiUtil.POSITION_FANLI + "",
|
uid + "");
|
if (!StringUtil.isNullOrEmpty(link)) {
|
linkMap.put(shortLink, link);
|
}
|
}
|
}
|
|
for (String link : linkSet) {
|
if (linkMap.get(link) == null)
|
throw new Exception("京东转链失败");
|
newText = newText.replace(link, linkMap.get(link));
|
}
|
|
return newText;
|
}
|
|
public String convertPDDLinkFromText(String text, Long uid, boolean share) throws Exception {
|
|
StringBuilder builder = new StringBuilder(text);
|
String newText = builder.toString();
|
// 京东转链
|
// 提取京东所有的链接
|
List<String> pddShortLink = PinDuoDuoUtil.getPDDShortLinksFromText(text);
|
Set<String> linkSet = new HashSet<>();
|
Map<String, String> linkMap = new HashMap<>();
|
if (pddShortLink != null && pddShortLink.size() > 0) {
|
linkSet.addAll(pddShortLink);
|
for (String shortLink : linkSet) {
|
String goodsId = PinDuoDuoUtil.getPDDGoodsId(shortLink);
|
if (!StringUtil.isNullOrEmpty(goodsId)) {
|
PDDPromotionUrl pddUrl = PinDuoDuoApiUtil.convert(Long.parseLong(goodsId),
|
share ? PinDuoDuoApiUtil.PID_SHARE : PinDuoDuoApiUtil.PID_FANLI, uid + "");
|
if (pddUrl != null) {
|
linkMap.put(shortLink, pddUrl.getShortUrl());
|
}
|
}
|
|
}
|
}
|
|
for (String link : linkSet) {
|
if (linkMap.get(link) == null)
|
throw new Exception("拼多多转链失败");
|
newText = newText.replace(link, linkMap.get(link));
|
}
|
|
return newText;
|
}
|
|
// 获取淘宝官方活动ID内容
|
public List<String> getTaoBaoOfficialActivityId(String text) {
|
|
// {淘宝活动:13123123}
|
String regex = "(\\{\u6dd8\u5b9d\u6d3b\u52a8\\:){1}+[0-9]{5,20}\\}{1}";
|
Pattern pattern = Pattern.compile(regex);
|
Matcher m = pattern.matcher(text);
|
List<String> urlList = new ArrayList<>();
|
while (m.find()) {
|
urlList.add(m.group());
|
}
|
|
return urlList;
|
|
}
|
|
/**
|
*
|
* @Title: convertTBLinkFromText @Description: 转链文本中的淘口令 @param text @param
|
* uid @param share @return @throws Exception String 返回类型 @throws
|
*/
|
private String convertTBLinkFromText(String text, Long uid, boolean share) throws Exception {
|
|
StringBuilder builder = new StringBuilder(text);
|
String newText = builder.toString();
|
|
// 解析淘口令
|
List<String> tokenList = TaoBaoUtil.getTokenListFromTextWithKuoHao(newText);
|
if (tokenList != null && tokenList.size() > 0) {
|
|
String relationId = null;
|
if (share) {
|
relationId = userExtraTaoBaoInfoService.getRelationIdByUid(uid);
|
if (StringUtil.isNullOrEmpty(relationId))
|
throw new Exception("淘宝未授权");
|
}
|
Set<String> tokenSet = new HashSet<>();
|
tokenSet.addAll(tokenList);
|
Map<String, String> tokenMap = new HashMap<>();
|
for (String token : tokenSet) {
|
Long auctionId = taoBaoTokenAuctionIdMapManager.getAuctionIdByToken(token);
|
if (auctionId == null)
|
throw new Exception("从淘口令获取商品失败");
|
TaoBaoGoodsBrief simpleGoods = TaoKeApiUtil.getSimpleGoodsInfo(auctionId);
|
if (simpleGoods == null)
|
throw new Exception("商品信息获取失败");
|
String link = null;
|
if (share) {
|
TaoBaoGoodsBrief goods = TaoKeApiUtil.specialConvertCoupon(auctionId,
|
new TaoKeAppInfo(TaoBaoConstant.TAOBAO_AUTH_APPKEY, TaoBaoConstant.TAOBAO_AUTH_APPSECRET,
|
TaoBaoConstant.TAOBAO_RELATION_PID_DEFAULT));
|
if (goods == null)
|
throw new Exception("商品转链失败");
|
|
link = goods.getCouponLink();
|
if (StringUtil.isNullOrEmpty(link)) {
|
link = goods.getAuctionUrl();
|
}
|
if (StringUtil.isNullOrEmpty(link))
|
throw new Exception("商品转链失败");
|
link += "&relationId=" + relationId;
|
} else {
|
if (simpleGoods.getMaterialLibType() != null && simpleGoods.getMaterialLibType() == 1) {
|
TaoBaoGoodsBrief goods = TaoKeApiUtil.specialConvertCoupon(auctionId,
|
new TaoKeAppInfo(TaoBaoConstant.TAOBAO_AUTH_APPKEY,
|
TaoBaoConstant.TAOBAO_AUTH_APPSECRET,
|
TaoBaoConstant.TAOBAO_SPECIAL_PID_DEFAULT));
|
if (goods == null)
|
throw new Exception("商品转链失败");
|
|
link = goods.getCouponLink();
|
if (StringUtil.isNullOrEmpty(link)) {
|
link = goods.getAuctionUrl();
|
}
|
} else {
|
String sRelationId = taoBaoBuyRelationMapService.getRelationId(uid);
|
|
TaoBaoGoodsBrief goods = TaoKeApiUtil.specialConvertCoupon(auctionId,
|
new TaoKeAppInfo(TaoBaoConstant.TAOBAO_AUTH_APPKEY,
|
TaoBaoConstant.TAOBAO_AUTH_APPSECRET,
|
TaoBaoConstant.TAOBAO_RELATION_AS_SPECIAL_PID));
|
if (goods == null)
|
throw new Exception("商品转链失败");
|
|
link = goods.getCouponLink();
|
if (StringUtil.isNullOrEmpty(link)) {
|
link = goods.getAuctionUrl();
|
}
|
if (StringUtil.isNullOrEmpty(link))
|
throw new Exception("商品转链失败");
|
link += "&relationId=" + sRelationId;
|
}
|
}
|
|
if (StringUtil.isNullOrEmpty(link)) {
|
throw new Exception("商品转链失败");
|
}
|
|
String newToken = TaoKeApiUtil.getTKToken(simpleGoods.getPictUrl(), simpleGoods.getTitle(), link);
|
if (StringUtil.isNullOrEmpty(newToken)) {
|
throw new Exception("口令转链失败");
|
}
|
tokenMap.put(token, TaoBaoUtil.filterTaoToken(newToken));
|
}
|
|
for (String token : tokenSet) {
|
if (tokenMap.get(token) == null)
|
throw new Exception("淘宝部分转链失败");
|
newText = newText.replace(token, tokenMap.get(token));
|
}
|
}
|
|
// 解析淘宝官方活动ID
|
List<String> list = getTaoBaoOfficialActivityId(newText);
|
if (list.size() > 0) {
|
String relationId = null;
|
if (share) {
|
relationId = userExtraTaoBaoInfoService.getRelationIdByUid(uid);
|
if (StringUtil.isNullOrEmpty(relationId))
|
throw new Exception("淘宝未授权");
|
}
|
for (String st : list) {
|
String activityid = st.replace("{淘宝活动:", "").replace("}", "");
|
if (!StringUtil.isNullOrEmpty(activityid)) {
|
String adzoneId = TaoBaoConstant.TAOBAO_RELATION_PID_DEFAULT.split("_")[3];
|
String link = TaoKeApiUtil.officialActivityConvert(adzoneId, activityid, relationId);
|
String token = TaoKeApiUtil.getTKToken("http://", "淘宝官方活动", link);
|
newText = newText.replace(st, TaoBaoUtil.filterTaoToken(token));
|
}
|
}
|
}
|
|
return newText;
|
}
|
|
/**
|
*
|
* @Title: convertLinkFromText @Description: 从文本转链 @param text @return
|
* String 返回类型 @throws
|
*/
|
public String convertLinkFromText(String text, Long uid, boolean share)
|
throws ConvertLinkExceptionException, Exception {
|
String newText = convertJDLinkFromText(text, uid, share);
|
newText = convertPDDLinkFromText(newText, uid, share);
|
newText = convertTBLinkFromText(newText, uid, share);
|
if (text.equalsIgnoreCase(newText))
|
throw new ConvertLinkExceptionException(ConvertLinkExceptionException.CODE_NONE, "不包含可转链的口令与链接");
|
return newText;
|
}
|
|
/**
|
* 创建口令 @Title: createTaoBaoToken @Description: @param uid 用户ID @param
|
* picturl @param title @param link @return String 返回类型 @throws
|
*/
|
public String createTaoBaoToken(Long uid, String picturl, String title, String link) {
|
|
String token = TaoKeApiUtil.getTKToken(picturl, title, link);
|
if (!StringUtil.isNullOrEmpty(token)) {
|
// 缓存30分钟
|
redisManager.cacheCommonString(
|
RedisKeyEnum.getRedisKey(RedisKeyEnum.taobaoUserTKToken, uid + "-" + StringUtil.Md5(token)), "1",
|
60 * 30);
|
}
|
return token;
|
}
|
|
}
|