# Dingtalk Meeting Summary

> Extract DingTalk AI meeting transcripts and AI summaries using a dedicated Chrome login plus Playwright automation. Use this whenever the user wants to grab a single DingTalk AI 听记 page, batch-sync recent history, request access for restricted items, or save transcript and AI summary content into local Markdown files.

- Skill: `callzhang/dingtalk-meeting-summary` (Agent Skill, multi-file: 7 files)
- Install (CLI): `npx skillmds@latest add callzhang/dingtalk-meeting-summary`
- Raw SKILL.md: https://api.skillmd.com/api/skills/callzhang/dingtalk-meeting-summary/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: callzhang (https://skillmd.com/u/callzhang)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/callzhang/dingtalk-meeting-summary

---


# 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:

1. Finish the skill installation first.
2. 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.py`
  Launches a dedicated Chrome profile on a fixed CDP port for first-time login or debugging.
- `scripts/export_dingtalk_storage_state.py`
  Exports cookies and origin state into Playwright `storage_state.json`.
- `scripts/check_dingtalk_sync_browser.py`
  Confirms the dedicated browser is reachable over CDP.
- `scripts/extract_dingtalk_ai_transcript_cdp.py`
  Extracts the current detail page transcript and AI summary from the dedicated browser.
- `scripts/sync_dingtalk_ai_memory_cdp.py`
  Batch-syncs recent history items, requests access when allowed, and saves successful captures as Markdown.
- `scripts/recheck_dingtalk_permission_pages.py`
  Re-checks previously blocked permission pages one by one.
- `scripts/debug_permission_page.py`
  Lightweight debugging helper for a single blocked row.
- `scripts/doctor.py`
  Checks 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:

```bash
python3 scripts/doctor.py --pretty
```

Launch the dedicated visible browser for one-time login:

```bash
python3 scripts/launch_dingtalk_sync_browser.py --pretty
```

Export storage state after login:

```bash
python3 scripts/export_dingtalk_storage_state.py --pretty
```

Check CDP connectivity:

```bash
python3 scripts/check_dingtalk_sync_browser.py --pretty
```

Extract a single detail page from the dedicated browser:

```bash
python3 scripts/extract_dingtalk_ai_transcript_cdp.py --pretty
```

Run the headless batch sync:

```bash
python3 scripts/sync_dingtalk_ai_memory_cdp.py \
  --use-storage-state \
  --pretty
```

Limit a run while iterating:

```bash
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:

1. Run `scripts/doctor.py`
2. Launch the dedicated browser and let the user log in
3. Export `storage_state`
4. Confirm whether the user wants a recurring automatic sync
5. If yes, create a Codex automation instead of using OS scheduling

## Config

Default config file:

```bash
config.json
```

Relevant settings:
- `base_dir`
- `lock_path`
- `permission_request_message`
- `lookback_months`
- `cdp_endpoint`
- `storage_state_path`
- `chrome_profile_dir`
- `chrome_bin`

## Operational notes

- Prefer the headless `storage_state` workflow 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 to `stdout`.
- A Markdown file with the same embedded `row_key` means 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-DD` or `--lookback-months N`.

## Failure modes

- Login challenge page in the dedicated browser:
  The exported `storage_state` is 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 `transcript` was extracted
- whether `ai_summary` was extracted
- the saved file path when relevant
- for batch syncs: saved count, skipped count, permission-requested count, permission-pending count, and failure count

