yangxiaohui hai 1 mes
achega
6943c0548a

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+data
+__pycache__
+*.swp

+ 141 - 0
README.md

@@ -0,0 +1,141 @@
+# 平台搜索工具集
+
+获取各平台搜索结果、推荐词和标签词的Python脚本。
+
+## 使用方法
+
+### 获取工具列表 ✅
+
+```bash
+python script/get_tools_list.py
+```
+
+输出:`data/tools_list/tools_list_{时间戳}.json`
+
+---
+
+### 搜索脚本
+
+#### 1. 通用搜索(Google、Baidu、Bing) ✅
+
+```bash
+# 使用默认平台Google搜索
+python script/search/custom_search.py --keyword "python"
+
+# 指定其他搜索平台
+python script/search/custom_search.py --keyword "python" --platform "baidu"
+```
+
+**参数:**
+- `--keyword`: 搜索关键词(必填)
+- `--platform`: 搜索平台,可选值:google/baidu/bing(可选,默认google)
+- `--results-dir`: 结果保存目录(可选,默认 data/search)
+
+**输出:**`data/search/custom_search/{平台}/{关键词}/{时间戳}.json`
+
+#### 2. 抖音内容搜索 ✅
+
+```bash
+python script/search/douyin_search.py --keyword "美食"
+```
+
+**参数:**
+- `--keyword`: 搜索关键词(必填)
+- `--results-dir`: 结果保存目录(可选,默认 data/search)
+
+**输出:**`data/search/douyin_search/{关键词}/{时间戳}.json`
+
+#### 3. 小红书笔记搜索 ✅
+
+```bash
+# 使用默认参数(综合排序,不限类型)
+python script/search/xiaohongshu_search.py --keyword "旅游"
+
+# 指定筛选条件
+python script/search/xiaohongshu_search.py --keyword "旅游" --content-type "视频" --sort-type "最新"
+```
+
+**参数:**
+- `--keyword`: 搜索关键词(必填)
+- `--content-type`: 内容类型,可选值:不限/视频/图文(可选,默认"不限")
+- `--sort-type`: 排序方式,可选值:综合/最新/最多点赞/最多评论(可选,默认"综合")
+- `--publish-time`: 发布时间,可选值:不限/一天内/一周内/半年内(可选,默认"不限")
+- `--cursor`: 翻页游标(可选,默认为空)
+- `--page`: 页码标识(可选,默认1)
+- `--results-dir`: 结果保存目录(可选,默认 data/search)
+
+**输出:**`data/search/xiaohongshu_search/{关键词}/{时间戳}_page{页码}.json`
+
+#### 4. AI搜索 ✅
+
+```bash
+python script/search/ai_search.py --query "什么是Python"
+```
+
+**参数:**
+- `--query`: 查询内容(必填)
+- `--results-dir`: 结果保存目录(可选,默认 data/search)
+
+**输出:**`data/search/ai_search/{查询内容前20字符}/{时间戳}.json`
+
+---
+
+### 推荐词脚本 ✅
+
+```bash
+# 抖音推荐词(默认关键词:美食)
+python script/search_recommendations/douyin_search_recommendations.py
+
+# B站推荐词(默认关键词:游戏)
+python script/search_recommendations/bilibili_search_recommendations.py
+
+# 小红书推荐词(默认关键词:长沙)
+python script/search_recommendations/xiaohongshu_search_recommendations.py
+
+# 自定义关键词
+python script/search_recommendations/douyin_search_recommendations.py --keyword "旅游"
+```
+
+**参数:**
+- `--keyword`: 搜索关键词(可选,各平台有默认值)
+- `--results-dir`: 结果保存目录(可选,默认 data/search_recommendations)
+
+**输出:**`data/search_recommendations/{平台}/{关键词}/{时间戳}.json`
+
+---
+
+### 标签词脚本
+
+#### 抖音标签词 ✅
+
+```bash
+# 使用默认关键词(旅游)
+python script/search_tagwords/douyin_search_tagword.py
+
+# 自定义关键词
+python script/search_tagwords/douyin_search_tagword.py --keyword "美食"
+```
+
+**参数:**
+- `--keyword`: 搜索关键词(可选,默认"旅游")
+- `--results-dir`: 结果保存目录(可选,默认 data/search_tagwords)
+
+**输出:**`data/search_tagwords/douyin/{关键词}/tagword_{时间戳}.json`
+
+#### 小红书标签词 ❌
+
+```bash
+# 使用默认关键词(护肤)
+python script/search_tagwords/xiaohongshu_search_hashtag.py
+
+# 自定义关键词
+python script/search_tagwords/xiaohongshu_search_hashtag.py --keyword "美妆"
+```
+
+**参数:**
+- `--keyword`: 搜索关键词(可选,默认"护肤")
+- `--results-dir`: 结果保存目录(可选,默认 data/search_tagwords)
+
+**输出:**`data/search_tagwords/xiaohongshu/{关键词}/hashtag_{时间戳}.json`
+
+> ❌ **不可用:** 该接口当前返回500错误,服务端暂时不可用

+ 115 - 0
script/get_tools_list.py

@@ -0,0 +1,115 @@
+#!/usr/bin/env python3
+"""
+获取可用工具列表接口
+从API获取所有可用的工具列表
+"""
+
+import requests
+import json
+import os
+import argparse
+from datetime import datetime
+from typing import Dict, Any
+
+
+class ToolsListFetcher:
+    """工具列表获取API封装类"""
+
+    BASE_URL = "http://47.84.182.56:8001"
+    API_ENDPOINT = "/tools"
+
+    def __init__(self, results_dir: str = None):
+        """
+        初始化API客户端
+
+        Args:
+            results_dir: 结果输出目录,默认为项目根目录下的 data/tools_list 文件夹
+        """
+        self.api_url = f"{self.BASE_URL}{self.API_ENDPOINT}"
+
+        # 设置结果输出目录
+        if results_dir:
+            self.results_base_dir = results_dir
+        else:
+            # 默认使用项目根目录的 data/tools_list 文件夹
+            script_dir = os.path.dirname(os.path.abspath(__file__))
+            project_root = os.path.dirname(script_dir)
+            self.results_base_dir = os.path.join(project_root, "data", "tools_list")
+
+    def get_tools_list(self, timeout: int = 30) -> Dict[str, Any]:
+        """
+        获取工具列表
+
+        Args:
+            timeout: 请求超时时间(秒),默认30秒
+
+        Returns:
+            API响应的JSON数据
+
+        Raises:
+            requests.exceptions.RequestException: 请求失败时抛出异常
+        """
+        try:
+            response = requests.get(
+                self.api_url,
+                timeout=timeout,
+                headers={"Content-Type": "application/json"}
+            )
+            response.raise_for_status()
+            return response.json()
+        except requests.exceptions.RequestException as e:
+            print(f"请求失败: {e}")
+            raise
+
+    def save_result(self, result: Dict[str, Any]) -> str:
+        """
+        保存结果到文件
+        目录结构: results/tools_list_时间戳.json
+
+        Args:
+            result: API返回的结果
+
+        Returns:
+            保存的文件路径
+        """
+        # 创建目录结构
+        os.makedirs(self.results_base_dir, exist_ok=True)
+
+        # 文件名使用时间戳
+        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+        filename = f"tools_list_{timestamp}.json"
+        filepath = os.path.join(self.results_base_dir, filename)
+
+        # 保存结果
+        with open(filepath, 'w', encoding='utf-8') as f:
+            json.dump(result, f, ensure_ascii=False, indent=2)
+
+        return filepath
+
+
+def main():
+    """示例使用"""
+    # 解析命令行参数
+    parser = argparse.ArgumentParser(description='获取可用工具列表接口')
+    parser.add_argument(
+        '--results-dir',
+        type=str,
+        default='data/tools_list',
+        help='结果输出目录 (默认: data/tools_list)'
+    )
+    args = parser.parse_args()
+
+    # 创建API客户端实例
+    client = ToolsListFetcher(results_dir=args.results_dir)
+
+    # 获取工具列表并保存
+    try:
+        result = client.get_tools_list()
+        filepath = client.save_result(result)
+        print(f"Output: {filepath}")
+    except Exception as e:
+        print(f"Error: {e}", file=__import__('sys').stderr)
+
+
+if __name__ == "__main__":
+    main()

+ 136 - 0
script/search/ai_search.py

@@ -0,0 +1,136 @@
+#!/usr/bin/env python3
+"""
+AI搜索工具
+调用AI搜索回答用户问题,返回多模态参考源、总结答案和追问问题
+"""
+
+import requests
+import json
+import os
+import argparse
+from datetime import datetime
+from typing import Dict, Any
+
+
+class AISearch:
+    """AI搜索API封装类"""
+
+    BASE_URL = "http://47.84.182.56:8001"
+    TOOL_NAME = "ai_search"
+
+    def __init__(self, results_dir: str = None):
+        """
+        初始化API客户端
+
+        Args:
+            results_dir: 结果输出目录,默认为项目根目录下的 data/search 文件夹
+        """
+        self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
+
+        # 设置结果输出目录
+        if results_dir:
+            self.results_base_dir = results_dir
+        else:
+            # 默认使用项目根目录的 data/search 文件夹
+            script_dir = os.path.dirname(os.path.abspath(__file__))
+            project_root = os.path.dirname(os.path.dirname(script_dir))
+            self.results_base_dir = os.path.join(project_root, "data", "search")
+
+    def search(self, query: str, timeout: int = 60) -> Dict[str, Any]:
+        """
+        执行AI搜索
+
+        Args:
+            query: 搜索查询内容
+            timeout: 请求超时时间(秒),默认60秒(AI搜索可能需要更长时间)
+
+        Returns:
+            API响应的JSON数据
+            返回数据中:
+            - type=source: 参考源(网页、图片等)
+            - type=answer: 总结答案
+            - type=follow_up: 追问问题
+
+        Raises:
+            requests.exceptions.RequestException: 请求失败时抛出异常
+        """
+        payload = {
+            "query": query
+        }
+
+        try:
+            response = requests.post(
+                self.api_url,
+                json=payload,
+                timeout=timeout,
+                headers={"Content-Type": "application/json"}
+            )
+            response.raise_for_status()
+            return response.json()
+        except requests.exceptions.RequestException as e:
+            print(f"请求失败: {e}")
+            raise
+
+    def save_result(self, query: str, result: Dict[str, Any]) -> str:
+        """
+        保存结果到文件
+        目录结构: results/ai_search/query关键词/时间戳.json
+
+        Args:
+            query: 搜索查询内容
+            result: API返回的结果
+
+        Returns:
+            保存的文件路径
+        """
+        # 从query中提取简短的关键词作为文件夹名(取前20个字符)
+        query_short = query[:20].replace('/', '_').replace('\\', '_')
+
+        # 创建目录结构: results/ai_search/query/
+        result_dir = os.path.join(self.results_base_dir, "ai_search", query_short)
+        os.makedirs(result_dir, exist_ok=True)
+
+        # 文件名使用时间戳
+        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+        filename = f"{timestamp}.json"
+        filepath = os.path.join(result_dir, filename)
+
+        # 保存结果
+        with open(filepath, 'w', encoding='utf-8') as f:
+            json.dump(result, f, ensure_ascii=False, indent=2)
+
+        return filepath
+
+
+def main():
+    """示例使用"""
+    # 解析命令行参数
+    parser = argparse.ArgumentParser(description='AI搜索工具')
+    parser.add_argument(
+        '--results-dir',
+        type=str,
+        default='data/search',
+        help='结果输出目录 (默认: data/search)'
+    )
+    parser.add_argument(
+        '--query',
+        type=str,
+        required=True,
+        help='搜索查询内容 (必填)'
+    )
+    args = parser.parse_args()
+
+    # 创建API客户端实例
+    client = AISearch(results_dir=args.results_dir)
+
+    # 执行搜索并保存
+    try:
+        result = client.search(args.query)
+        filepath = client.save_result(args.query, result)
+        print(f"Output: {filepath}")
+    except Exception as e:
+        print(f"Error: {e}", file=__import__('sys').stderr)
+
+
+if __name__ == "__main__":
+    main()

+ 139 - 0
script/search/custom_search.py

@@ -0,0 +1,139 @@
+#!/usr/bin/env python3
+"""
+通用搜索工具
+支持Google、Baidu、Bing等搜索引擎
+"""
+
+import requests
+import json
+import os
+import argparse
+from datetime import datetime
+from typing import Dict, Any
+
+
+class CustomSearch:
+    """通用搜索API封装类"""
+
+    BASE_URL = "http://47.84.182.56:8001"
+    TOOL_NAME = "custom_search"
+
+    def __init__(self, results_dir: str = None):
+        """
+        初始化API客户端
+
+        Args:
+            results_dir: 结果输出目录,默认为项目根目录下的 data/search 文件夹
+        """
+        self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
+
+        # 设置结果输出目录
+        if results_dir:
+            self.results_base_dir = results_dir
+        else:
+            # 默认使用项目根目录的 data/search 文件夹
+            script_dir = os.path.dirname(os.path.abspath(__file__))
+            project_root = os.path.dirname(os.path.dirname(script_dir))
+            self.results_base_dir = os.path.join(project_root, "data", "search")
+
+    def search(self, keyword: str, platform: str = "google", timeout: int = 30) -> Dict[str, Any]:
+        """
+        执行搜索
+
+        Args:
+            keyword: 搜索关键词
+            platform: 搜索平台,可选值:google, baidu, bing,默认为google
+            timeout: 请求超时时间(秒),默认30秒
+
+        Returns:
+            API响应的JSON数据
+
+        Raises:
+            requests.exceptions.RequestException: 请求失败时抛出异常
+        """
+        payload = {
+            "keyword": keyword,
+            "platform": platform
+        }
+
+        try:
+            response = requests.post(
+                self.api_url,
+                json=payload,
+                timeout=timeout,
+                headers={"Content-Type": "application/json"}
+            )
+            response.raise_for_status()
+            return response.json()
+        except requests.exceptions.RequestException as e:
+            print(f"请求失败: {e}")
+            raise
+
+    def save_result(self, keyword: str, platform: str, result: Dict[str, Any]) -> str:
+        """
+        保存结果到文件
+        目录结构: results/custom_search/平台/关键词/时间戳.json
+
+        Args:
+            keyword: 搜索关键词
+            platform: 搜索平台
+            result: API返回的结果
+
+        Returns:
+            保存的文件路径
+        """
+        # 创建目录结构: results/custom_search/平台/关键词/
+        result_dir = os.path.join(self.results_base_dir, "custom_search", platform, keyword)
+        os.makedirs(result_dir, exist_ok=True)
+
+        # 文件名使用时间戳
+        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+        filename = f"{timestamp}.json"
+        filepath = os.path.join(result_dir, filename)
+
+        # 保存结果
+        with open(filepath, 'w', encoding='utf-8') as f:
+            json.dump(result, f, ensure_ascii=False, indent=2)
+
+        return filepath
+
+
+def main():
+    """示例使用"""
+    # 解析命令行参数
+    parser = argparse.ArgumentParser(description='通用搜索工具')
+    parser.add_argument(
+        '--results-dir',
+        type=str,
+        default='data/search',
+        help='结果输出目录 (默认: data/search)'
+    )
+    parser.add_argument(
+        '--keyword',
+        type=str,
+        required=True,
+        help='搜索关键词 (必填)'
+    )
+    parser.add_argument(
+        '--platform',
+        type=str,
+        default='google',
+        choices=['google', 'baidu', 'bing'],
+        help='搜索平台 (默认: google)'
+    )
+    args = parser.parse_args()
+
+    # 创建API客户端实例
+    client = CustomSearch(results_dir=args.results_dir)
+
+    # 执行搜索并保存
+    try:
+        result = client.search(args.keyword, args.platform)
+        filepath = client.save_result(args.keyword, args.platform, result)
+        print(f"Output: {filepath}")
+    except Exception as e:
+        print(f"Error: {e}", file=__import__('sys').stderr)
+
+
+if __name__ == "__main__":
+    main()

+ 130 - 0
script/search/douyin_search.py

@@ -0,0 +1,130 @@
+#!/usr/bin/env python3
+"""
+抖音内容搜索工具
+根据关键词搜索抖音内容
+"""
+
+import requests
+import json
+import os
+import argparse
+from datetime import datetime
+from typing import Dict, Any
+
+
+class DouyinSearch:
+    """抖音搜索API封装类"""
+
+    BASE_URL = "http://47.84.182.56:8001"
+    TOOL_NAME = "douyin_search_by_keyword"
+    PLATFORM = "douyin"
+
+    def __init__(self, results_dir: str = None):
+        """
+        初始化API客户端
+
+        Args:
+            results_dir: 结果输出目录,默认为项目根目录下的 data/search 文件夹
+        """
+        self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
+
+        # 设置结果输出目录
+        if results_dir:
+            self.results_base_dir = results_dir
+        else:
+            # 默认使用项目根目录的 data/search 文件夹
+            script_dir = os.path.dirname(os.path.abspath(__file__))
+            project_root = os.path.dirname(os.path.dirname(script_dir))
+            self.results_base_dir = os.path.join(project_root, "data", "search")
+
+    def search(self, keyword: str, timeout: int = 30) -> Dict[str, Any]:
+        """
+        搜索抖音内容
+
+        Args:
+            keyword: 搜索关键词
+            timeout: 请求超时时间(秒),默认30秒
+
+        Returns:
+            API响应的JSON数据
+
+        Raises:
+            requests.exceptions.RequestException: 请求失败时抛出异常
+        """
+        payload = {
+            "keyword": keyword
+        }
+
+        try:
+            response = requests.post(
+                self.api_url,
+                json=payload,
+                timeout=timeout,
+                headers={"Content-Type": "application/json"}
+            )
+            response.raise_for_status()
+            return response.json()
+        except requests.exceptions.RequestException as e:
+            print(f"请求失败: {e}")
+            raise
+
+    def save_result(self, keyword: str, result: Dict[str, Any]) -> str:
+        """
+        保存结果到文件
+        目录结构: results/douyin_search/关键词/时间戳.json
+
+        Args:
+            keyword: 搜索关键词
+            result: API返回的结果
+
+        Returns:
+            保存的文件路径
+        """
+        # 创建目录结构: results/douyin_search/关键词/
+        result_dir = os.path.join(self.results_base_dir, "douyin_search", keyword)
+        os.makedirs(result_dir, exist_ok=True)
+
+        # 文件名使用时间戳
+        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+        filename = f"{timestamp}.json"
+        filepath = os.path.join(result_dir, filename)
+
+        # 保存结果
+        with open(filepath, 'w', encoding='utf-8') as f:
+            json.dump(result, f, ensure_ascii=False, indent=2)
+
+        return filepath
+
+
+def main():
+    """示例使用"""
+    # 解析命令行参数
+    parser = argparse.ArgumentParser(description='抖音内容搜索工具')
+    parser.add_argument(
+        '--results-dir',
+        type=str,
+        default='data/search',
+        help='结果输出目录 (默认: data/search)'
+    )
+    parser.add_argument(
+        '--keyword',
+        type=str,
+        required=True,
+        help='搜索关键词 (必填)'
+    )
+    args = parser.parse_args()
+
+    # 创建API客户端实例
+    client = DouyinSearch(results_dir=args.results_dir)
+
+    # 执行搜索并保存
+    try:
+        result = client.search(args.keyword)
+        filepath = client.save_result(args.keyword, result)
+        print(f"Output: {filepath}")
+    except Exception as e:
+        print(f"Error: {e}", file=__import__('sys').stderr)
+
+
+if __name__ == "__main__":
+    main()

+ 186 - 0
script/search/xiaohongshu_search.py

@@ -0,0 +1,186 @@
+#!/usr/bin/env python3
+"""
+小红书笔记搜索工具
+根据关键词搜索小红书笔记,支持多种筛选条件
+"""
+
+import requests
+import json
+import os
+import argparse
+from datetime import datetime
+from typing import Dict, Any
+
+
+class XiaohongshuSearch:
+    """小红书笔记搜索API封装类"""
+
+    BASE_URL = "http://47.84.182.56:8001"
+    TOOL_NAME = "xhs_note_search"
+    PLATFORM = "xiaohongshu"
+
+    def __init__(self, results_dir: str = None):
+        """
+        初始化API客户端
+
+        Args:
+            results_dir: 结果输出目录,默认为项目根目录下的 data/search 文件夹
+        """
+        self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
+
+        # 设置结果输出目录
+        if results_dir:
+            self.results_base_dir = results_dir
+        else:
+            # 默认使用项目根目录的 data/search 文件夹
+            script_dir = os.path.dirname(os.path.abspath(__file__))
+            project_root = os.path.dirname(os.path.dirname(script_dir))
+            self.results_base_dir = os.path.join(project_root, "data", "search")
+
+    def search(
+        self,
+        keyword: str,
+        content_type: str = "不限",
+        sort_type: str = "综合",
+        publish_time: str = "不限",
+        cursor: str = "",
+        timeout: int = 30
+    ) -> Dict[str, Any]:
+        """
+        搜索小红书笔记
+
+        Args:
+            keyword: 搜索关键词
+            content_type: 内容类型,可选值:不限、视频、图文,默认为'不限'
+            sort_type: 排序方式,可选值:综合、最新、最多点赞、最多评论,默认为'综合'
+            publish_time: 发布时间筛选,可选值:不限、一天内、一周内、半年内,默认为'不限'
+            cursor: 翻页游标,第一页默认为空,下一页的游标在上一页的返回值中获取
+            timeout: 请求超时时间(秒),默认30秒
+
+        Returns:
+            API响应的JSON数据
+
+        Raises:
+            requests.exceptions.RequestException: 请求失败时抛出异常
+        """
+        payload = {
+            "keyword": keyword,
+            "content_type": content_type,
+            "sort_type": sort_type,
+            "publish_time": publish_time,
+            "cursor": cursor
+        }
+
+        try:
+            response = requests.post(
+                self.api_url,
+                json=payload,
+                timeout=timeout,
+                headers={"Content-Type": "application/json"}
+            )
+            response.raise_for_status()
+            return response.json()
+        except requests.exceptions.RequestException as e:
+            print(f"请求失败: {e}")
+            raise
+
+    def save_result(self, keyword: str, result: Dict[str, Any], page: int = 1) -> str:
+        """
+        保存结果到文件
+        目录结构: results/xiaohongshu_search/关键词/时间戳_page{页码}.json
+
+        Args:
+            keyword: 搜索关键词
+            result: API返回的结果
+            page: 页码
+
+        Returns:
+            保存的文件路径
+        """
+        # 创建目录结构: results/xiaohongshu_search/关键词/
+        result_dir = os.path.join(self.results_base_dir, "xiaohongshu_search", keyword)
+        os.makedirs(result_dir, exist_ok=True)
+
+        # 文件名使用时间戳和页码
+        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+        filename = f"{timestamp}_page{page}.json"
+        filepath = os.path.join(result_dir, filename)
+
+        # 保存结果
+        with open(filepath, 'w', encoding='utf-8') as f:
+            json.dump(result, f, ensure_ascii=False, indent=2)
+
+        return filepath
+
+
+def main():
+    """示例使用"""
+    # 解析命令行参数
+    parser = argparse.ArgumentParser(description='小红书笔记搜索工具')
+    parser.add_argument(
+        '--results-dir',
+        type=str,
+        default='data/search',
+        help='结果输出目录 (默认: data/search)'
+    )
+    parser.add_argument(
+        '--keyword',
+        type=str,
+        required=True,
+        help='搜索关键词 (必填)'
+    )
+    parser.add_argument(
+        '--content-type',
+        type=str,
+        default='不限',
+        choices=['不限', '视频', '图文'],
+        help='内容类型 (默认: 不限)'
+    )
+    parser.add_argument(
+        '--sort-type',
+        type=str,
+        default='综合',
+        choices=['综合', '最新', '最多点赞', '最多评论'],
+        help='排序方式 (默认: 综合)'
+    )
+    parser.add_argument(
+        '--publish-time',
+        type=str,
+        default='不限',
+        choices=['不限', '一天内', '一周内', '半年内'],
+        help='发布时间筛选 (默认: 不限)'
+    )
+    parser.add_argument(
+        '--cursor',
+        type=str,
+        default='',
+        help='翻页游标 (默认为空,即第一页)'
+    )
+    parser.add_argument(
+        '--page',
+        type=int,
+        default=1,
+        help='页码标识,用于保存文件名 (默认: 1)'
+    )
+    args = parser.parse_args()
+
+    # 创建API客户端实例
+    client = XiaohongshuSearch(results_dir=args.results_dir)
+
+    # 执行搜索并保存
+    try:
+        result = client.search(
+            args.keyword,
+            args.content_type,
+            args.sort_type,
+            args.publish_time,
+            args.cursor
+        )
+        filepath = client.save_result(args.keyword, result, args.page)
+        print(f"Output: {filepath}")
+    except Exception as e:
+        print(f"Error: {e}", file=__import__('sys').stderr)
+
+
+if __name__ == "__main__":
+    main()

+ 130 - 0
script/search_recommendations/bilibili_search_recommendations.py

@@ -0,0 +1,130 @@
+#!/usr/bin/env python3
+"""
+B站搜索推荐词接口
+获取B站平台搜索框中的推荐词
+"""
+
+import requests
+import json
+import os
+import argparse
+from datetime import datetime
+from typing import Dict, Any
+
+
+class BilibiliSearchRecommendations:
+    """B站搜索推荐词API封装类"""
+
+    BASE_URL = "http://47.84.182.56:8001"
+    TOOL_NAME = "Bilibili_Search_Recommendations"
+    PLATFORM = "bilibili"  # 平台名称
+
+    def __init__(self, results_dir: str = None):
+        """
+        初始化API客户端
+
+        Args:
+            results_dir: 结果输出目录,默认为项目根目录下的 data/search_recommendations 文件夹
+        """
+        self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
+
+        # 设置结果输出目录
+        if results_dir:
+            self.results_base_dir = results_dir
+        else:
+            # 默认使用项目根目录的 data/search_recommendations 文件夹
+            script_dir = os.path.dirname(os.path.abspath(__file__))
+            project_root = os.path.dirname(os.path.dirname(script_dir))
+            self.results_base_dir = os.path.join(project_root, "data", "search_recommendations")
+
+    def get_recommendations(self, keyword: str, timeout: int = 30) -> Dict[str, Any]:
+        """
+        获取B站搜索推荐词
+
+        Args:
+            keyword: 搜索关键词
+            timeout: 请求超时时间(秒),默认30秒
+
+        Returns:
+            API响应的JSON数据
+
+        Raises:
+            requests.exceptions.RequestException: 请求失败时抛出异常
+        """
+        payload = {
+            "keyword": keyword
+        }
+
+        try:
+            response = requests.post(
+                self.api_url,
+                json=payload,
+                timeout=timeout,
+                headers={"Content-Type": "application/json"}
+            )
+            response.raise_for_status()
+            return response.json()
+        except requests.exceptions.RequestException as e:
+            print(f"请求失败: {e}")
+            raise
+
+    def save_result(self, keyword: str, result: Dict[str, Any]) -> str:
+        """
+        保存结果到文件
+        目录结构: results/平台/关键词/时间戳.json
+
+        Args:
+            keyword: 搜索关键词
+            result: API返回的结果
+
+        Returns:
+            保存的文件路径
+        """
+        # 创建目录结构: results/平台/关键词/
+        result_dir = os.path.join(self.results_base_dir, self.PLATFORM, keyword)
+        os.makedirs(result_dir, exist_ok=True)
+
+        # 文件名使用时间戳
+        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+        filename = f"{timestamp}.json"
+        filepath = os.path.join(result_dir, filename)
+
+        # 保存结果
+        with open(filepath, 'w', encoding='utf-8') as f:
+            json.dump(result, f, ensure_ascii=False, indent=2)
+
+        return filepath
+
+
+def main():
+    """示例使用"""
+    # 解析命令行参数
+    parser = argparse.ArgumentParser(description='B站搜索推荐词接口')
+    parser.add_argument(
+        '--results-dir',
+        type=str,
+        default='data/search_recommendations',
+        help='结果输出目录 (默认: data/search_recommendations)'
+    )
+    parser.add_argument(
+        '--keyword',
+        type=str,
+        default='游戏',
+        help='搜索关键词 (默认: 游戏)'
+    )
+    args = parser.parse_args()
+
+    # 创建API客户端实例
+    client = BilibiliSearchRecommendations(results_dir=args.results_dir)
+
+    # 获取推荐词并保存
+    try:
+        result = client.get_recommendations(args.keyword)
+        filepath = client.save_result(args.keyword, result)
+        print(f"Output: {filepath}")
+    except Exception as e:
+        print(f"Error: {e}", file=__import__('sys').stderr)
+
+
+if __name__ == "__main__":
+    main()

+ 130 - 0
script/search_recommendations/douyin_search_recommendations.py

@@ -0,0 +1,130 @@
+#!/usr/bin/env python3
+"""
+抖音搜索推荐词接口
+获取抖音平台搜索框中的推荐词
+"""
+
+import requests
+import json
+import os
+import argparse
+from datetime import datetime
+from typing import Dict, Any
+
+
+class DouyinSearchRecommendations:
+    """抖音搜索推荐词API封装类"""
+
+    BASE_URL = "http://47.84.182.56:8001"
+    TOOL_NAME = "Douyin_SearchRecommendations"
+    PLATFORM = "douyin"  # 平台名称
+
+    def __init__(self, results_dir: str = None):
+        """
+        初始化API客户端
+
+        Args:
+            results_dir: 结果输出目录,默认为项目根目录下的 data/search_recommendations 文件夹
+        """
+        self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
+
+        # 设置结果输出目录
+        if results_dir:
+            self.results_base_dir = results_dir
+        else:
+            # 默认使用项目根目录的 data/search_recommendations 文件夹
+            script_dir = os.path.dirname(os.path.abspath(__file__))
+            project_root = os.path.dirname(os.path.dirname(script_dir))
+            self.results_base_dir = os.path.join(project_root, "data", "search_recommendations")
+
+    def get_recommendations(self, keyword: str, timeout: int = 30) -> Dict[str, Any]:
+        """
+        获取抖音搜索推荐词
+
+        Args:
+            keyword: 搜索关键词
+            timeout: 请求超时时间(秒),默认30秒
+
+        Returns:
+            API响应的JSON数据
+
+        Raises:
+            requests.exceptions.RequestException: 请求失败时抛出异常
+        """
+        payload = {
+            "keyword": keyword
+        }
+
+        try:
+            response = requests.post(
+                self.api_url,
+                json=payload,
+                timeout=timeout,
+                headers={"Content-Type": "application/json"}
+            )
+            response.raise_for_status()
+            return response.json()
+        except requests.exceptions.RequestException as e:
+            print(f"请求失败: {e}")
+            raise
+
+    def save_result(self, keyword: str, result: Dict[str, Any]) -> str:
+        """
+        保存结果到文件
+        目录结构: results/平台/关键词/时间戳.json
+
+        Args:
+            keyword: 搜索关键词
+            result: API返回的结果
+
+        Returns:
+            保存的文件路径
+        """
+        # 创建目录结构: results/平台/关键词/
+        result_dir = os.path.join(self.results_base_dir, self.PLATFORM, keyword)
+        os.makedirs(result_dir, exist_ok=True)
+
+        # 文件名使用时间戳
+        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+        filename = f"{timestamp}.json"
+        filepath = os.path.join(result_dir, filename)
+
+        # 保存结果
+        with open(filepath, 'w', encoding='utf-8') as f:
+            json.dump(result, f, ensure_ascii=False, indent=2)
+
+        return filepath
+
+
+def main():
+    """示例使用"""
+    # 解析命令行参数
+    parser = argparse.ArgumentParser(description='抖音搜索推荐词接口')
+    parser.add_argument(
+        '--results-dir',
+        type=str,
+        default='data/search_recommendations',
+        help='结果输出目录 (默认: data/search_recommendations)'
+    )
+    parser.add_argument(
+        '--keyword',
+        type=str,
+        default='美食',
+        help='搜索关键词 (默认: 美食)'
+    )
+    args = parser.parse_args()
+
+    # 创建API客户端实例
+    client = DouyinSearchRecommendations(results_dir=args.results_dir)
+
+    # 获取推荐词并保存
+    try:
+        result = client.get_recommendations(args.keyword)
+        filepath = client.save_result(args.keyword, result)
+        print(f"Output: {filepath}")
+    except Exception as e:
+        print(f"Error: {e}", file=__import__('sys').stderr)
+
+
+if __name__ == "__main__":
+    main()

+ 130 - 0
script/search_recommendations/xiaohongshu_search_recommendations.py

@@ -0,0 +1,130 @@
+#!/usr/bin/env python3
+"""
+小红书搜索推荐词接口
+获取小红书平台搜索框中的推荐词
+"""
+
+import requests
+import json
+import os
+import argparse
+from datetime import datetime
+from typing import Dict, Any
+
+
+class XiaohongshuSearchRecommendations:
+    """小红书搜索推荐词API封装类"""
+
+    BASE_URL = "http://47.84.182.56:8001"
+    TOOL_NAME = "Xiaohongshu_Search_Recommendations"
+    PLATFORM = "xiaohongshu"  # 平台名称
+
+    def __init__(self, results_dir: str = None):
+        """
+        初始化API客户端
+
+        Args:
+            results_dir: 结果输出目录,默认为脚本所在目录下的 results 文件夹
+        """
+        self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
+
+        # 设置结果输出目录
+        if results_dir:
+            self.results_base_dir = results_dir
+        else:
+            # 默认使用项目根目录的 data/search_recommendations 文件夹
+            script_dir = os.path.dirname(os.path.abspath(__file__))
+            project_root = os.path.dirname(os.path.dirname(script_dir))
+            self.results_base_dir = os.path.join(project_root, "data", "search_recommendations")
+
+    def get_recommendations(self, keyword: str, timeout: int = 30) -> Dict[str, Any]:
+        """
+        获取小红书搜索推荐词
+
+        Args:
+            keyword: 搜索关键词,例如:'长沙'、'美妆'等
+            timeout: 请求超时时间(秒),默认30秒
+
+        Returns:
+            API响应的JSON数据
+
+        Raises:
+            requests.exceptions.RequestException: 请求失败时抛出异常
+        """
+        payload = {
+            "keyword": keyword
+        }
+
+        try:
+            response = requests.post(
+                self.api_url,
+                json=payload,
+                timeout=timeout,
+                headers={"Content-Type": "application/json"}
+            )
+            response.raise_for_status()
+            return response.json()
+        except requests.exceptions.RequestException as e:
+            print(f"请求失败: {e}")
+            raise
+
+    def save_result(self, keyword: str, result: Dict[str, Any]) -> str:
+        """
+        保存结果到文件
+        目录结构: results/平台/关键词/时间戳.json
+
+        Args:
+            keyword: 搜索关键词
+            result: API返回的结果
+
+        Returns:
+            保存的文件路径
+        """
+        # 创建目录结构: results/平台/关键词/
+        result_dir = os.path.join(self.results_base_dir, self.PLATFORM, keyword)
+        os.makedirs(result_dir, exist_ok=True)
+
+        # 文件名使用时间戳
+        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+        filename = f"{timestamp}.json"
+        filepath = os.path.join(result_dir, filename)
+
+        # 保存结果
+        with open(filepath, 'w', encoding='utf-8') as f:
+            json.dump(result, f, ensure_ascii=False, indent=2)
+
+        return filepath
+
+
+def main():
+    """示例使用"""
+    # 解析命令行参数
+    parser = argparse.ArgumentParser(description='小红书搜索推荐词接口')
+    parser.add_argument(
+        '--results-dir',
+        type=str,
+        default='data/search_recommendations',
+        help='结果输出目录 (默认: data/search_recommendations)'
+    )
+    parser.add_argument(
+        '--keyword',
+        type=str,
+        default='长沙',
+        help='搜索关键词 (默认: 长沙)'
+    )
+    args = parser.parse_args()
+
+    # 创建API客户端实例
+    client = XiaohongshuSearchRecommendations(results_dir=args.results_dir)
+
+    # 获取推荐词并保存
+    try:
+        result = client.get_recommendations(args.keyword)
+        filepath = client.save_result(args.keyword, result)
+        print(f"Output: {filepath}")
+    except Exception as e:
+        print(f"Error: {e}", file=__import__('sys').stderr)
+
+
+if __name__ == "__main__":
+    main()

+ 130 - 0
script/search_tagwords/douyin_search_tagword.py

@@ -0,0 +1,130 @@
+#!/usr/bin/env python3
+"""
+抖音搜索标签词接口
+获取抖音平台搜索结果中的标签词
+"""
+
+import requests
+import json
+import os
+import argparse
+from datetime import datetime
+from typing import Dict, Any
+
+
+class DouyinSearchTagWord:
+    """抖音搜索标签词API封装类"""
+
+    BASE_URL = "http://47.84.182.56:8001"
+    TOOL_NAME = "Douyin_Search_TagWord"
+    PLATFORM = "douyin"  # 平台名称
+
+    def __init__(self, results_dir: str = None):
+        """
+        初始化API客户端
+
+        Args:
+            results_dir: 结果输出目录,默认为脚本所在目录下的 results 文件夹
+        """
+        self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
+
+        # 设置结果输出目录
+        if results_dir:
+            self.results_base_dir = results_dir
+        else:
+            # 默认使用项目根目录的 data/search_tagwords 文件夹
+            script_dir = os.path.dirname(os.path.abspath(__file__))
+            project_root = os.path.dirname(os.path.dirname(script_dir))
+            self.results_base_dir = os.path.join(project_root, "data", "search_tagwords")
+
+    def get_tagwords(self, keyword: str, timeout: int = 30) -> Dict[str, Any]:
+        """
+        获取抖音搜索标签词
+
+        Args:
+            keyword: 搜索关键词
+            timeout: 请求超时时间(秒),默认30秒
+
+        Returns:
+            API响应的JSON数据
+
+        Raises:
+            requests.exceptions.RequestException: 请求失败时抛出异常
+        """
+        payload = {
+            "keyword": keyword
+        }
+
+        try:
+            response = requests.post(
+                self.api_url,
+                json=payload,
+                timeout=timeout,
+                headers={"Content-Type": "application/json"}
+            )
+            response.raise_for_status()
+            return response.json()
+        except requests.exceptions.RequestException as e:
+            print(f"请求失败: {e}")
+            raise
+
+    def save_result(self, keyword: str, result: Dict[str, Any]) -> str:
+        """
+        保存结果到文件
+        目录结构: results/平台/关键词/tagword_时间戳.json
+
+        Args:
+            keyword: 搜索关键词
+            result: API返回的结果
+
+        Returns:
+            保存的文件路径
+        """
+        # 创建目录结构: results/平台/关键词/
+        result_dir = os.path.join(self.results_base_dir, self.PLATFORM, keyword)
+        os.makedirs(result_dir, exist_ok=True)
+
+        # 文件名使用时间戳,添加tagword标识
+        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+        filename = f"tagword_{timestamp}.json"
+        filepath = os.path.join(result_dir, filename)
+
+        # 保存结果
+        with open(filepath, 'w', encoding='utf-8') as f:
+            json.dump(result, f, ensure_ascii=False, indent=2)
+
+        return filepath
+
+
+def main():
+    """示例使用"""
+    # 解析命令行参数
+    parser = argparse.ArgumentParser(description='抖音搜索标签词接口')
+    parser.add_argument(
+        '--results-dir',
+        type=str,
+        default='data/search_tagwords',
+        help='结果输出目录 (默认: data/search_tagwords)'
+    )
+    parser.add_argument(
+        '--keyword',
+        type=str,
+        default='旅游',
+        help='搜索关键词 (默认: 旅游)'
+    )
+    args = parser.parse_args()
+
+    # 创建API客户端实例
+    client = DouyinSearchTagWord(results_dir=args.results_dir)
+
+    # 获取标签词并保存
+    try:
+        result = client.get_tagwords(args.keyword)
+        filepath = client.save_result(args.keyword, result)
+        print(f"Output: {filepath}")
+    except Exception as e:
+        print(f"Error: {e}", file=__import__('sys').stderr)
+
+
+if __name__ == "__main__":
+    main()

+ 141 - 0
script/search_tagwords/xiaohongshu_search_hashtag.py

@@ -0,0 +1,141 @@
+#!/usr/bin/env python3
+"""
+小红书搜索标签词接口
+获取小红书平台搜索结果中的标签词
+注意:此接口的call_type为browser_auto_operate,可能需要更长的响应时间
+"""
+
+import requests
+import json
+import os
+import argparse
+from datetime import datetime
+from typing import Dict, Any
+
+
+class XiaohongshuSearchHashtag:
+    """小红书搜索标签词API封装类"""
+
+    BASE_URL = "http://47.84.182.56:8001"
+    TOOL_NAME = "xiaohongshu_search_hashtag"
+    PLATFORM = "xiaohongshu"  # 平台名称
+
+    def __init__(self, results_dir: str = None):
+        """
+        初始化API客户端
+
+        Args:
+            results_dir: 结果输出目录,默认为脚本所在目录下的 results 文件夹
+        """
+        self.api_url = f"{self.BASE_URL}/tools/call/{self.TOOL_NAME}"
+
+        # 设置结果输出目录
+        if results_dir:
+            self.results_base_dir = results_dir
+        else:
+            # 默认使用项目根目录的 data/search_tagwords 文件夹
+            script_dir = os.path.dirname(os.path.abspath(__file__))
+            project_root = os.path.dirname(os.path.dirname(script_dir))
+            self.results_base_dir = os.path.join(project_root, "data", "search_tagwords")
+
+    def get_hashtags(self, prompt: str, timeout: int = 60) -> Dict[str, Any]:
+        """
+        获取小红书搜索标签词
+
+        注意:此接口使用browser_auto_operate方式调用,需要提供完整的prompt描述
+
+        Args:
+            prompt: 提示词prompt,包含完整的输入信息
+                    例如:'搜索关键词"护肤",获取相关标签词'
+            timeout: 请求超时时间(秒),默认60秒(浏览器自动化可能需要更长时间)
+
+        Returns:
+            API响应的JSON数据
+
+        Raises:
+            requests.exceptions.RequestException: 请求失败时抛出异常
+        """
+        payload = {
+            "prompt": prompt
+        }
+
+        try:
+            response = requests.post(
+                self.api_url,
+                json=payload,
+                timeout=timeout,
+                headers={"Content-Type": "application/json"}
+            )
+            response.raise_for_status()
+            return response.json()
+        except requests.exceptions.RequestException as e:
+            print(f"请求失败: {e}")
+            raise
+
+    def save_result(self, prompt: str, result: Dict[str, Any]) -> str:
+        """
+        保存结果到文件
+        目录结构: results/平台/关键词/hashtag_时间戳.json
+
+        Args:
+            prompt: 提示词(用于提取关键词)
+            result: API返回的结果
+
+        Returns:
+            保存的文件路径
+        """
+        # 从prompt中提取关键词
+        keyword = prompt.replace('"', '').replace("'", '').replace('搜索关键词', '').replace(',获取搜索结果中的标签词', '').strip()
+        if not keyword:
+            keyword = "unknown"
+
+        # 创建目录结构: results/平台/关键词/
+        result_dir = os.path.join(self.results_base_dir, self.PLATFORM, keyword)
+        os.makedirs(result_dir, exist_ok=True)
+
+        # 文件名使用时间戳,添加hashtag标识
+        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+        filename = f"hashtag_{timestamp}.json"
+        filepath = os.path.join(result_dir, filename)
+
+        # 保存结果
+        with open(filepath, 'w', encoding='utf-8') as f:
+            json.dump(result, f, ensure_ascii=False, indent=2)
+
+        return filepath
+
+
+def main():
+    """示例使用"""
+    # 解析命令行参数
+    parser = argparse.ArgumentParser(description='小红书搜索标签词接口')
+    parser.add_argument(
+        '--results-dir',
+        type=str,
+        default='data/search_tagwords',
+        help='结果输出目录 (默认: data/search_tagwords)'
+    )
+    parser.add_argument(
+        '--keyword',
+        type=str,
+        default='护肤',
+        help='搜索关键词 (默认: 护肤)'
+    )
+    args = parser.parse_args()
+
+    # 创建API客户端实例
+    client = XiaohongshuSearchHashtag(results_dir=args.results_dir)
+
+    # 获取标签词并保存
+    try:
+        # 注意:此接口需要提供完整的prompt描述
+        prompt = f'搜索关键词"{args.keyword}",获取搜索结果中的标签词'
+        result = client.get_hashtags(prompt)
+        filepath = client.save_result(prompt, result)
+        print(f"Output: {filepath}")
+    except Exception as e:
+        print(f"Error: {e}", file=__import__('sys').stderr)
+
+
+if __name__ == "__main__":
+    main()