Selaa lähdekoodia

articlePromotion

wangyunpeng 8 kuukautta sitten
vanhempi
commit
9fbc314f14
17 muutettua tiedostoa jossa 1671 lisäystä ja 16 poistoa
  1. 28 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/vo/IdNameVO.java
  2. 5 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/longArticle/DatastatSortStrategyRepository.java
  3. 15 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/XxlJobService.java
  4. 277 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/ArticlePromotionService.java
  5. 1 1
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/filter/strategy/BadStrategy.java
  6. 1 1
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/filter/strategy/HistoryTitleForFwhColdStartStrategy.java
  7. 2 2
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/filter/strategy/HistoryTitleStrategy.java
  8. 2 2
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/filter/strategy/InfiniteHisTitleStrategy.java
  9. 1 1
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/filter/strategy/SensitiveStrategy.java
  10. 5 5
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/rank/RankStrategy.java
  11. 5 4
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/util/TitleSimilarCheckUtil.java
  12. 5 0
      long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/web/XxlJobController.java
  13. 920 0
      long-article-recommend-service/src/main/resources/file/ProduceConfig.json
  14. 122 0
      long-article-recommend-service/src/main/resources/file/长文_帖子结果库_根据计划id获取内容.json
  15. 51 0
      long-article-recommend-service/src/main/resources/file/长文_抓取计划_根据url列表抓取.json
  16. 107 0
      long-article-recommend-service/src/main/resources/file/长文_抓取计划_根据计划id获取状态.json
  17. 124 0
      long-article-recommend-service/src/main/resources/file/长文_生成结果库_根据计划id获取内容.json

+ 28 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/model/vo/IdNameVO.java

@@ -0,0 +1,28 @@
+package com.tzld.longarticle.recommend.server.model.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+
+import java.util.Objects;
+
+@Getter
+@Setter
+@Accessors(chain = true)
+public class IdNameVO<T> {
+    private T id;
+    private String name;
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        IdNameVO<?> idNameVO = (IdNameVO<?>) o;
+        return Objects.equals(id, idNameVO.id);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(id);
+    }
+}

+ 5 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/repository/longArticle/DatastatSortStrategyRepository.java

@@ -4,7 +4,12 @@ import com.tzld.longarticle.recommend.server.model.entity.longArticle.DatastatSo
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface DatastatSortStrategyRepository extends JpaRepository<DatastatSortStrategy, DatastatSortStrategy.PK> {
 
+    List<DatastatSortStrategy> getByViewCountGreaterThanEqualAndReadRateGreaterThanEqualAndPositionIn(Integer viewCount,
+                                                                                                      Double readRate,
+                                                                                                      List<Integer> positionList);
 }

+ 15 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/XxlJobService.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aliyun.odps.data.Record;
 import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
+import com.google.common.collect.Lists;
 import com.tzld.longarticle.recommend.server.common.enums.recommend.AccountBusinessTypeEnum;
 import com.tzld.longarticle.recommend.server.common.enums.recommend.FeishuRobotIdEnum;
 import com.tzld.longarticle.recommend.server.mapper.aigc.AigcBaseMapper;
@@ -29,6 +30,7 @@ import com.tzld.longarticle.recommend.server.repository.longArticle.GetOffVideoA
 import com.tzld.longarticle.recommend.server.repository.longArticle.LongArticlesMatchVideoRepository;
 import com.tzld.longarticle.recommend.server.repository.longArticle.LongArticlesReadRateRepository;
 import com.tzld.longarticle.recommend.server.repository.model.PushMessageCallbackExample;
+import com.tzld.longarticle.recommend.server.service.recommend.ArticlePromotionService;
 import com.tzld.longarticle.recommend.server.service.recommend.ArticleService;
 import com.tzld.longarticle.recommend.server.util.DateUtils;
 import com.tzld.longarticle.recommend.server.util.LarkRobotUtil;
@@ -74,6 +76,8 @@ public class XxlJobService {
     private ODPSManager odpsManager;
     @Autowired
     private ArticleService articleService;
+    @Autowired
+    private ArticlePromotionService articlePromotionService;
 
     @ApolloJsonValue("${touliu.account.ghIds:[\"gh_93e00e187787\", \"gh_ac43e43b253b\", \"gh_68e7fdc09fe4\",\"gh_77f36c109fb1\", \"gh_b181786a6c8c\", \"gh_1ee2e1b39ccf\"]}")
     private List<String> touliuAccountGhIds;
@@ -410,4 +414,15 @@ public class XxlJobService {
         articleService.articleCategoryJobRetry();
         return ReturnT.SUCCESS;
     }
+
+    @XxlJob("articlePromotion")
+    public ReturnT<String> articlePromotion(String param) {
+        articlePromotionService.articlePromotion("【1】", "direct", "头条利用池_v1",
+                "头条利用池_v4", 500, 1.1, Lists.newArrayList(1));
+        articlePromotionService.articlePromotion("【1】", "direct", "头条利用池_v2",
+                "头条利用池_v4", 250, 1.21, Lists.newArrayList(2));
+        articlePromotionService.articlePromotion("【2】", "direct", "次条利用池_v1",
+                "头条利用池_v4", 100, 1.33, Lists.newArrayList(3, 4, 5, 6, 7, 8));
+        return ReturnT.SUCCESS;
+    }
 }

+ 277 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/ArticlePromotionService.java

@@ -0,0 +1,277 @@
+package com.tzld.longarticle.recommend.server.service.recommend;
+
+import cn.hutool.core.io.resource.ResourceUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.tzld.longarticle.recommend.server.common.HttpPoolFactory;
+import com.tzld.longarticle.recommend.server.model.entity.longArticle.DatastatSortStrategy;
+import com.tzld.longarticle.recommend.server.model.vo.IdNameVO;
+import com.tzld.longarticle.recommend.server.repository.longArticle.DatastatSortStrategyRepository;
+import com.tzld.longarticle.recommend.server.util.DateUtils;
+import com.tzld.longarticle.recommend.server.util.TitleSimilarCheckUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.StatusLine;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class ArticlePromotionService {
+
+    @Autowired
+    DatastatSortStrategyRepository datastatSortStrategyRepository;
+
+    private final CloseableHttpClient client = HttpPoolFactory.aigcPool();
+    private static List<String> contentPoolType = Arrays.asList("autoArticlePoolLevel1", "autoArticlePoolLevel3", "autoArticlePoolLevel4");
+
+    public void articlePromotion(String pos, String way, String accountNickName, String tag,
+                                 Integer viewCountFilter, Double viewCountRateFilter, List<Integer> positionFilter) {
+        String today = DateUtils.getCurrentDateStr("yyyyMMdd");
+
+        // 获取内部表现
+        List<DatastatSortStrategy> list = datastatSortStrategyRepository.getByViewCountGreaterThanEqualAndReadRateGreaterThanEqualAndPositionIn(
+                viewCountFilter, viewCountRateFilter, positionFilter);
+        log.info("优质{}文章数量: {}", accountNickName, list.size());
+
+        List<DatastatSortStrategy> distinct = filterSameTitle(list);
+        distinct.sort(Comparator.comparing(DatastatSortStrategy::getDateStr, Comparator.reverseOrder()));
+        log.info("优质{}文章数量(去重后): {}", accountNickName, distinct.size());
+
+        addUrlListToAccount(accountNickName, distinct, pos, way, today, tag);
+    }
+
+
+    private List<DatastatSortStrategy> filterSameTitle(List<DatastatSortStrategy> list) {
+        List<DatastatSortStrategy> result = new ArrayList<>();
+        List<String> titles = new ArrayList<>();
+        for (DatastatSortStrategy datastatSortStrategy : list) {
+            String title = datastatSortStrategy.getTitle();
+            if (titles.contains(title)) {
+                continue;
+            }
+            if (!TitleSimilarCheckUtil.isDuplicateContent(datastatSortStrategy.getTitle(), titles, TitleSimilarCheckUtil.ARTICLE_PROMOTION_THRESHOLD)) {
+                result.add(datastatSortStrategy);
+                titles.add(title);
+            }
+        }
+        return result;
+    }
+
+    private void addUrlListToAccount(String accountNickName, List<DatastatSortStrategy> list, String pos, String way,
+                                     String today, String tag) {
+        List<String> urlList = list.stream().map(DatastatSortStrategy::getLink).collect(Collectors.toList());
+        // 获取生产配置
+        Map<String, Map<String, Map<String, String>>> produceConfig = getProduceConfig();
+        if (!produceConfig.containsKey(accountNickName)) {
+            log.info("account_nickname not in produceConfig: " + accountNickName);
+            String planName = String.format("%d_%s_%s_%s【%s】_%s", list.size(), today, accountNickName, pos, way, today);
+            createArticleUrlPlan(planName, urlList, tag);
+            return;
+        }
+
+        String produceId = produceConfig.get(accountNickName).get(pos).get(way).trim();
+        List<Map<String, String>> contentList = getProduceContentList(accountNickName, pos, way);
+
+        // 获取已访问的标题和URL
+        List<String> visitedTitleList = contentList.stream()
+                .flatMap(content -> Arrays.stream(new String[]{content.get("referContentTitle"), content.get("title")}))
+                .distinct()
+                .collect(Collectors.toList());
+
+        Set<String> visitedUrlIdList = contentList.stream()
+                .map(content -> getUrlId(content.get("referContentLink")))
+                .collect(Collectors.toSet());
+
+        List<String> thisUrlIdList = urlList.stream()
+                .map(this::getUrlId)
+                .collect(Collectors.toList());
+
+        // 筛选URL和标题
+        List<String> filterUrlList = new ArrayList<>();
+        List<String> filterTitleList = new ArrayList<>();
+        for (int i = 0; i < list.size(); i++) {
+            DatastatSortStrategy item = list.get(i);
+            String url = item.getLink();
+            String urlId = thisUrlIdList.get(i);
+            String title = item.getTitle();
+            String wxSn = item.getWxSn();
+
+            if (visitedUrlIdList.contains(urlId)) {
+                continue;
+            }
+            if (TitleSimilarCheckUtil.isDuplicateContent(title, visitedTitleList, TitleSimilarCheckUtil.ARTICLE_PROMOTION_THRESHOLD)) {
+                continue;
+            }
+
+            filterUrlList.add(url);
+            filterTitleList.add(title);
+
+            // 调用爬虫 detail 接口并保存数据
+            Map<String, String> detail = getArticleDetail(url);
+            if (detail != null) {
+                String level = pos.equals("【1】") ? contentPoolType.get(0) : contentPoolType.get(1);
+                saveArticlePoolPromotionSource(detail.get("channel_content_id"), wxSn, title, level);
+            }
+        }
+
+        if (filterUrlList.isEmpty()) {
+            log.info("url_list empty: " + accountNickName + ", " + pos + ", " + way);
+            return;
+        }
+
+        int urlLen = filterUrlList.size();
+        String planName = String.format("%d_%s_%s_%s【%s】_%s", urlLen, today, accountNickName, pos, way, today);
+        log.info("url_len: " + list.size() + ", " + urlLen);
+
+        IdNameVO<String> planInfo = createArticleUrlPlan(planName, filterUrlList, tag);
+        if (produceId == null || produceId.isEmpty()) {
+            log.info("{}, {}, produce plan not exist: {}, {}, {}", planInfo.getName(), planInfo.getId(), accountNickName, pos, way);
+            return;
+        }
+
+        articleAddDependPlan(produceId, planInfo.getId(), planInfo.getName());
+    }
+
+    private Map<String, Map<String, Map<String, String>>> getProduceConfig() {
+        // 返回生产配置的逻辑
+        String json = ResourceUtil.readUtf8Str("file/ProduceConfig.json");
+        return JSONObject.parseObject(json,
+                new TypeReference<Map<String, Map<String, Map<String, String>>>>() {
+                });
+    }
+
+    private IdNameVO<String> createArticleUrlPlan(String planName, List<String> urlList, String tag) {
+        IdNameVO<String> result = new IdNameVO<>();
+        if (urlList == null || urlList.isEmpty()) {
+            return null;
+        }
+
+        // 从配置中读取模板文件路径
+        String templateFile = ResourceUtil.readUtf8Str("file/长文_抓取计划_根据url列表抓取.json");
+        if (templateFile == null) {
+            return null;
+        }
+
+        // 读取模板文件内容
+        JSONObject template = JSONObject.parseObject(templateFile);
+
+        String apiUrl = template.getString("api_url");
+        JSONObject data = template.getJSONObject("data");
+
+        // 设置请求参数
+        JSONObject params = data.getJSONObject("params");
+        params.put("name", planName);
+        if (tag != null) {
+            params.put("planTag", tag);
+        }
+        params.put("inputModeValues", urlList);
+
+        // 将数据转为 JSON 格式
+        String requestData = data.toString();
+        try {
+            HttpPost httpPost = new HttpPost(apiUrl);
+            StringEntity stringEntity = new StringEntity(requestData, StandardCharsets.UTF_8);
+            httpPost.setHeader("Content-Type", "application/json;charset=UTF-8");
+            httpPost.setEntity(stringEntity);
+            CloseableHttpResponse response = client.execute(httpPost);
+            StatusLine statusLine = response.getStatusLine();
+            if (statusLine.getStatusCode() == 200) {
+                HttpEntity responseEntity = response.getEntity();
+                if (Objects.nonNull(responseEntity)) {
+                    String responseBody = EntityUtils.toString(responseEntity, "UTF-8");
+                    JSONObject jsonObject = JSONObject.parseObject(responseBody);
+                    if (jsonObject.getInteger("code") == 0) {
+                        JSONObject responseData = jsonObject.getJSONObject("data");
+                        String planId = responseData.getString("id");
+                        String returnedPlanName = responseData.getString("name");
+                        log.info("plan_name: {}, plan_id: {}", returnedPlanName, planId);
+                        result.setId(planId);
+                        result.setName(returnedPlanName);
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("createArticleUrlPlan error", e);
+        }
+
+        return result;
+    }
+
+    private List<Map<String, String>> getProduceContentList(String accountNickName, String pos, String way) {
+        // 返回生产内容列表的逻辑
+        return new ArrayList<>();
+    }
+
+    public String getUrlId(String url) {
+        if (url == null) {
+            return null;
+        }
+        // 检查是否包含特定的前缀
+        if (url.contains("https://mp.weixin.qq.com/s/")) {
+            return url.split("https://mp.weixin.qq.com/s/")[1];
+        }
+        Map<String, String> params = new HashMap<>();
+        try {
+            String pureUrl = URLDecoder.decode(url, "utf-8");
+            // 解析 URL 参数
+            params = parseQueryString(pureUrl);
+
+            String biz = params.get("http://mp.weixin.qq.com/s?__biz");
+            String sn = params.get("sn");
+            String mid = params.get("mid");
+            String idx = params.get("idx");
+
+            if (biz != null && sn != null && mid != null && idx != null) {
+                return String.format("biz=%s_mid=%s_idx=%s_sn=%s", biz, mid, idx, sn);
+            }
+        } catch (Exception e) {
+            log.error("get_url_id error: " + url);
+        }
+
+        return params.get("sn");
+    }
+
+    // 辅助方法:解析查询参数
+    private static Map<String, String> parseQueryString(String url) {
+        // 示例解析逻辑
+        Map<String, String> params = new java.util.HashMap<>();
+        if (url.contains("?")) {
+            String query = url.substring(url.indexOf("?") + 1);
+            for (String param : query.split("&")) {
+                String[] keyValue = param.split("=", 2);
+                if (keyValue.length == 2) {
+                    params.put(keyValue[0], keyValue[1]);
+                }
+            }
+        }
+        return params;
+    }
+
+    private Map<String, String> getArticleDetail(String url) {
+        // 返回文章详情的逻辑
+        return new HashMap<>();
+    }
+
+    private void saveArticlePoolPromotionSource(String channelContentId, String wxSn, String title, String level) {
+        // 保存文章数据的逻辑
+        log.info("Saved: " + channelContentId + ", " + wxSn + ", " + title + ", " + level);
+    }
+
+    private void articleAddDependPlan(String produceId, String planId, String planName) {
+        // 添加依赖计划的逻辑
+        log.info("Added dependency: " + produceId + " -> " + planId + " (" + planName + ")");
+    }
+
+
+}

+ 1 - 1
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/filter/strategy/BadStrategy.java

@@ -32,7 +32,7 @@ public class BadStrategy implements FilterStrategy {
         List<Content> contents = param.getContents();
         List<Content> filterContents = new ArrayList<>();
         for (Content content : contents) {
-            if (!TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), badTitles)) {
+            if (!TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), badTitles, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD)) {
                 result.add(content.getId());
             } else {
                 content.setFilterReason("历史表现差的文章");

+ 1 - 1
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/filter/strategy/HistoryTitleForFwhColdStartStrategy.java

@@ -40,7 +40,7 @@ public class HistoryTitleForFwhColdStartStrategy implements FilterStrategy {
         List<String> allTitleList = allArticleList.stream().map(Article::getTitle).distinct().collect(Collectors.toList());
 
         for (Content content : param.getContents()) {
-            boolean isDuplicate = TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), allTitleList);
+            boolean isDuplicate = TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), allTitleList, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD);
             if (!isDuplicate) {
                 result.add(content.getId());
             } else {

+ 2 - 2
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/filter/strategy/HistoryTitleStrategy.java

@@ -66,9 +66,9 @@ public class HistoryTitleStrategy implements FilterStrategy {
                     boolean isDuplicate;
                     if (CollectionUtils.isNotEmpty(firstSecondContentPool) && firstSecondContentPool.contains(content.getContentPoolType())) {
                         // 四个内容池 配置 判断头条,次头条
-                        isDuplicate = TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), firstSecondTitleList);
+                        isDuplicate = TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), firstSecondTitleList, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD);
                     } else {
-                        isDuplicate = TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), allTitleList);
+                        isDuplicate = TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), allTitleList, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD);
                     }
                     if (isDuplicate) {
                         content.setFilterReason("历史已发布文章");

+ 2 - 2
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/filter/strategy/InfiniteHisTitleStrategy.java

@@ -49,9 +49,9 @@ public class InfiniteHisTitleStrategy implements FilterStrategy {
         for (Content content : param.getContents()) {
             Future<Content> future = pool.submit(() -> {
                 try {
-                    boolean isDuplicate = TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), qunfaTitleList);
+                    boolean isDuplicate = TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), qunfaTitleList, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD);
                     if (!isDuplicate) {
-                        isDuplicate = TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), allTitleList);
+                        isDuplicate = TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), allTitleList, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD);
                     }
                     if (isDuplicate) {
                         content.setFilterReason("历史已发布文章");

+ 1 - 1
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/filter/strategy/SensitiveStrategy.java

@@ -73,7 +73,7 @@ public class SensitiveStrategy implements FilterStrategy {
 //                    if (isSensitive) {
 //                        content.setFilterReason("安全违规");
 //                    } else
-                    if (TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), UnSafeTitles)) {
+                    if (TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), UnSafeTitles, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD)) {
                         content.setFilterReason("安全违规");
                     }
                     return content;

+ 5 - 5
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/service/recommend/rank/RankStrategy.java

@@ -25,10 +25,10 @@ public interface RankStrategy {
     public static void deduplication(List<Content> result, Map<String, List<Content>> contentMap, String[] publishPool) {
         List<String> titles = new ArrayList<>();
         for (int i = 0; i < result.size(); i++) {
-            if (TitleSimilarCheckUtil.isDuplicateContent(result.get(i).getTitle(), titles)) {
+            if (TitleSimilarCheckUtil.isDuplicateContent(result.get(i).getTitle(), titles, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD)) {
                 if (i == 0) {
                     for (Content content : contentMap.get(publishPool[0])) {
-                        if (!TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), titles)) {
+                        if (!TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), titles, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD)) {
                             result.set(i, content);
                             titles.add(content.getTitle());
                             break;
@@ -36,7 +36,7 @@ public interface RankStrategy {
                     }
                 } else if (i == 1) {
                     for (Content content : contentMap.get(publishPool[1])) {
-                        if (!TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), titles)) {
+                        if (!TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), titles, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD)) {
                             result.set(i, content);
                             titles.add(content.getTitle());
                             break;
@@ -44,7 +44,7 @@ public interface RankStrategy {
                     }
                 } else {
                     for (Content content : contentMap.get(publishPool[2])) {
-                        if (!TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), titles)) {
+                        if (!TitleSimilarCheckUtil.isDuplicateContent(content.getTitle(), titles, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD)) {
                             result.set(i, content);
                             titles.add(content.getTitle());
                             break;
@@ -77,7 +77,7 @@ public interface RankStrategy {
                 if (!contentPool.equals(c.getContentPoolType())) {
                     continue;
                 }
-                if (!TitleSimilarCheckUtil.isDuplicateContent(c.getTitle(), titles)) {
+                if (!TitleSimilarCheckUtil.isDuplicateContent(c.getTitle(), titles, TitleSimilarCheckUtil.SIMILARITY_THRESHOLD)) {
                     result.add(c);
                     titles.add(c.getTitle());
                 }

+ 5 - 4
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/util/TitleSimilarCheckUtil.java

@@ -9,16 +9,17 @@ import java.util.Set;
 
 public class TitleSimilarCheckUtil {
 
-    public static final double SIMILARITY_THRESHOLD = 0.8; // 相似度阈值
+    public static final double SIMILARITY_THRESHOLD = 0.8;
+    public static final double ARTICLE_PROMOTION_THRESHOLD = 0.75;
 
-    public static boolean isDuplicateContent(String title, List<String> existsContentTitle) {
+    public static boolean isDuplicateContent(String title, List<String> existsContentTitle, double threshold) {
         boolean result = false;
         if (CollectionUtils.isEmpty(existsContentTitle)) {
             return result;
         }
         title = title.trim().replace("\u200b", "");
         for (String existsTitle : existsContentTitle) {
-            if (isSimilar(title, existsTitle, SIMILARITY_THRESHOLD)) {
+            if (isSimilar(title, existsTitle, threshold)) {
                 result = true;
                 break;
             }
@@ -51,7 +52,7 @@ public class TitleSimilarCheckUtil {
                 "人到晚年才明白:多子女家庭,老人大概率过得比独子家庭的要幸福",
                 "可供中国使用3800年?山东意外发现巨大宝藏,西方当场酸了!",
                 "陕西女孩去医院体检后,发现左肾不见了,意外牵出8年前手术疑云");
-        boolean result = isDuplicateContent(title, existsContentTitle);
+        boolean result = isDuplicateContent(title, existsContentTitle, SIMILARITY_THRESHOLD);
         System.out.println(result);
     }
 }

+ 5 - 0
long-article-recommend-service/src/main/java/com/tzld/longarticle/recommend/server/web/XxlJobController.java

@@ -44,6 +44,11 @@ public class XxlJobController {
         service.syncArticleRootPublishId(dateStr);
     }
 
+    @GetMapping("/articlePromotion")
+    public void articlePromotion() {
+        service.articlePromotion(null);
+    }
+
     @GetMapping("/articlePromotionTraceability")
     public void articlePromotionTraceability(String channelContentId) {
         service.articlePromotionTraceability(channelContentId);

+ 920 - 0
long-article-recommend-service/src/main/resources/file/ProduceConfig.json

@@ -0,0 +1,920 @@
+{
+  "文章联想_v1": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240802080355355308981",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "账号联想_v1": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240802021606053813696",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "次条利用池_v1": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240804003153130851174",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "头条利用池_v1": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "20240802143345289374071",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "头条利用池_v2": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "20240802171417146947657",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "买号(7老)利用池": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "20240722173910406354866",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "一级利用池": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "20240722172106621853929",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "二级利用池": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "20240722171934234321806",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "三级利用池": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "20240722171903994980781",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "all": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "20240619065638039678211",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "买号(7老)": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "20240717134102812837584",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "指尖奇文": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619134542078136922",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150015057273348",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "老友欢聚地": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135136709957703",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620145939700385880",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "生活百态观": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135355095726865",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620145905550944001",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "退休老年圈": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135325636564473",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620145651682680591",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "人生百事观": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135303864280211",
+      "metaso_v6": "20240627011538166839002"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150049064956907",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "畅聊奇闻": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135417379978694",
+      "metaso_v6": "20240627011625369570686"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620145719647110806",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "便捷生活好方法": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135437205390582",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150156522383672",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "趣味晚年": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240627010500078504066",
+      "metaso_v6": "20240619174630506699369"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620144255253939206",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "快乐精选集": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240714164137042321634",
+      "metaso_v6": "20240619174714266351653"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620144502584415706",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "老友快乐谈": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240627010602025684655",
+      "metaso_v6": "20240619174744395696472"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620144608760115389",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "幸福启示": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240714164117345513209",
+      "metaso_v6": "20240619174810985681762"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620144721106250461",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "生活指示录": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240714164057308955191",
+      "metaso_v6": "20240619174837425970293"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620144804890613455",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "态度说": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240627010628731841889",
+      "metaso_v6": "20240619174903746219850"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620144925698737830",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "幸福妙招合集": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240627010652634645284",
+      "metaso_v6": "20240619174929810475216"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620145008715100040",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "喜乐生活派": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240717090014005862918",
+      "metaso_v6": "20240619174952916604259"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620145041908938651",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "路边闲聊社": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619144459943499013",
+      "metaso_v6": "20240619175014885374566"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620145301628584858",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "都市镜头": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619144522175396636",
+      "metaso_v6": "20240619175111438640542"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620145345798678601",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "天天学生活技巧": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240717085954024528751",
+      "metaso_v6": "20240619175129772903031"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620145409686973229",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "老来生活家": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240627011256635889174",
+      "metaso_v6": "20240619175149533397431"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620145539840948858",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "生活晓常识": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240714164033574268429",
+      "metaso_v6": "20240619175220306941746"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620145615118296851",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "情为老友": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619144433914418041",
+      "metaso_v6": "20240624234359392962863"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150231114561621",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "趣味生活达人": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240719075051374305103",
+      "metaso_v6": "20240619175038305624281"
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150329506848179",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "音药金曲厅": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135638091488314",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150406308651076",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "生活情感叁读": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135704525482328",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150439125918056",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "心灵情感驿站": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135525121453992",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150520727865407",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "生活良读": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135729722903060",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150558023343302",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "祝福养心厅": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240624235322236462213",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150649016805823",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "缘来养心厅": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135457787133327",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150709796326757",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "音药养心馆": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135613012890962",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150736899611790",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "票圈正能量": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135813195419691",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150802444512365",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "票圈美文速递": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135751447262273",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150831653696454",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "票圈最新消息": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240619135837022448677",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240620150854864561123",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "票圈极速版": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240622081711978679528",
+      "metaso_v6": ""
+    },
+    "【3-8】": {
+      "bing_v1": "20240622081948700745264",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "幸福晚年知音": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240714164013250695197",
+      "metaso_v6": "20240624132200428942877"
+    },
+    "【3-8】": {
+      "bing_v1": "20240624135837374916828",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "奇趣百味生活": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240723161713178487742",
+      "metaso_v6": "20240624132237983472872"
+    },
+    "【3-8】": {
+      "bing_v1": "20240624135907372955213",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "乐享生活小窍门": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240717085917306445525",
+      "metaso_v6": "20240624132300148451729"
+    },
+    "【3-8】": {
+      "bing_v1": "20240624135917131523966",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "看不够妙招": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240717085858257828553",
+      "metaso_v6": "20240624134354447790502"
+    },
+    "【3-8】": {
+      "bing_v1": "20240624135927496900961",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "无忧自在生活": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240723161624895222132",
+      "metaso_v6": "20240624132320440489860"
+    },
+    "【3-8】": {
+      "bing_v1": "20240624135937235856611",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "无忧潮生活": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240717085835438450110",
+      "metaso_v6": "20240624132343891797372"
+    },
+    "【3-8】": {
+      "bing_v1": "20240624135946820843667",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "无忧生活小妙招": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240714163940219653626",
+      "metaso_v6": "20240624132407021137050"
+    },
+    "【3-8】": {
+      "bing_v1": "20240624135956356654156",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "巷尾风声": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240624134449968606209",
+      "metaso_v6": "20240624132436019369092"
+    },
+    "【3-8】": {
+      "bing_v1": "20240624140005629185547",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "实用妙招800个": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240719074342974320739",
+      "metaso_v6": "20240624132505957988929"
+    },
+    "【3-8】": {
+      "bing_v1": "20240624140015939232442",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  },
+  "小贝生活课堂": {
+    "【1】": {
+      "bing_v1": "",
+      "direct": "",
+      "metaso_v6": ""
+    },
+    "【2】": {
+      "bing_v1": "",
+      "direct": "20240717085935048670085",
+      "metaso_v6": "20240624132527369730715"
+    },
+    "【3-8】": {
+      "bing_v1": "20240624140025297917686",
+      "direct": "",
+      "metaso_v6": ""
+    }
+  }
+}

+ 122 - 0
long-article-recommend-service/src/main/resources/file/长文_帖子结果库_根据计划id获取内容.json

@@ -0,0 +1,122 @@
+{
+    "describe": "长文_帖子结果库_根据计划id获取内容",
+    "api_url": "http://aigc-api.cybertogether.net/aigc/crawler/content/list",
+    "res": {
+        "code": 0,
+        "msg": "success",
+        "data": {
+            "totalCount": 1,
+            "data": [
+                {
+                    "id": "4957108",
+                    "channel": 5,
+                    "channelContentId": "b9c2352defc1c70f6000bed5f2d4bc2c",
+                    "contentLink": "http://mp.weixin.qq.com/s?__biz=Mzg4MTk3MDMzMA==&mid=2247495126&idx=2&sn=b1c3b30a6bdcdcb5d41ec5d5a2ab9eff&chksm=cf5f7023f828f9359f452e735c2c1dd9c8c3bcd77d358b6c71450db548bc6dd3e704d7e134d1#rd",
+                    "coverImageUrl": "http://res.cybertogether.net/crawler/image/d003329fb2a2664c7b83825db9817720.jpeg",
+                    "videoUrl": null,
+                    "title": "华春莹代表中国,用《琉球地位未定论》,好好给日本上了一课",
+                    "content": null,
+                    "contentContactInfo": null,
+                    "status": null,
+                    "failReason": null,
+                    "taskJson": null,
+                    "outputJson": null,
+                    "tagJson": null,
+                    "channelAccountId": "5bd2b7c9dc76dc0c061ab91ac9c836e4",
+                    "accountLink": "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzg4MTk3MDMzMA==&scene=124#wechat_redirect",
+                    "accountName": "庆彬有理",
+                    "accountAvatarUrl": null,
+                    "accountDescription": "数字经济智库高级研究员日本横滨国立大学特聘教授国际问题研究者",
+                    "accountBackgroundUrl": null,
+                    "accountFollowerCount": null,
+                    "accountPublishCount": null,
+                    "accountLikeCount": null,
+                    "accountLikeFollowerRate": "0",
+                    "keyFrameUrls": null,
+                    "voiceUrl": null,
+                    "srt": null,
+                    "topics": null,
+                    "analyzeTasks": null,
+                    "analyzeStatus": null,
+                    "keyFrameTags": null,
+                    "srtTags": null,
+                    "imageElementTags": null,
+                    "contentTags": null,
+                    "sourceCrawlerPlans": [
+                        {
+                            "id": "20240618064316453133944",
+                            "name": "算法-票圈美文速递-20240618_30"
+                        },
+                        {
+                            "id": "20240618083435678510787",
+                            "name": "测试"
+                        }
+                    ],
+                    "viewCount": 100001,
+                    "playCount": null,
+                    "likeCount": 2393,
+                    "collectCount": null,
+                    "commentCount": null,
+                    "crawlerCommentCount": 7,
+                    "lookingCount": 735,
+                    "midAdNum": null,
+                    "bottomAdNum": null,
+                    "publishTimestamp": 1716482280000,
+                    "crawlerTimestamp": 1716496149321,
+                    "sourceCrawlerPlan": null,
+                    "sourcePretreatPlan": null,
+                    "quoteGenerateContents": [
+                        {
+                            "id": "20240617095235976423066",
+                            "name": null,
+                            "produceModal": 3
+                        },
+                        {
+                            "id": "20240618044830290938828",
+                            "name": null,
+                            "produceModal": 3
+                        }
+                    ],
+                    "manMadePostTags": null,
+                    "manMadeTitleTags": null,
+                    "manMadeContentTags": null,
+                    "manMadeImageTags": null,
+                    "manMadeVideoTags": null,
+                    "manMadeAudioTags": null,
+                    "manMadeSrtTags": null,
+                    "keyPoints": null,
+                    "hotPoints": null
+                }
+            ]
+        }
+    },
+    "data": {
+        "params": {
+            "filterItems": [
+                {
+                    "itemName": "sourceCrawlerPlans",
+                    "selectValues": [
+                        "20240618083435678510787"
+                    ]
+                }
+            ],
+            "listFieldFormula": [],
+            "pageNum": 1,
+            "pageSize": 50,
+            "contentModal": 3
+        },
+        "baseInfo": {
+            "token": "79dcb40af1de43b1bd9fe3a731dbaa15",
+            "appType": 9,
+            "platform": "pc",
+            "appVersionCode": 1000,
+            "clientTimestamp": 1,
+            "fid": 1,
+            "loginUid": 1,
+            "pageSource": 1,
+            "requestId": 1,
+            "rid": 1,
+            "uid": 1
+        }
+    }
+}

+ 51 - 0
long-article-recommend-service/src/main/resources/file/长文_抓取计划_根据url列表抓取.json

@@ -0,0 +1,51 @@
+{
+    "describe": "长文_抓取计划_根据url列表抓取",
+    "api_url": "http://aigc-api.cybertogether.net/aigc/crawler/plan/save",
+    "res": {
+        "code": 0,
+        "msg": "success",
+        "data": {
+            "id": "20240618072529702764841",
+            "name": "测试抓取_20240618"
+        }
+    },
+    
+    "data": {
+      "params": {
+        "contentFilters": [],
+        "accountFilters": [],
+        "filterAccountMatchMode": 1,
+        "filterContentMatchMode": 1,
+        "selectModeValues": [],
+        "searchModeValues": [],
+        "contentModal": 3,
+        "analyze": {},
+        "crawlerComment": 0,
+        "inputGroup": [],
+        "inputSourceGroups": [],
+        "modePublishTime": [],
+        "name": "ceshi_2",
+        "frequencyType": 2,
+        "channel": 5,
+        "crawlerMode": 5,
+        "tagPenetrateFlag": 1,
+        "inputModeValues": [
+          "https://mp.weixin.qq.com/s?__biz=MzkzNjYxMjY0Nw==&mid=2247493247&idx=5&sn=affe5583151b5172e08c6dddc562409a&chksm=c310f88194bc350bd68d77843279b815e5ab12c760ad5abf8c9fc60a28afac01c767e3fff1ee&scene=126&sessionid=1679649075#rd"
+        ],
+        "planType": 2
+      },
+      "baseInfo": {
+        "token": "79dcb40af1de43b1bd9fe3a731dbaa15",
+        "appType": 9,
+        "platform": "pc",
+        "appVersionCode": 1000,
+        "clientTimestamp": 1,
+        "fid": 1,
+        "loginUid": 1,
+        "pageSource": 1,
+        "requestId": 1,
+        "rid": 1,
+        "uid": 1
+      }
+    }
+}

+ 107 - 0
long-article-recommend-service/src/main/resources/file/长文_抓取计划_根据计划id获取状态.json

@@ -0,0 +1,107 @@
+{
+    "describe": "长文_抓取计划_根据计划id获取状态",
+    "api_url": "http://aigc-api.cybertogether.net/aigc/crawler/plan/list/contentCrawlerPlan",
+    "res": {
+        "code": 0,
+        "msg": "success",
+        "data": {
+            "totalCount": 1,
+            "data": [
+                {
+                    "id": "20240618083435678510787",
+                    "name": "测试",
+                    "frequencyType": 2,
+                    "planTag": null,
+                    "tagPenetrateFlag": 0,
+                    "executeRate": null,
+                    "executeTimeInterval": null,
+                    "addChannel": null,
+                    "taskJson": null,
+                    "outputJson": null,
+                    "status": null,
+                    "channel": 5,
+                    "crawlerMode": 5,
+                    "modeValues": [
+                        "内容ID/https://mp.weixin.qq.com/s?__biz=Mzg4MTk3MDMzMA==&mid=2247495126&idx=2&sn=b1c3b30a6bdcdcb5d41ec5d5a2ab9eff&chksm=cf5f7023f828f9359f452e735c2c1dd9c8c3bcd77d358b6c71450db548bc6dd3e704d7e134d1#rd"
+                    ],
+                    "filters": null,
+                    "crawlerTotalNum": 1,
+                    "lastCrawlerTimestamp": 1718699726645,
+                    "nextCrawlerTimestamp": 1718786126645,
+                    "crawlerLastNum": 1,
+                    "quote": null,
+                    "createTimestamp": 1718699675678,
+                    "createUserName": "xiaohui.young",
+                    "crawlerStatus": 1,
+                    "updateData": {
+                        "planType": 2,
+                        "frequencyType": 2,
+                        "planTag": null,
+                        "tagPenetrateFlag": 0,
+                        "id": "20240618083435678510787",
+                        "name": "测试",
+                        "contentModal": 3,
+                        "channel": 5,
+                        "crawlerMode": 5,
+                        "imageSearchModeValues": [],
+                        "inputModeValues": [
+                            "https://mp.weixin.qq.com/s?__biz=Mzg4MTk3MDMzMA==&mid=2247495126&idx=2&sn=b1c3b30a6bdcdcb5d41ec5d5a2ab9eff&chksm=cf5f7023f828f9359f452e735c2c1dd9c8c3bcd77d358b6c71450db548bc6dd3e704d7e134d1#rd"
+                        ],
+                        "selectModeValues": [],
+                        "modePublishTimeStart": null,
+                        "modePublishTimeEnd": null,
+                        "accountFilters": [],
+                        "filterAccountMatchMode": 1,
+                        "contentFilters": [],
+                        "filterContentMatchMode": 1,
+                        "crawlerComment": 0,
+                        "executeRate": null,
+                        "executeDate": null,
+                        "executeWindowStart": null,
+                        "executeWindowEnd": null,
+                        "executeTimeInterval": null,
+                        "executeNum": null,
+                        "addModal": null,
+                        "addChannel": null,
+                        "fileUpload": null,
+                        "prompt": null,
+                        "acelFlag": null,
+                        "inputGroup": null
+                    },
+                    "errorMsg": null,
+                    "expressionValue": null,
+                    "relPublishAccounts": null
+                }
+            ]
+        }
+    },
+    "data": {
+        "params": {
+            "filterItems": [
+                {
+                    "itemName": "id",
+                    "selectValues": [
+                        "20240618083435678510787"
+                    ]
+                }
+            ],
+            "listFieldFormula": [],
+            "pageNum": 1,
+            "pageSize": 50,
+            "contentModal": 3
+        },
+        "baseInfo": {
+            "token": "79dcb40af1de43b1bd9fe3a731dbaa15",
+            "appType": 9,
+            "platform": "pc",
+            "appVersionCode": 1000,
+            "clientTimestamp": 1,
+            "fid": 1,
+            "loginUid": 1,
+            "pageSource": 1,
+            "requestId": 1,
+            "rid": 1,
+            "uid": 1
+        }
+    }
+}

+ 124 - 0
long-article-recommend-service/src/main/resources/file/长文_生成结果库_根据计划id获取内容.json

@@ -0,0 +1,124 @@
+{
+    "describe": "长文_生成结果库_根据计划id获取内容",
+    "api_url": "http://aigc-api.cybertogether.net/aigc/produce/content/listProduceContent",
+        "res": {
+        "code": 0,
+        "msg": "success",
+        "data": {
+            "totalCount": 13,
+            "data": [
+                {
+                    "id": "20240625085017128585898",
+                    "coverImageUrl": "http://mmbiz.qpic.cn/sz_mmbiz_jpg/yDPAYn5Q12m5pdJhp1gSZNQCib0viaHZe7zUEz35iaeAJ0WBS901SFXdXrWPmnTFSXEoLC6fxNNj2uVVfKicaG9kng/0?from=appmsg",
+                    "imageUrls": [
+                        "http://mmbiz.qpic.cn/sz_mmbiz_jpg/janiabPMf2s6BGHNZgmgJGVb1ywc4icIH9qeEHQjGf3ZxoZM9ML9jXTVtoyibI9tWo96Dia40MKEPjo5Cx307RLu6A/0?from=appmsg",
+                        "http://mmbiz.qpic.cn/mmbiz_jpg/GuzV7vbicpkXTrM2FMy1tN2WlnGY5PEuYN7ibvUicBBBPCkCuASwDoLmGXpCTU5kuYPpVpRMYG3X4qLrkLHibP3fHw/0?from=appmsg",
+                        "http://mmbiz.qpic.cn/mmbiz_jpg/ibJhJfc7Ybm9sgsENqN0iaj3bJOvYIz55wSDY0e1sxUYMjSLwzHvzHWSvG0qbk4701olmUmMQZ7RWricA9b7NiccjA/0?from=appmsg"
+                    ],
+                    "title": "被捡来的儿子考上清华被亲生父母认领那一刻说的话,让养父哭了",
+                    "bodyText": "最重要的财富。无论是养育之恩还是血缘之情,真正的亲情在于无私的付出和深厚的感情,而不是物质的交换。小明的经历让人们重新思考亲情和感恩的意义,感动了无数人。\n\n这种感恩之心和对亲情的珍视,是人生中最宝贵的财富。正是因为有无私的爱和关怀,我们才能在困境中找到前行的力量。小明的故事不仅展示了人性中最美好的部分,也传递出一种正能量,呼吁人们在物欲横流的社会中珍视亲情和感恩之心。这段感人的亲情故事,必将长久地激励着每一个读者。",
+                    "animationUrls": null,
+                    "prePublishContentId": null,
+                    "prePublishContentIdLink": null,
+                    "actionAccountId": null,
+                    "commentDetail": null,
+                    "letterDetail": null,
+                    "receiveId": null,
+                    "receiveIdLink": null,
+                    "receiveContent": null,
+                    "sendAccountId": null,
+                    "sendAccountData": null,
+                    "replyCommentDetail": null,
+                    "replyLetterDetail": null,
+                    "inputSrtTexts": null,
+                    "inputImageUrls": null,
+                    "produceAgainFlag": null,
+                    "produceAgainCount": null,
+                    "produceAgainTimestamp": null,
+                    "compositeVideoUrls": null,
+                    "compositeStatus": null,
+                    "compositeCount": null,
+                    "uploadVideoFlag": null,
+                    "sourceProducePlan": {
+                        "id": "20240625084744349304308",
+                        "name": "【1】【bing_v1】历史复用"
+                    },
+                    "quotePublishPlans": null,
+                    "referContentTitle": "被捡来的儿子考上清华被亲生父母认领那一刻说的话,让养父哭了",
+                    "referContentLink": "http://mp.weixin.qq.com/s?__biz=MzkwODUwODM3Mw==&mid=2247489660&idx=1&sn=33c0f654f784347590b1daad4246b695&chksm=c0c9b5c6f7be3cd0484790164a353524dfb1ca9fd95ad3b34b3c26b5770fb33a1c1b337c7a1e#rd",
+                    "referContentAccountName": "路边闲聊社",
+                    "referContentAccountLink": "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzkwODUwODM3Mw==&scene=124#wechat_redirect",
+                    "referContentChannel": 5,
+                    "referContents": [
+                        {
+                            "groupId": "0",
+                            "groupIndex": 1,
+                            "groupName": "分组0",
+                            "referContentTitle": "被捡来的儿子考上清华被亲生父母认领那一刻说的话,让养父哭了",
+                            "referContentLink": "http://mp.weixin.qq.com/s?__biz=MzkwODUwODM3Mw==&mid=2247489660&idx=1&sn=33c0f654f784347590b1daad4246b695&chksm=c0c9b5c6f7be3cd0484790164a353524dfb1ca9fd95ad3b34b3c26b5770fb33a1c1b337c7a1e#rd",
+                            "referContentAccountName": "路边闲聊社",
+                            "referContentAccountLink": "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzkwODUwODM3Mw==&scene=124#wechat_redirect",
+                            "referContentChannel": 5,
+                            "referContentModal": 3,
+                            "referContentId": 5048535,
+                            "midAdNum": null,
+                            "bottomAdNum": null
+                        }
+                    ],
+                    "produceTimestamp": 1719306484382,
+                    "auditStatus": 0,
+                    "auditAccount": null,
+                    "auditTimestamp": null,
+                    "editModuleTypes": [],
+                    "editAccount": null,
+                    "editTimestamp": null,
+                    "produceStatus": 2,
+                    "errorMsg": null,
+                    "errorDetails": null,
+                    "tagJson": null,
+                    "miniProgram": [],
+                    "expressionValue": null
+                }
+            ]
+        }
+    },
+    "data": {
+        "params": {
+            "filterItems": [
+                {
+                    "itemName": "produceStatus",
+                    "selectValues": [
+                        2
+                    ]
+                },
+                {
+                    "itemName": "sourceProducePlan",
+                    "selectValues": [
+                        "20240625084744349304308"
+                    ]
+                },
+                {
+                    "itemName": "produceTimestamp",
+                    "orderType": "asc"
+                }
+            ],
+            "listFieldFormula": [],
+            "pageNum": 1,
+            "pageSize": 50,
+            "produceModal": 3
+        },
+        "baseInfo": {
+            "token": "79dcb40af1de43b1bd9fe3a731dbaa15",
+            "appType": 9,
+            "platform": "pc",
+            "appVersionCode": 1000,
+            "clientTimestamp": 1,
+            "fid": 1,
+            "loginUid": 1,
+            "pageSource": 1,
+            "requestId": 1,
+            "rid": 1,
+            "uid": 1
+        }
+    }
+}