DingTalk Meeting Summary
Use this skill for DingTalk AI 听记 detail pages and the AI 听记 management history list.
This skill is agent-first and script-based:
- one dedicated Chrome profile for DingTalk sync
- one-time visible login through that profile
- exported Playwright
storage_state - later sync runs execute headlessly with no visible browser switching
Install-time setup behavior
When the user asks to install or set up this skill, treat setup as a two-step flow:
- Finish the skill installation first.
- Immediately ask whether the user wants a recurring automatic sync.
If the user wants recurring sync:
- ask for the interval in plain language
- use Codex automation, not system cron, launchd, or other OS schedulers
- create a Codex cron automation with a short name such as
meeting-summary-sync - schedule in the user's locale time zone
- keep the automation prompt focused on the task only: sync recent DingTalk AI meeting summaries into the configured local output directory, skip already-downloaded items, and report saved, skipped, permission-pending, and failed counts
If the user does not want recurring sync:
- do not create any automation
- continue with the normal one-time setup flow
If the user has not logged in yet:
- complete login and storage-state export first
- only then offer recurring automation
Prerequisites
- macOS with Google Chrome installed.
- Python 3.10+.
- Playwright installed for Python.
- The user can log into DingTalk once in the dedicated browser.
Bundled scripts
scripts/launch_dingtalk_sync_browser.pyLaunches a dedicated Chrome profile on a fixed CDP port for first-time login or debugging.scripts/export_dingtalk_storage_state.pyExports cookies and origin state into Playwrightstorage_state.json.scripts/check_dingtalk_sync_browser.pyConfirms the dedicated browser is reachable over CDP.scripts/extract_dingtalk_ai_transcript_cdp.pyExtracts the current detail page transcript and AI summary from the dedicated browser.scripts/sync_dingtalk_ai_memory_cdp.pyBatch-syncs recent history items, requests access when allowed, and saves successful captures as Markdown.scripts/recheck_dingtalk_permission_pages.pyRe-checks previously blocked permission pages one by one.scripts/debug_permission_page.pyLightweight debugging helper for a single blocked row.scripts/doctor.pyChecks local prerequisites and current config paths before first use.
Default local layout
- config:
config.json - example config:
config.example.json - base output dir:
~/Documents/dingtalk-meeting-summary - captures:
~/Documents/dingtalk-meeting-summary/captures - storage state:
~/Documents/dingtalk-meeting-summary/.storage_state.json - dedicated Chrome profile:
~/Documents/dingtalk-meeting-summary/.chrome-profile
Run
Check local prerequisites:
python3 scripts/doctor.py --pretty
Launch the dedicated visible browser for one-time login:
python3 scripts/launch_dingtalk_sync_browser.py --pretty
Export storage state after login:
python3 scripts/export_dingtalk_storage_state.py --pretty
Check CDP connectivity:
python3 scripts/check_dingtalk_sync_browser.py --pretty
Extract a single detail page from the dedicated browser:
python3 scripts/extract_dingtalk_ai_transcript_cdp.py --pretty
Run the headless batch sync:
python3 scripts/sync_dingtalk_ai_memory_cdp.py \
--use-storage-state \
--pretty
Limit a run while iterating:
python3 scripts/sync_dingtalk_ai_memory_cdp.py \
--use-storage-state \
--max-pages 2 \
--max-items 20 \
--pretty
First-time setup flow
For a first-time user, prefer this order:
- Run
scripts/doctor.py - Launch the dedicated browser and let the user log in
- Export
storage_state - Confirm whether the user wants a recurring automatic sync
- If yes, create a Codex automation instead of using OS scheduling
Config
Default config file:
config.json
Relevant settings:
base_dirlock_pathpermission_request_messagelookback_monthscdp_endpointstorage_state_pathchrome_profile_dirchrome_bin
Operational notes
- Prefer the headless
storage_stateworkflow for normal sync runs. - Use the dedicated visible Chrome only for login refresh or debugging.
- Batch runs emit progress lines to
stderr; final JSON goes tostdout. - A Markdown file with the same embedded
row_keymeans the item is already downloaded locally and will be skipped later. - Items without download permission are not stored locally; later runs simply re-scan history.
- Batch storage is topic-first Markdown files under
<base_dir>/captures/<topic>/YYYY-MM-DD HH:MM.md. - By default the batch sync only scans the most recent 3 calendar months. Override that with
--stop-before-date YYYY-MM-DDor--lookback-months N.
Failure modes
- Login challenge page in the dedicated browser:
The exported
storage_stateis stale and needs to be refreshed. - Transcript container not found: The page layout changed or the page is not a detail page.
- AI summary container not found: The summary tab or DOM structure changed.
- History page layout changed: The row selector or pagination selector needs updating.
Reporting back to the user
Always return:
- the page title
- the page URL
- whether
transcriptwas extracted - whether
ai_summarywas extracted - the saved file path when relevant
- for batch syncs: saved count, skipped count, permission-requested count, permission-pending count, and failure count