Parcourir la source

feat:添加根据抖音视频IDs爬取计划的逻辑

zhaohaipeng il y a 1 jour
Parent
commit
237ad4f4f6
1 fichiers modifiés avec 68 ajouts et 13 suppressions
  1. 68 13
      examples/content_finder/tools/aigc_platform_api.py

+ 68 - 13
examples/content_finder/tools/aigc_platform_api.py

@@ -53,7 +53,7 @@ async def create_crawler_plan_by_douyin_account_id(
 
     # 验证 account_id 格式
     if not account_id or not isinstance(account_id, str):
-        logger.error("create_crawler_plan_by_douyin_account_id invalid account_id", extra={"account_id": account_id})
+        logger.error(f"create_crawler_plan_by_douyin_account_id invalid account_id: {account_id}")
         return ToolResult(
             title="根据抖音账号ID创建爬取计划失败",
             output="",
@@ -61,7 +61,7 @@ async def create_crawler_plan_by_douyin_account_id(
         )
 
     if not account_id.startswith("MS4wLjABAAAA"):
-        logger.error("create_crawler_plan_by_douyin_account_id invalid sec_uid format", extra={"account_id": account_id})
+        logger.error(f"create_crawler_plan_by_douyin_account_id invalid sec_uid format account_id:{account_id}")
         return ToolResult(
             title="根据抖音账号ID创建爬取计划失败",
             output="",
@@ -172,29 +172,43 @@ async def create_crawler_plan_by_douyin_content_id(
         produce_plan_ids: List[str] = []
 ) -> ToolResult:
     """
-    根据抖音内容ID创建爬取计划
+    根据抖音视频ID创建爬取计划
     Args:
         content_ids: 抖音内容ID列表
-        produce_plan_ids: 要绑定的生成计划列表
+        produce_plan_ids: 爬取计划要绑定的生成计划ID,默认为空列表
     Returns:
-        ToolResult: 包含以下内容
-            - output: 创建的爬取计划ID
+             Returns:
+         ToolResult: 包含以下内容
+             - output: 文本格式的爬取计划创建结果摘要
+             - metadata.result: 结构化的爬取计划创建结果
+                - crawler_info: 爬取计划信息
+                    - crawler_plan_id: 创建的爬取计划ID
+                    - crawler_plan_name: 创建的爬取计划名称
+                    - content_ids: 抖音视频ID列表
+                - produce_plan_infos: 绑定的生成计划信息
+                    - produce_plan_id: 生成计划ID
+                    - produce_plan_name: 生成计划名称
+                    - is_success: 是否成功, true表示绑定成功,false表示绑定失败
+                    - msg: 绑定失败时为错误信息,绑定成功则为“成功”
+    Note:
+        - 建议从 metadata.result 获取结构化数据,而非解析 output 文本
     """
     if not content_ids or not isinstance(content_ids, list):
-        logger.error("create_crawler_plan_by_douyin_content_id invalid content_ids", extra={"content_ids": content_ids})
+        logger.error(f"create_crawler_plan_by_douyin_content_id invalid content_ids. content_ids: {content_ids}")
         return ToolResult(
             title="根据抖音内容ID创建爬取计划失败",
             output="",
             error="content_ids 参数无效: content_ids必须是列表"
         )
     if len(content_ids) > 100:
-        logger.error("create_crawler_plan_by_douyin_content_id invalid content_ids length", extra={"content_ids": content_ids})
+        logger.error(f"create_crawler_plan_by_douyin_content_id invalid content_ids length. content_ids.length: {len(content_ids)}")
         return ToolResult(
             title="根据抖音内容ID创建爬取计划失败",
             output="",
             error=f"content_ids 长度异常: 期望1~100, 实际{len(content_ids)}"
         )
     dt = datetime.now().strftime("%Y%m%d%h%M%s")
+    crawler_plan_name = f"【内容寻找Agent自动创建】抖音视频直接抓取-{dt}-抖音"
     params = {
         "channel": 2,
         "contentModal": 4,
@@ -204,7 +218,7 @@ async def create_crawler_plan_by_douyin_content_id(
         "filterContentMatchMode": 2,
         "frequencyType": 2,
         "inputModeValues": content_ids,
-        "name": f"【内容寻找Agent自动创建】抖音视频直接抓取-{dt}-抖音",
+        "name": crawler_plan_name,
         "planType": 2,
         "searchModeValues": [],
         "srtExtractFlag": 1,
@@ -213,6 +227,8 @@ async def create_crawler_plan_by_douyin_content_id(
     }
 
     try:
+        summary_lines = [f"抖音视频爬取计划"]
+
         response_json = post(CRAWLER_PLAN_CREATE_URL, params)
         if response_json.get("code") != 0:
             return ToolResult(
@@ -222,13 +238,52 @@ async def create_crawler_plan_by_douyin_content_id(
             )
 
         crawler_plan_id = response_json.get("data", {}).get("id", "")
+        summary_lines.append(f"爬取计划名称: {crawler_plan_name}")
+        summary_lines.append(f"    抖音视频IDs: {','.join(content_ids)}")
+        summary_lines.append(f"    爬取计划ID: {crawler_plan_id}")
+        produce_plan_infos: List[Dict[str, str]] = []
+        if produce_plan_ids:
+            input_source_info = {
+                "contentType": 1,
+                "inputSourceType": 2,
+                "inputSourceValue": crawler_plan_id,
+                "inputSourceLabel": f"原始帖子-视频-抖音-内容添加计划-{crawler_plan_name}",
+                "inputSourceModal": 4,
+                "inputSourceChannel": 2
+            }
+            produce_plan_infos, msg = crawler_plan_bind_produce_plan(input_source_info, produce_plan_ids)
+            if produce_plan_infos:
+                for produce_plan_info in produce_plan_infos:
+                    summary_lines.append("    绑定的生成计划列表: ")
+                    summary_lines.append(f"        生成计划名称: {produce_plan_info.get('produce_plan_name', '')}")
+                    summary_lines.append(f"            生成计划ID: {produce_plan_info.get('produce_plan_id', '')}")
+                    summary_lines.append(f"            绑定结果: {"绑定成功" if not produce_plan_info.get("msg") else "绑定失败"}")
+                    summary_lines.append(f"            信息: {produce_plan_info.get('msg', '成功')}")
+
         return ToolResult(
             title="根据抖音内容ID创建爬取计划",
-            output=crawler_plan_id,
+            output="\n".join(summary_lines),
+            metadata={
+                "result": {
+                    "crawler_info": {
+                        "crawler_plan_id": crawler_plan_id,
+                        "crawler_plan_name": crawler_plan_name,
+                    },
+                    "produce_plan_infos": [
+                        {
+                            "produce_plan_id": produce_plan_info.get("produce_plan_id", ""),
+                            "produce_plan_name": produce_plan_info.get("produce_plan_name", ""),
+                            "is_success": "绑定成功" if not produce_plan_info.get("msg") else "绑定失败",
+                            "msg": produce_plan_info.get("msg", "成功"),
+                        }
+                        for produce_plan_info in produce_plan_infos
+                    ]
+                }
+            },
             long_term_memory="Create crawler plan by DouYin Content IDs",
         )
     except Exception as e:
-        logger.error(e, extra={"content_ids": content_ids})
+        logger.error(f"create douyin content crawler plan error. content_ids: {content_ids}, error: {str(e)}")
         return ToolResult(
             title="根据抖音内容ID创建爬取计划失败",
             output="",
@@ -285,7 +340,7 @@ def crawler_plan_bind_produce_plan(
 
         return result, ""
     except Exception as e:
-        logger.error(e, extra={"input_source_info": input_source_info})
+        logger.error(f"crawler_plan_bind_produce_plan error. input_source_info: {json.dumps(input_source_info)}, produce_plan_ids: {produce_plan_ids}, error: {str(e)},")
         return None, str(e)
 
 
@@ -306,7 +361,7 @@ def find_produce_plan_info_by_id(
 
         return response_json.get("data", {}), ""
     except Exception as e:
-        logger.error(e, extra={"produce_plan_id": produce_plan_id})
+        logger.error(f"find_produce_plan_info_by_id error. produce_plan_id: {produce_plan_id}, error: {str(e)},")
         return None, str(e)