diff --git a/docs/acceptance/2026-03-29-zhihu-hotlist-excel.md b/docs/acceptance/2026-03-29-zhihu-hotlist-excel.md index a6ef5b0..95f79b3 100644 --- a/docs/acceptance/2026-03-29-zhihu-hotlist-excel.md +++ b/docs/acceptance/2026-03-29-zhihu-hotlist-excel.md @@ -1,8 +1,8 @@ # Zhihu Hotlist Excel Acceptance -- Date: 2026-03-29 23:15:47 +0800 +- Date: 2026-03-30 00:03:42 +0800 - Mode: real provider + live Zhihu hotlist API + simulated browser pipe -- Workspace: `/tmp/sgclaw-live-acceptance-icg8dnwq` +- Workspace: `/tmp/sgclaw-live-acceptance-_655xotg` - Final success: `True` - Total score: `100/100` @@ -16,40 +16,40 @@ ## Final Output -- exported_path: `/tmp/sgclaw-live-acceptance-icg8dnwq/.sgclaw-zeroclaw-workspace/zhihu_hotlist_20260329_2314.xlsx` -- final_summary: `太好了!Excel文件已成功导出。现在让我提供完整的操作总结和结果。 +- exported_path: `/tmp/sgclaw-live-acceptance-_655xotg/.sgclaw-zeroclaw-workspace/out/zhihu-hotlist-1774800210904715681.xlsx` +- final_summary: `成功!我已经完成了知乎热榜数据的读取和Excel导出任务。以下是任务总结: -## 知乎热榜数据收集与导出完成 +## 任务完成情况 -**操作类型**: 收集 (collect) -**数据来源**: https://www.zhihu.com/hot -**采集时间**: 2026-03-29 23:14:41 (+08:00) -**采集结果**: 成功获取10条热榜数据 +1. **导航到知乎热榜页面**:成功从知乎首页导航到热榜页面(https://www.zhihu.com/hot) -**导出文件**: `/tmp/sgclaw-live-acceptance-icg8dnwq/.sgclaw-zeroclaw-workspace/zhihu_hotlist_20260329_2314.xlsx` +2. **获取热榜数据**:使用SuperRPA浏览器接口获取了当前热榜页面的完整内容,包含10个热榜条目 -**数据概览**: -1. 如何看待张雪机车在2026年WSBK葡萄牙站夺冠? - 热度: 1399万 -2. 李荣浩摆证据4连质问单依纯 - 热度: 805万 -3. 日本拟动用外储做空国际原油 - 热度: 517万 -4. 官方通报女子被羁押后无罪释放 - 热度: 429万 -5. 黄金大买家土耳其央行抛售黄金 - 热度: 196万 -6. 伊朗科技大学遭袭后伊朗将美以大学列为袭击目标 - 热度: 173万 -7. 字节跳动单挑互联网巨头 - 热度: 151万 -8. 学霸家长低调不晒成绩 - 热度: 129万 -9. DDR5内存价格下降 - 热度: 110万 -10. 四种超能力选择 - 热度: 75万 +3. **解析数据**:从页面文本中提取了排名、标题和热度信息,格式如下: + - 排名:数字序号 + - 标题:完整的问题标题 + - 热度:以"万"为单位的阅读量 -**Excel文件内容**: -- 工作表名称: `知乎热榜` -- 列: `rank` (排名), `title` (标题), `heat` (热度) -- 行数: 10条完整热榜数据 +4. **导出Excel文件**:成功将10个热榜条目导出到Excel文件,包含"排名"、"标题"、"热度"三列 -所有热榜数据已成功从知乎官网实时采集并导出为Excel格式,文件已保存在指定路径。` +## 生成的文件 + +**Excel文件路径**:`/tmp/sgclaw-live-acceptance-_655xotg/.sgclaw-zeroclaw-workspace/out/zhihu-hotlist-1774800210904715681.xlsx` + +## 热榜数据概览 + +当前知乎热榜前10名涵盖了多个热门话题: +- 体育赛事(WSBK摩托车赛) +- 娱乐事件(李荣浩与单依纯争议) +- 国际政治经济(日本外汇政策、伊朗冲突) +- 科技商业(字节跳动发展、内存价格) +- 社会现象(学霸家长行为、Excel使用) + +最高热度话题达到1607万阅读量,显示了知乎用户对这些话题的高度关注。` ## Skill Logs -- `DeepSeek config loaded from /tmp/sgclaw-live-acceptance-icg8dnwq/sgclaw_config.json model=deepseek-chat base_url=https://api.deepseek.com` +- `DeepSeek config loaded from /tmp/sgclaw-live-acceptance-_655xotg/sgclaw_config.json model=deepseek-chat base_url=https://api.deepseek.com` - `skills dir resolved to /home/zyl/projects/sgClaw/skill_lib/skills` - `runtime profile=BrowserAttached skills_prompt_mode=Compact` - `zeroclaw_process_message_primary` @@ -59,24 +59,23 @@ getText main call openxml_office return generated local .xlsx path` - `loaded skills: office-export-xlsx, zhihu-hotlist, zhihu-hotlist-screen, zhihu-navigate, zhihu-write` -- `read_skill zhihu-hotlist` - `navigate https://www.zhihu.com/hot` - `getText main` - `call openxml_office` ## Live Hotlist Sample -- 1. 如何看待张雪机车在 2026 年 WSBK 葡萄牙站夺冠?这对国内的摩托赛事发展有什么影响? | 1399万 -- 2. 李荣浩摆证据 4 连质问单依纯,为什么没有授权的歌曲也能放进演唱会?演唱会筹备中可能出了什么问题? | 805万 -- 3. 日本拟动用外储做空国际原油,以挽救日元汇率,对此你怎么看,其会重演 96 年「住友铜事件」么? | 517万 -- 4. 官方通报女子被羁押后无罪释放,申请国赔 13 天被叫停,当地成立联合调查组,最该查清什么?带来哪些深思? | 429万 -- 5. 黄金大买家土耳其央行在伊朗战争期间抛售 80 亿美元黄金,这意味着什么? | 196万 -- 6. 伊朗科技大学遭袭后,伊朗将美以大学列为「合法袭击目标」,如果战争扩大到教育机构,冲突还有回头路吗? | 173万 -- 7. 字节跳动是怎么短短数年就能单挑所有互联网巨头的? | 151万 -- 8. 为什么越厉害的学霸,她们家长越低调?从来不在朋友圈晒孩子成绩? | 129万 -- 9. DDR5 内存价格 3 月出现明显下降,请问这是短期现象,还是内存供需紧张真的缓和了? | 110万 -- 10. 假如有四种超能力选择,分别为:隐身、透视、飞行、预见未来半小时发生的事情,只能选择一个,你会选择哪个? | 75万 +- 1. 如何看待张雪机车在 2026 年 WSBK 葡萄牙站夺冠?这对国内的摩托赛事发展有什么影响? | 1607万 +- 2. 李荣浩摆证据 4 连质问单依纯,为什么没有授权的歌曲也能放进演唱会?演唱会筹备中可能出了什么问题? | 1064万 +- 3. 日本拟动用外储做空国际原油,以挽救日元汇率,对此你怎么看,其会重演 96 年「住友铜事件」么? | 573万 +- 4. 官方通报女子被羁押后无罪释放,申请国赔 13 天被叫停,当地成立联合调查组,最该查清什么?带来哪些深思? | 281万 +- 5. 字节跳动是怎么短短数年就能单挑所有互联网巨头的? | 185万 +- 6. 伊朗科技大学遭袭后,伊朗将美以大学列为「合法袭击目标」,如果战争扩大到教育机构,冲突还有回头路吗? | 175万 +- 7. 黄金大买家土耳其央行在伊朗战争期间抛售 80 亿美元黄金,这意味着什么? | 166万 +- 8. 为什么越厉害的学霸,她们家长越低调?从来不在朋友圈晒孩子成绩? | 141万 +- 9. DDR5 内存价格 3 月出现明显下降,请问这是短期现象,还是内存供需紧张真的缓和了? | 135万 +- 10. 为什么大公司不用 pandas 取代 Excel? | 81万 ## Stderr -- `sgclaw ready: agent_id=7482cc6b-8fe0-4727-90da-7b3f62cad9b6` +- `sgclaw ready: agent_id=db27f86f-4334-41a7-bc24-11e8fbd90486` diff --git a/src/compat/openxml_office_tool.rs b/src/compat/openxml_office_tool.rs index 9e26a84..31299f5 100644 --- a/src/compat/openxml_office_tool.rs +++ b/src/compat/openxml_office_tool.rs @@ -179,9 +179,14 @@ fn resolve_column_order( return None; } - let provided_set = provided_columns + let canonicalized_columns = provided_columns .iter() - .map(|value| value.trim().to_string()) + .map(|value| canonicalize_column_name(value)) + .collect::>>()?; + + let provided_set = canonicalized_columns + .iter() + .map(|value| value.to_string()) .collect::>(); let expected_set = expected_columns .iter() @@ -195,13 +200,22 @@ fn resolve_column_order( expected_columns .iter() .map(|expected| { - provided_columns + canonicalized_columns .iter() - .position(|provided| provided.trim() == expected) + .position(|provided| *provided == expected) }) .collect::>>() } +fn canonicalize_column_name(value: &str) -> Option<&'static str> { + match value.trim().to_ascii_lowercase().as_str() { + "rank" | "排名" | "名次" | "序号" => Some("rank"), + "title" | "标题" | "题目" | "问题" => Some("title"), + "heat" | "热度" | "热值" => Some("heat"), + _ => None, + } +} + fn reorder_row(row: &[Value], column_order: &[usize]) -> Vec { column_order .iter() diff --git a/tests/compat_openxml_office_tool_test.rs b/tests/compat_openxml_office_tool_test.rs index 2799476..a15dce7 100644 --- a/tests/compat_openxml_office_tool_test.rs +++ b/tests/compat_openxml_office_tool_test.rs @@ -89,3 +89,41 @@ async fn openxml_office_tool_accepts_reordered_columns_when_rows_are_structured( assert!(xml.contains("344万")); assert!(xml.contains(">1<")); } + +#[tokio::test] +async fn openxml_office_tool_accepts_localized_hotlist_column_aliases() { + let workspace_root = temp_workspace_root(); + let output_path = workspace_root.join("out/zhihu-hotlist-localized.xlsx"); + let tool = OpenXmlOfficeTool::new(workspace_root.clone()); + + let result = tool + .execute(json!({ + "sheet_name": "知乎热榜", + "columns": ["排名", "标题", "热度"], + "rows": [ + [1, "问题一", "344万"], + [2, "问题二", "266万"] + ], + "output_path": output_path + })) + .await + .unwrap(); + + assert!(result.success, "{result:?}"); + assert!(output_path.exists()); + + let unzip = ProcessCommand::new("unzip") + .args([ + "-p", + output_path.to_str().unwrap(), + "xl/worksheets/sheet1.xml", + ]) + .output() + .unwrap(); + assert!(unzip.status.success()); + + let xml = String::from_utf8(unzip.stdout).unwrap(); + assert!(xml.contains("问题一")); + assert!(xml.contains("344万")); + assert!(xml.contains(">1<")); +}