360 Secure SkillHub
360 安全技能中心

Lark Report Collector

针对 Lark 周报页面(单页应用)的浏览器采集流程:选择模板、翻页定位目标周、提取已提交成员、通过脚本点击查看未提交名单,再经 Lark API 生成文档并发送通知。内含翻页方向、块类型映射等实测经验与已知限制,但依赖特定浏览器 profile 与登录会话。

pengxiao-wang
pengxiao-wang
热度 88.28
最近更新 2026-05-11 17:26:48
分类:协作依赖:联网浏览搜索 / 第三方 API / 读写文件应用场景:报告撰写 / 任务管理 / 摘要总结 / 工作流

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add lark-report-collector
Metadata
name
lark-report-collector
description
Collect weekly reports from Lark Reports (oa.larksuite.com), summarize into Lark Docs, and notify. Use when: (1) collecting weekly reports from specific teams/templates, (2) checking who hasn't submitted reports, (3) generating report summaries as Lark documents. Requires browser automation (Reports is a SPA, API not available on international Lark).

Lark Report Collector

Collect weekly report data from Lark Reports, summarize into Lark Docs, and send notifications.

When to Use

  • "Collect this week's/last week's reports for Photo/Bloom/H&F"
  • "Who hasn't submitted their weekly report?"
  • "Summarize weekly reports into a Lark doc"

Hard Rules (battle-tested)

  1. Reports is a SPA — curl/web_fetch returns nothing. Must use browser (profile=openclaw)
  2. Pagination is reversed — Next = older weeks, Previous = newer weeks
  3. Always snapshot to confirm week title after pagination (most common error: collecting wrong week)
  4. One page may show multiple weeks — data is sorted by time, a single page can span 2-3 weeks
  5. block_type mapping — 12=bullet, 13=ordered (NOT 9/10! Those are heading7/heading8)
  6. Never restart gateway inside a sub-agent (kills itself)
  7. Sub-agents need exact URLs and steps — don't let them explore on their own

Complete Workflow

Step 1: Navigate to Reports

browser action=navigate profile=openclaw targetUrl="https://oa.larksuite.com/report/record/entry"

Prerequisites: openclaw browser must have active Lark login session.

Step 2: Select Report Template

Snapshot and click the target template menuitem in the left sidebar "Received by me".

Step 3: Navigate to Target Week

Page defaults to latest data. Week title format: "Feb 2 ~ Feb 8 Submitted: 18"

Pagination (critical):

  • Next button = older weeks ⬅️
  • Previous button = newer weeks ➡️
  • Page display: "2/25" (page 2 of 25), page 1 is newest

⚠️ Snapshot and confirm the date in the title after every page turn!

Step 4: Extract Submitted Members Data

  • Same page may show multiple weeks — only extract rows belonging to target week
  • Paginate through all rows for the target week
  • Append to local file after each extraction (prevents data loss)

Step 5: Get Unsubmitted List

"Not submitted: N" button has no snapshot ref. Click via JS evaluate:

(() => {
  const btns = [...document.querySelectorAll('button')].filter(
    b => /Not submitted.*\d/.test(b.innerText)
  );
  if(btns.length) { btns[0].click(); return 'clicked'; }
  return 'not found';
})()

Dialog shows: unsubmitted count + names + departments.

Step 6: Create Lark Doc

Create document via Lark Open API (see lark-api skill for auth).

block_type reference (verified):

block_type Type JSON field
2 Text "text"
3 Heading 1 "heading1"
4 Heading 2 "heading2"
5 Heading 3 "heading3"
12 Bullet list ✅ "bullet"
13 Ordered list ✅ "ordered"
22 Divider "divider"

❌ 9=heading7, 10=heading8. NOT lists!

Step 7: Send Notification

Send message via Lark API with doc link.

Lessons Learned (6 real attempts)

# Result Root Cause Lesson
1 ❌ Self-killed Sub-agent ran gateway restart Never restart gateway in sub-agent
2 ⚠️ Wrong week Collected Feb 10-14 instead of Feb 3-7 Always confirm week title after pagination
3 ❌ 200K tokens burned Tried curl on SPA Reports is SPA, browser only
4 ❌ 200K tokens burned Sub-agent explored on its own Give exact URLs and steps
5 ✅ Success Precise instructions + correct block_types Template is key

Known Limitations

  • Lark Report Open API unavailable on international version (returns 404) — browser only
  • Browser login session may expire — re-login needed
  • Export button (Excel) untested — potential alternative