$npx -y skills add stvlynn/dingtalk-wukong-skills --skill dianping-info-query专业的大众点评网站信息查询技能,支持商户搜索、详情获取、评分信息提取、城市切换和深度信息查询等功能。当用户需要从大众点评网站查询商户信息、获取店铺详情、查看评分评论、切换城市等数据时使用。该技能包含完整的双状态登录检测机制(已登录/未登录)、用户引导机制和标准化操作流程,并支持包括食材评分在内的完整分项评分提取。新增跨页面搜索框动态定位、多标签页自动管理、商圈查询支持和用户标签标准化处理功能。
| 1 | # 大众点评信息查询技能 |
| 2 | |
| 3 | ## 概述 |
| 4 | |
| 5 | 本技能提供对大众点评网站(dianping.com)的专业信息查询能力,能够安全、高效地获取商户信息、评分数据和相关详情。技能内置完整的**双状态登录检测机制**,能够准确识别已登录和未登录两种状态,并提供相应的处理流程。 |
| 6 | |
| 7 | ## 核心功能范围 |
| 8 | |
| 9 | ### 支持的查询类型 |
| 10 | - **商户搜索**:按关键词、地点、分类搜索商户 |
| 11 | - **商圈查询**:支持热门商圈(如回民街、南京路等)的整体信息查询 |
| 12 | - **商户详情**:获取商户基本信息(名称、地址、电话、营业时间) |
| 13 | - **评分信息**:获取综合评分、口味/环境/服务/**食材**分项评分(新增食材评分支持) |
| 14 | - **扩展信息**:评价数量、人均消费、菜系分类、商圈位置、团购/订座标识 |
| 15 | - **城市切换**:支持在全国所有大众点评覆盖城市间灵活切换 |
| 16 | - **深度信息查询**:获取推荐菜列表、用户评论内容、**评论标签及高频提及次数**、营业时间等深度信息 |
| 17 | - **多标签页管理**:自动处理搜索过程中产生的新标签页,确保操作连续性 |
| 18 | |
| 19 | ### 不支持的功能 |
| 20 | - 需要深度登录验证的个人化内容(如个人收藏、历史记录) |
| 21 | - 批量自动化查询(单次查询为主) |
| 22 | |
| 23 | ## 登录状态检测与处理 |
| 24 | |
| 25 | ### 双状态检测机制 |
| 26 | 1. **未登录状态检测**: |
| 27 | - 检查页面右上角是否存在"请登录/注册"文本 |
| 28 | - 检查URL是否包含`account.dianping.com/pclogin` |
| 29 | - 查找登录相关的二维码图片或表单元素 |
| 30 | |
| 31 | 2. **已登录状态检测**: |
| 32 | - 检查是否存在用户名元素(`.nick-name` 或 `.username`) |
| 33 | - 验证用户头像元素(`.user-face`)是否存在 |
| 34 | - 确认个人中心链接是否可访问 |
| 35 | |
| 36 | ### 用户引导流程 |
| 37 | **未登录状态**: |
| 38 | 1. 立即暂停自动化操作 |
| 39 | 2. 向用户说明当前需要手动登录 |
| 40 | 3. 提供具体的登录指导(主要为二维码扫码登录) |
| 41 | 4. 等待用户确认登录完成后再继续执行查询 |
| 42 | |
| 43 | **已登录状态**: |
| 44 | 1. 直接执行查询操作 |
| 45 | 2. 利用登录状态获取更完整的商户信息 |
| 46 | 3. 如遇异常,重新检测登录状态 |
| 47 | |
| 48 | ## 标准化操作SOP流程 |
| 49 | |
| 50 | ### 基础查询流程 |
| 51 | ``` |
| 52 | Step 1: 导航到大众点评首页 (https://www.dianping.com) |
| 53 | Step 2: 使用backbone分析页面结构,检测登录状态(双状态检测) |
| 54 | Step 3: |
| 55 | - 未登录:暂停并引导用户手动完成登录 |
| 56 | - 已登录:继续执行查询 |
| 57 | Step 4: 动态定位搜索框并输入查询关键词 |
| 58 | - 使用search工具动态查找多种选择器:#myInput, #J-search-input, input.j-search-input |
| 59 | - 优先使用placeholder属性进行模糊匹配:input[placeholder*='搜索'] |
| 60 | - 避免硬编码ref引用,提高跨页面稳定性 |
| 61 | Step 5: 提交搜索并等待结果页面加载 |
| 62 | Step 6: 自动处理标签页切换(如产生新标签页) |
| 63 | Step 7: 使用readability提取结构化信息(包含完整分项评分和用户标签) |
| 64 | Step 8: 返回整理后的商户信息 |
| 65 | ``` |
| 66 | |
| 67 | ### 城市切换流程 |
| 68 | ``` |
| 69 | Step 1: 导航到当前城市页面 |
| 70 | Step 2: 点击城市选择图标(img.city-select-icon) |
| 71 | Step 3: 在城市列表页面搜索目标城市 |
| 72 | Step 4: 点击目标城市链接完成切换 |
| 73 | Step 5: 验证城市切换成功(检查URL和当前城市显示) |
| 74 | Step 6: 执行目标城市的查询操作 |
| 75 | ``` |
| 76 | |
| 77 | ### 深度信息查询流程 |
| 78 | ``` |
| 79 | Step 1: 完成基础查询,进入商户详情页面 |
| 80 | Step 2: 使用readability提取完整页面内容(自动包含食材评分和用户标签次数) |
| 81 | Step 3: 定位推荐菜区域(#shop-dish)获取菜品列表 |
| 82 | Step 4: 提取用户评论信息(评分、评论数量、评论标签及提及次数、详细评论内容) |
| 83 | Step 5: 整理并返回完整的深度信息 |
| 84 | ``` |
| 85 | |
| 86 | ### 多标签页管理流程 |
| 87 | ``` |
| 88 | Step 1: 执行可能产生新标签页的操作(如搜索提交) |
| 89 | Step 2: 使用list_tabs获取所有打开的标签页 |
| 90 | Step 3: 识别最新打开的标签页(通常为搜索结果页) |
| 91 | Step 4: 自动focus到最新标签页 |
| 92 | Step 5: 验证标签页URL和标题确保正确性 |
| 93 | Step 6: 继续后续操作 |
| 94 | ``` |
| 95 | |
| 96 | ## 浏览器工具Action支持清单 |
| 97 | |
| 98 | ### 导航与页面分析 |
| 99 | - `navigate`: 访问指定URL(首页或具体商户页面) |
| 100 | - `backbone`: 分析页面整体结构,识别关键交互元素 |
| 101 | - `search`: **优先使用**动态定位特定元素(搜索框、商户卡片、评分元素等) |
| 102 | - `readability`: 提取商户详情页面的结构化文本内容(**推荐首选**) |
| 103 | - `list_tabs`: 获取所有打开的标签页信息(用于多标签页管理) |
| 104 | |
| 105 | ### 用户交互 |
| 106 | - `type`: 在搜索框中输入查询关键词 |
| 107 | - `click`: 点击搜索按钮、商户链接或城市选择图标 |
| 108 | - `press`: 模拟键盘操作(如Enter提交) |
| 109 | - `focus_tab`: 切换到指定标签页(用于多标签页场景) |
| 110 | |
| 111 | ### 内容提取 |
| 112 | - `readability`: **首选方案**提取商户详情页面的完整结构化内容(包含食材评分、用户标签次数等) |
| 113 | - `snapshot`: 获取完整DOM用于复杂内容分析(**备用方案**) |
| 114 | |
| 115 | ## 具体操作示例 |
| 116 | |
| 117 | ### 示例1:查询成都小龙坎火锅(已登录状态) |
| 118 | ```javascript |
| 119 | // Step 1: 导航到首页 |
| 120 | use_browser(action="navigate", url="https://www.dianping.com") |
| 121 | |
| 122 | // Step 2: 检测登录状态 |
| 123 | use_browser(action="backbone") |
| 124 | // 检查是否存在用户名元素(已登录状态) |
| 125 | |
| 126 | // Step 3: 动态定位搜索框 |
| 127 | use_browser(action="search", query="#myInput") |
| 128 | |
| 129 | // Step 4: 执行搜索(已登录,直接执行) |
| 130 | use_browser(action="type", ref="found-ref", text="成都小龙坎老火锅", submit=true) |
| 131 | |
| 132 | // Step 5: 提取完整结果(包含食材评分4.7、用户标签次数等) |
| 133 | use_browser(action="readability") |
| 134 | ``` |
| 135 | |
| 136 | ### 示例2:处理未登录状态 |
| 137 | ```javascript |
| 138 | // Step 1: 导航到首页 |
| 139 | use_browser(action="navigate", url="https://www.dianping.com") |
| 140 | |
| 141 | // Step 2: 检测到未登录状态 |
| 142 | use_browser(action="backbone") |
| 143 | // 发现"请登录/注册"文本 |
| 144 | |
| 145 | // Step 3: 引导用户手动登录 |
| 146 | // [暂停操作,提示用户扫码登录] |
| 147 | |
| 148 | // Step 4: 用户确认登录后继续 |
| 149 | use_browser(action="search", query="#myInput") |
| 150 | use_browser(action="type", ref="found-ref", text="北京中关村 咖啡店", submit=true) |
| 151 | ``` |
| 152 | |
| 153 | ### 示例3:城市切换操作 |
| 154 | ```javascript |
| 155 | // Step 1: 导航到当前城市 |
| 156 | use_browser(action="navigate", url="https://www.dianping.com") |
| 157 | |
| 158 | // Step 2: 点击城市选择图标 |
| 159 | use_browser(action="search", query=".city-select-icon") |
| 160 | use_browser(action="click", ref="found-ref") |
| 161 | |
| 162 | // Step 3: 搜索目标城市 |
| 163 | use_browser(action="search", query="成都") |
| 164 | |
| 165 | // Step 4: 点击成都城市链接 |
| 166 | use_browser(action="click", ref="found-beijing-ref") |
| 167 | |
| 168 | // Step 5: 验证切换成功后执行查询 |
| 169 | use_browser(action="search", query="#myInput") |
| 170 | use_browser(action="type", ref="found-ref", text="小龙坎火锅", submit=true) |
| 171 | ``` |
| 172 | |
| 173 | ### 示例4:深度信息查询(包含食材评分和用户标签) |
| 174 | ```javascript |
| 175 | // Step 1: 进入商户详情页面后 |
| 176 | use_browser(action="readability") // 提取完整页面内容 |
| 177 | |
| 178 | // 结果将包含: |
| 179 | // - 综合评分: 4.4分 |
| 180 | // - 分项评分: 口味4.4, 环境4.4, 服务4.4, 食材4.7 |
| 181 | // - 用户标签: ["排队情况(2269次)", "收银员态度好(647次)", "环境干净整洁(646次)", ...] |
| 182 | // - 推荐菜: ["鸳鸯锅", "玫瑰圆子", "牛奶鸭血", ...] |
| 183 | // - 营业时间: 11:00-次日02:00 |
| 184 | ``` |
| 185 | |
| 186 | ### 示例5:动态搜索框定位(增强稳定性) |
| 187 | ```javascript |
| 188 | // 使用search工具动态定位搜索框,避免硬编码 |
| 189 | use_browser(action="search", query="#myInput") |
| 190 | // 或在搜索结果页 |
| 191 | use_browser(action="search", query="#J-search-input") |
| 192 | |
| 193 | // 根据返回的ref进行操作 |
| 194 | use_browser(action="type", ref="found-ref", text="查询关键词", submit=true) |
| 195 | ``` |
| 196 | |
| 197 | ### 示例6:跨页面搜索框动态定位(最新优化) |
| 198 | ```javascript |
| 199 | // 统一的搜索框定位策略,兼容不同页面 |
| 200 | use_browser(action="search", query="input[placeholder*='搜索'],#myInput,#J-search-input,input.j-search-input") |
| 201 | // 选择第一个找到的搜索框 |
| 202 | use_browser(action="type", ref="first-found-ref", text="西安回民街", submit=true) |
| 203 | ``` |
| 204 | |
| 205 | ### 示例7:自动标签页管理(最新优化) |
| 206 | ```javascript |
| 207 | // 执行搜索后自动处理标签页 |
| 208 | use_browser(action="type", ref="search-input-ref", text="回民街", submit=true) |
| 209 | |
| 210 | // 获取所有标签页 |
| 211 | use_browser(action="list_tabs") |
| 212 | |
| 213 | // 自动切换到最新标签页(搜索结果页) |
| 214 | use_b |