Skill: zzhimin/product-opportunity-analyzer (version 1.0.0)

--- name: product-opportunity-analyzer description: 从电商评论中发掘产品机会。自动抓取商品1-3星评论，使用Map-Reduce策略提取痛点，生成产品洞察报告。当用户发送亚马逊商品链接时触发此技能。 --- # 产品机会分析 Skill ## 触发条件 当用户发送亚马逊商品链接（URL）时自动触发。 ## 工作流程 ### Step 1: 获取评论数据 1. 调用 [REDACTED_SECRET] 工具获取评论 - 参数：`url` 使用 `encodeURIComponent("<商品URL>")` 编码 - 参数：`num_of_reviews` 设置为 30（每批数量） - 筛选1-3星评论（通过工具参数或后处理过滤） 2. 使用 Map-Reduce 策略分批提取，每次30条，直到获取所有评论 3. 保存原始评论数据 ### Step 2: 痛点提取（Map阶段） 将评论数据分批处理，每批30条，使用以下 Prompt 提取痛点： ```markdown # Role 你是一个电商评论数据标注员。 # Task 阅读以下亚马逊1-3星评论，提取出与【产品本身】相关的痛点和机会。 # Rules 1. 忽略物流、包装、客服问题。 2. 只提取真实存在的缺陷或明确的需求。 3. 必须严格按照JSON数组格式输出，不要输出任何解释性废话。 # Output Format [ { "tag": "痛点/机会/预期偏差", "module": "如：电池/材质/安装/尺寸", "point": "简练概括问题（15字以内）", "quote": "截取评论中最核心的一句原话" } ] # Input Data [评论内容] ``` ### Step 3: 汇总分析（Reduce阶段） 将所有提取的痛点数据合并，使用以下 Prompt 进行宏观汇总： ```markdown # Role 你是一位拥有10年经验的资深亚马逊产品经理兼竞品分析专家。 # Task 我已经让助手从上千条1-3星评论中提取了结构化的痛点数据。以下是提取出的JSON数组。请你基于这些精炼的数据，输出一份具备高落地性的《产品痛点与机会洞察报告》。 # Analysis Dimensions(分析维度) 在阅读评论时，请用以下几个维度进行过滤和分类： 1. 产品改造点： * 材质与做工：异味、掉漆、易碎、手感差等。 * 功能缺陷：无法正常工作、按键失灵、效率低下等。 * 设计缺陷：反人类设计、不符合人体工学、安装困难等。 * 耐用性：用几次就坏、电池衰减快等。 2. 产品机会点： * 痛点延伸：客户为了解决该产品的问题，不得不搭配其他东西一起用（发现互补品机会）。 * 场景错位：客户把产品用在了意想不到的场景，但现有产品不支持（发现细分场景机会）。 * 缺失功能："要是它能具备XX功能就好了"、"我以为它可以XX"（发现迭代机会）。 3. 预期管理偏差： * Listing误导：买家以为是A，收到发现是B（属于优化详情页的机会，而非改产品）。 # Constraints & Rules (规则与约束) * 禁止关注非产品因素：忽略所有关于FBA物流延迟、包装破损（除非影响产品本身）、客服态度的吐槽。 * 基于事实，拒绝脑补：每一个洞察都必须在输出时附带原评论的缩写或原话作为证据支撑。 * 优先级排序：按"出现频率"和"严重程度（如导致产品完全无法使用）"对问题进行排序，高频+致命问题排最前。 # Output Format 请严格按照以下Markdown格式输出报告： ## 🚨 一、 核心改造点（必须修复的痛点） 优先级 | 痛点模块 | 痛点描述 | 原始证据（引用原话） | 改造建议 --- | --- | --- | --- | --- P0 (高频/致命) | 例如：电池 | 续航虚标，实际只能用半小时 | "买来除草，用了20分钟就没电了" | 更换大容量电芯，或在Listing写明真实续航 P1 | … | … | … | … ## 💡 二、 隐藏机会点（差异化竞争切入点） 机会类型 | 用户真实诉求 | 原始证据（引用原话） | 落地建议（如何变成卖点） --- | --- | --- | --- 新增功能 | 例如：希望便携 | "要是能折叠放车里就好了" | 开发折叠版本，主打户外车载场景 细分场景 | … | … | … 互补产品 | … | … | … ## 🛡️ 三、 预期管理偏差（详情页优化建议） * 误导点1：[描述] * 原话证据：[引用] * 优化建议：[在A+页面或主图如何修改] ## 🎯 四、 专家结论与行动指南 如果我现在要微调这款产品并重新推向市场，请给我最核心的3条行动建议（1条关于改产品，1条关于做差异化，1条关于改Listing）。 # Input Data [new data] ``` ### Step 4: 发送报告 将最终报告发送给用户。 ## 技术要点 - 使用 Bright Data 的 [REDACTED_SECRET] 工具（自动处理反爬、验证码） - URL 编码：`encodeURIComponent("商品URL")` - 筛选条件：1-3星评论 - 分批处理：每次30条 - Map-Reduce：分而治之提取 + 聚合汇总分析 ## 配套脚本 如需本地运行批量处理，可使用 `scripts/review_scraper.py`： ```bash python scripts/review_scraper.py <商品URL> <API_KEY> ```

path: scripts/review_scraper.py
content: #!/usr/bin/env python3
"""
亚马逊评论抓取工具 - 使用 Bright Data API
分批获取评论，每次30条，支持1-3星筛选
"""

import requests
import json
import time
import sys
import urllib.parse

def get_reviews(product_url, api_key, batch_size=30, max_total=500):
    """
    获取亚马逊商品评论
    
    Args:
        product_url: 亚马逊商品URL
        [REDACTED_SECRET] Data API Key
        batch_size: 每批获取数量
        max_total: 最大获取总数
    
    Returns:
        所有评论列表
    """
    encoded_url = urllib.parse.quote(product_url, safe='')
    
    # 使用 Bright Data 的结构化数据 API 获取 Amazon 评论
    base_url = "https://api.brightdata.com/datasets/v3/amazon_product_reviews"
    
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    
    all_reviews = []
    offset = 0
    
    print(f"开始抓取评论: {product_url}")
    print(f"每批数量: {batch_size}, 最大总数: {max_total}")
    
    while offset < max_total:
        # 构建请求参数 - 筛选1-3星评论
        params = {
            "url": encoded_url,
            "reviews_star": "1,2,3",  # 筛选1-3星
            "limit": batch_size,
            "offset": offset
        }
        
        try:
            # 使用 Amazon Reviews Scraper API
            response = requests.get(
                base_url,
                headers=headers,
                params=params,
                timeout=60
            )
            
            if response.status_code == 200:
                data = response.json()
                reviews = data.get("reviews", [])
                
                if not reviews:
                    print(f"第 {(offset // batch_size) + 1} 批: 获取到 0 条评论，已完成所有数据抓取")
                    break
                
                all_reviews.extend(reviews)
                print(f"第 {(offset // batch_size) + 1} 批: 获取到 {len(reviews)} 条评论，累计 {len(all_reviews)} 条")
                
                if len(reviews) < batch_size:
                    print("已获取所有剩余评论")
                    break
                    
                offset += batch_size
                time.sleep(1)  # 避免请求过快
                
            elif response.status_code == 429:
                print("请求频率限制，等待10秒后重试...")
                time.sleep(10)
            else:
                print(f"请求失败: {response.status_code} - {response.text}")
                break
                
        except Exception as e:
            print(f"请求异常: {str(e)}")
            break
    
    print(f"\n总计获取 {len(all_reviews)} 条评论")
    return all_reviews

def extract_review_texts(reviews):
    """
    提取评论文本用于标注
    """
    extracted = []
    for i, review in enumerate(reviews, 1):
        # 提取评论内容
        text = review.get("body", review.get("text", ""))
        star = review.get("star", review.get("rating", ""))
        
        if text and star:
            extracted.append({
                "index": i,
                "star": star,
                "text": text[:500]  # 限制长度
            })
    
    return extracted

def main():
    if len(sys.argv) < 3:
        print("用法: python review_scraper.py <商品URL> <API_KEY>")
        sys.exit(1)
    
    product_url = sys.argv[1]
    [REDACTED_SECRET]
    
    reviews = get_reviews(product_url, api_key)
    extracted = extract_review_texts(reviews)
    
    # 输出JSON格式供后续处理
    output_file = "extracted_reviews.json"
    with open(output_file, "w", encoding="utf-8") as f:
        json.dump(extracted, f, ensure_ascii=False, indent=2)
    
    print(f"评论已保存到 {output_file}")
    return extracted

if __name__ == "__main__":
    main()

Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)