court-sms
$
npx mdskill add cat-xierluo/legal-skills/court-smsExtracts case details and downloads court documents from SMS.
- Automatically retrieves case numbers and download links from court messages.
- Integrates with zxfw.court.gov.cn and sd.gdems.com delivery platforms.
- Uses regex patterns and URL parameters to parse input content.
- Archives downloaded documents into organized case directories.
SKILL.md
.github/skills/court-smsView on GitHub ↗
---
name: court-sms
homepage: https://github.com/cat-xierluo/legal-skills
author: 杨卫薪律师(微信ywxlaw)
version: "1.2.1"
license: MIT
description: 本技能应在用户收到法院短信(文书送达、立案通知、开庭提醒等)时使用,自动提取案号、当事人、下载链接,下载文书并归档到对应案件目录。
---
# 法院短信识别与文书下载
## 功能概述
处理法院短信的完整流程:**粘贴短信 → 解析内容 → 匹配案件 → 下载文书 → 归档保存**。
支持两种触发方式:
**方式一:粘贴短信原文**
```text
收到法院短信,内容如下:
【xx市人民法院】张三,您好!您有(2025)苏0981民初1234号案件文书送达,请点击链接查收:https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=DEMO1&sdbh=DEMO2&sdsin=DEMO3
```
**方式二:直接发送送达链接**
用户可能直接粘贴送达链接(非完整短信文本),此时跳过短信文本解析,直接从 URL 中提取 `qdbh`、`sdbh`、`sdsin` 参数,进入第三步下载流程。
```text
https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=xxx&sdbh=xxx&sdsin=xxx
```
## 短信类型分类
| 类型 | 特征 | 含下载链接 | 处理方式 |
| --- | --- | --- | --- |
| 文书送达 | 含送达平台链接 + 案号 | 是 | 下载文书并归档到案件目录 |
| 立案通知 | 含"已立案"等关键词 | 可能有 | 展示解析结果 |
| 信息通知 | 无链接,纯信息 | 否 | 展示解析结果 |
**支持的送达平台**:`zxfw.court.gov.cn`(全国)、`sd.gdems.com`(广东)、`jysd.10102368.com`(集约送达)。详见 `references/sms-patterns.json`。
---
## 工作流(四步)
### 第一步:输入解析
1. 读取 `references/sms-patterns.json` 作为解析参考
2. **判断输入类型**:
- **完整短信**:包含法院签名(如 `【xx法院】`)+ 正文 + 链接 → 完整解析流程
- **纯链接**:用户直接发送送达 URL(如 `https://zxfw.court.gov.cn/...?qdbh=xxx&sdbh=xxx&sdsin=xxx`)→ 跳过短信文本解析,直接从 URL 提取参数,进入第三步下载。案号、当事人等信息在下载文书后从文书内容中提取。
3. 对用户粘贴的短信文本进行分析(纯链接输入跳过此步):
**a) 短信分类**:根据关键词判断类型
- 文书送达:包含 zxfw.court.gov.cn 链接
- 立案通知:包含"已立案"、"立案通知"等
- 信息通知:其他
**b) 案号提取**:使用正则 `[((〔[]\d{4}[))〕]]` 匹配标准案号格式
标准案号格式示例:
- `(2025)苏0981民初1234号`
- `(2024)粤0604执保5678号`
- `〔2025〕京0105民初901号`
**c) 当事人提取**:从短信文本初步识别,最终以文书内容为准
- **注意**:短信中的称呼(如"张三,您好")仅为短信接收人,不作为案件当事人
- 公司名称:`xx有限责任公司`、`xx有限公司`、`xx股份有限公司`
- 诉讼对峙:`A与B`、`A诉B`、`原告A 被告B`
- 角色前缀:`原告:xxx`、`被告:xxx` 等
- 下载文书后,以起诉状、传票中的当事人信息为准,覆盖短信阶段的初步判断
**d) 下载链接提取**:识别短信中的送达平台链接并提取参数
| 平台 | 域名 | 下载方式 | 提取参数 |
|------|------|----------|----------|
| 全国法院统一送达平台 | `zxfw.court.gov.cn` | curl API 直连 | qdbh, sdbh, sdsin |
| 广东法院电子送达 | `sd.gdems.com` | 浏览器自动化 | 路径中的送达标识码 |
| 集约送达平台 | `jysd.10102368.com` | 浏览器自动化 | key |
> **排除列表**:法院名称、法官姓名、地名、法律术语等不应作为当事人提取。详见 `sms-patterns.json` → `party_extraction.exclude_keywords`。
**输出格式**(向用户展示):
```text
📋 短信解析结果:
- 类型:文书送达
- 案号:(2025)苏0981民初1234号
- 当事人:张三、xx有限公司
- 下载链接:已提取(zxfw.court.gov.cn)
```
### 第二步:确定归档目录
1. **扫描当前工作目录**:识别目录结构,找到与短信案号或当事人匹配的案件目录
2. **查找归档子目录**:在匹配到的案件目录下,查找法院文书相关的子目录(如 `08*`、`法院送达`、`court` 等)
3. 如未找到匹配案件,询问用户选择归档位置或暂存
### 第三步:文书下载
> **平台判断**:根据第一步识别的链接域名,选择下载策略。
> - `zxfw.court.gov.cn` → 方案一(API 直连)→ 方案二 → 方案三
> - `sd.gdems.com` 或 `jysd.10102368.com` → 跳过方案一,直接方案二 → 方案三
> - 未知域名 → 提示用户提供链接信息
>
> **⛔ 降级铁律**:严格串行,禁止并行。当前方案成功即停止,绝不降级。禁止"双保险"并行尝试多个方案。
#### 依赖
| 依赖 | 用途 | 适用方案 | 安装方式 |
|------|------|----------|----------|
| `curl` | API 下载 | 方案一 | macOS/Linux 预装 |
| `jq` | JSON 解析(可选) | 方案一 | `brew install jq` |
| Playwright | 浏览器自动化 | 方案二/三 | 见下方 |
**Playwright 安装指引**(仅方案二/三需要):
```bash
# 方案二: Playwright CLI
npm install -g playwright
npx playwright install chromium
# 方案三: Playwright MCP(需在 Claude Code 设置中配置)
# 在 settings.json 的 mcpServers 中添加:
# "playwright": { "command": "npx", "args": ["@anthropic-ai/mcp-playwright"] }
```
> **⛔ 大多数情况下不需要 Playwright**:zxfw 平台方案一直接 curl 调用 API,无需浏览器。仅 gdems/jysd 平台或**方案一失败后**才需要方案二/三。禁止在方案一执行期间同时打开浏览器。
#### 方案一 — API 直连(优先)
完全无头,无需浏览器。直接调用 zxfw 后端 API 获取文书下载链接,再用 curl 下载 PDF。
**API 信息**:
- 端点:`POST https://zxfw.court.gov.cn/yzw/yzw-zxfw-sdfw/api/v1/sdfw/getWsListBySdbhNew`
- Content-Type:`application/json`
- 请求体:`{ "qdbh": "xxx", "sdbh": "xxx", "sdsin": "xxx" }`(从短信 URL 提取)
- 响应字段:`data[].c_wsmc`(文书名称)、`data[].wjlj`(OSS 签名下载链接)、`data[].c_fymc`(法院名称)
- 无需认证、无需浏览器
```bash
# 1. 从短信 URL 提取参数(示例)
qdbh="DEMO_qdbh_value"
sdbh="DEMO_sdbh_value"
sdsin="DEMO_sdsin_value"
# 2. 调用 API 获取文书列表
mkdir -p /tmp/court-sms-staging/
resp=$(curl -s -X POST "https://zxfw.court.gov.cn/yzw/yzw-zxfw-sdfw/api/v1/sdfw/getWsListBySdbhNew" \
-H "Content-Type: application/json" \
-d "{\"qdbh\":\"$qdbh\",\"sdbh\":\"$sdbh\",\"sdsin\":\"$sdsin\"}")
# 3. 解析文书列表,逐个下载 PDF
echo "$resp" | jq -r '.data[] | "\(.c_wsmc)\t\(.wjlj)"' | while IFS=$'\t' read -r name url; do
curl -sL -o "/tmp/court-sms-staging/${name}.pdf" "$url"
done
# 4. 验证下载结果
ls -lh /tmp/court-sms-staging/*.pdf
```
#### 方案二 — 无头浏览器(Playwright CLI)
当方案一 API 不可用或链接过期时,用 Playwright CLI 无头模式打开页面,拦截网络请求获取下载链接。
```bash
# 需要先安装 playwright
npx playwright install chromium 2>/dev/null
# 无头模式运行(脚本需自行编写,拦截 getWsListBySdbhNew API 响应)
node scripts/download_court_docs.mjs --url "{短信链接}" --output /tmp/court-sms-staging/
```
#### 方案三 — 交互式浏览器(Playwright MCP)
当方案二不可用时(需要已配置 Playwright MCP):
```text
1. browser_navigate → 打开短信中的 zxfw URL
2. 等待页面加载
3. browser_evaluate → 直接调用 fetch API 获取文书列表
4. browser_run_code → 下载 PDF 文件到 /tmp/court-sms-staging/
```
如 API 调用未成功,改用页面交互:
```text
1. browser_snapshot → 查看当前页面结构
2. 找到文书列表或 PDF 预览区域
3. 定位下载按钮(可能在 iframe 内)
4. browser_click → 点击下载
5. 等待下载完成,保存到临时目录
```
#### 失败兜底
当三级均失败时:
```text
⚠️ 自动下载失败,请手动访问以下链接下载:
{原始链接}
下载后请将文件放到对应案件目录中。
我将为您创建待处理记录。
```
### 第四步:归档保存
1. **确定目标目录**:根据当前项目环境自动判断,不询问用户
- 扫描当前项目目录,匹配与案号或当事人相关的案件目录
- 如找到匹配案件目录,优先查找法院文书子目录(如 `08*`、`法院送达`、`court` 等);如无子目录则直接归档到案件根目录
- **如未找到匹配案件,自动在当前项目下新建**:`{案号} {当事人与案由}/`
- 如目标目录不存在,自动创建
2. **获取当前日期**:`date "+%Y%m%d"`
3. **确定文书标题**:
- 优先使用 API 返回的标题
- 否则根据 `sms-patterns.json` 中的 `document_titles` 映射推断
- 最后回退到 `未知文书`
4. **构建文件名**:`{title}({case_name})_{YYYYMMDD}收.pdf`
- 示例:`受理通知书(张三与李四合同纠纷)_20260404收.pdf`
- 清理非法字符:`< > : " | ? * \ /`
- 如同名文件已存在,追加 `_2` 后缀
5. **移入目标目录**
6. **写入内部记录**:保存本次处理的完整信息到 `archive/` 目录(格式详见 [`references/archive-format.md`](references/archive-format.md))
7. **基础文书解析**:法院 PDF 通常带文字层,提取首页文本,快速识别文书类型和关键信息
- **传票**:提取开庭时间、地点、法庭、案号,向用户高亮提醒
- **通知书/告知书**:提取缴费期限、举证期限等关键日期
- **起诉状/答辩状**:提取案由、当事人、诉讼请求概要
- **其他文书**:展示文书标题和法院名称
- 如一次下载多份文书,逐一解析,汇总为一份报告
> 深度分析(如判决书解读、合同审查)不在此技能范围内,请使用专用分析技能处理。
8. **向用户汇报**:按 [`references/report-format.md`](references/report-format.md) 输出结构化报告
- 先确认归档完成(案号、法院、当事人、案由、文件数、位置)
- 列出所有已归档的文书清单
- 如含传票,⚠️ 高亮提醒开庭时间、地点、审理程序
- 如部分失败,列出失败文书和原始链接
### 第五步:PDF 后处理(可选)
> **不默认启用**。仅在检测到文件拆分时主动提示用户。
归档完成后,扫描目标目录中的 PDF 文件,检测是否有同一文书被拆分为多个文件的情况。
#### 读取用户偏好
读取 `config/user-preferences.json` 获取用户的合并和重命名偏好。如文件不存在,使用默认值(参考 `config/user-preferences.example.json`)。
关键偏好项:
| 偏好 | 默认值 | 说明 |
|------|--------|------|
| `merge_strategy` | `per_evidence` | 合并策略:`per_evidence`(按编号分别合并)或 `unified`(统一合并) |
| `merge_options.unified.bookmarks.enabled` | `true` | 统一合并时是否添加 PDF 书签 |
| `rename.enabled` | `true` | 是否精简文件名 |
#### 触发检测
读取 `references/sms-patterns.json` → `post_processing.trigger` 配置,按以下规则分组:
```text
分组规则:
1. 证据类:文件名以"证据"开头 → 按编号分组(证据1、证据2、证据3…)
2. 其他文书:按文书类型分组(传票、起诉状、应诉通知书…)
3. 如任一组内文件数 > 3(threshold),触发提示
```
**示例**:证据3 下有 10 个 PDF → 触发。
#### 用户确认
使用 AskUserQuestion 提示用户,列出检测到的拆分情况:
```text
检测到以下文书被拆分为多个 PDF:
- 证据3:10 个文件
- 证据5:4 个文件
是否执行 PDF 后处理(合并 + 重命名)?
→ 是,合并所有
→ 让我选择(逐个确认)
→ 跳过
```
#### 执行后处理
用户确认后,根据 `user-preferences.json` 中的 `merge_strategy` 执行:
**策略一:per_evidence(默认)**
按单个证据编号分别合并,每个证据独立保留:
```text
- 证据3 有 10 个拆分文件 → 合并为「证据3:打印截图.pdf」
- 证据5 有 4 个拆分文件 → 合并为「证据5:电脑截图.pdf」
- 未被拆分的证据(如证据1 只有 1 个文件)保持不动
```
**策略二:unified**
将证据目录 + 所有证据合并为一个「原告证据.pdf」,并添加 PDF 书签:
```text
合并顺序:证据目录 → 证据1 → 证据2 → … → 证据N
书签格式:
📑 证据目录
📑 证据1:仲裁申请书、不予受理通知书
📑 证据2:劳动合同、保密协议
📑 证据3:被告工资表
📑 证据4:泄露账号密码的电脑截图
📑 证据5:打印及拷贝资料的电脑截图
📑 证据6:删除电脑操作痕迹的截图
```
书签名称使用简洁版:证据编号 + 冒号 + 证据标题(去除当事人和日期后缀)。使用 pypdf 的 `add_outline_item` 添加书签。
> 用户可随时修改 `user-preferences.json` 切换策略,无需改动 skill 本身。
#### 页面尺寸标准化
合并过程中同时标准化页面尺寸为 A4(210×297mm)。使用 pypdf 逐页处理:
```python
from pypdf import PdfReader, PdfWriter, Transformation
A4_W = 595.27 # 210mm in points
A4_H = 841.89 # 297mm in points
for page in reader.pages:
pw, ph = float(page.mediabox.width), float(page.mediabox.height)
is_landscape = pw > ph
# 保持原始方向:纵向→A4纵向,横向→A4横向
target_w = A4_H if is_landscape else A4_W
target_h = A4_W if is_landscape else A4_H
# 等比缩放并居中
scale = min(target_w / pw, target_h / ph)
offset_x = (target_w - pw * scale) / 2
offset_y = (target_h - ph * scale) / 2
new_page = writer.add_blank_page(width=target_w, height=target_h)
page.add_transformation(Transformation().scale(scale).translate(offset_x, offset_y))
new_page.merge_page(page)
```
**规则**:
- 纵向页面 → A4 纵向(210×297mm)
- 横向页面 → A4 横向(297×210mm),不强制旋转为纵向
- 等比缩放、居中放置,不裁剪、不拉伸
#### 精简文件名
根据 `user-preferences.json` → `rename` 配置对所有文件统一重命名:
```text
去除规则(strip_patterns):
- 去掉括号内的当事人信息:(张三与李四合同纠纷)
- 去掉日期后缀:_20260405收
- 去掉平台标记:(合并)、(自贸法庭)、(素)-
特殊映射(special_mappings):
- 起诉状(素)… → 起诉状(要素式).pdf
- 开庭传票 → 传票.pdf
```
**重命名示例**:
| 原始 | 重命名后 |
|------|----------|
| `传票(张三与李四合同纠纷)_20260405收.pdf` | `传票.pdf` |
| `起诉状(合并).pdf` | `起诉状.pdf` |
| `起诉状(素)-要素式起诉状(合并).pdf` | `起诉状(要素式).pdf` |
| `应诉通知书(自贸法庭).pdf` | `应诉通知书.pdf` |
| `E法桥平台使用告知书(xxx)_20260405收.pdf` | `E法桥平台使用告知书.pdf` |
---
## 内部归档格式
每次处理完成后在 `archive/` 下创建 JSON 记录,格式详见 [`references/archive-format.md`](references/archive-format.md)。
---
## 常见法院短信格式参考
### 文书送达短信
```text
【xx市人民法院】张三,您好!您有(2025)苏0981民初1234号案件文书送达,
请点击链接查收:
https://zxfw.court.gov.cn/zxfw/#/pagesAjkj/app/wssd/index?qdbh=DEMO1&sdbh=DEMO2&sdsin=DEMO3
如非本人操作请联系法院。
```
### 立案通知短信
```text
【xx市xx区人民法院】您好,您提交的立案材料已审核通过。
案号:(2025)京0105民初54321号
请及时缴纳诉讼费用。
```
### 开庭提醒短信
```text
【xx市xx区人民法院】提醒:您有(2025)苏0508民初567号案件,
定于2025年3月15日上午9:30在第3法庭开庭,请准时到庭。
```
---
## 故障排除
| 问题 | 解决方案 |
| --- | --- |
| 短信无法识别类型 | 展示原文,请用户确认类型后继续 |
| 案号提取失败 | 手动输入案号 |
| 当事人识别不准 | 提示用户确认/修正当事人列表 |
| 无匹配案件 | 提供三个选项:选已有/新建/暂存 |
| Playwright 下载超时 | 检查网络连接,尝试刷新页面重试 |
| 页面需要验证码 | 通知用户,暂停等待手动处理 |
| 下载文件损坏 | 清理临时目录,重新尝试下载 |
| 目标目录不存在 | 自动创建对应目录 |
---
## 配置
无额外配置需求。解析规则参考 `references/sms-patterns.json`。
如需修改解析规则(添加新文书标题、调整正则等),编辑该 JSON 文件即可。
---
## 🔄 变更历史
完整变更日志见 [CHANGELOG.md](CHANGELOG.md)。归属声明见 [references/ATTRIBUTION.md](references/ATTRIBUTION.md)。
More from cat-xierluo/legal-skills
- clawhub-sync将本地开发的 Skills 批量同步到 ClawHub 平台。支持智能 .gitignore 过滤、白名单控制、增量同步、单个 skill 同步。本技能应在用户需要将本地 skills 发布到 ClawHub、批量同步技能、检查发布状态时使用。
- code2patent从已开发代码项目中提取技术实现证据,围绕候选专利方案生成技术交底书,并以“权利要求布局卡 → 发明专利初稿”两步法继续生成接近可申报版的中国发明专利起草材料。触发场景包括:读取代码仓库后撰写技术交底书、将人工总结的专利方案映射到具体实现、从代码中挖掘可专利技术方案、为专利代理师准备权利要求布局和发明专利初稿。
- course-generator从多个文献内容中系统化提取并生成结构化课程。支持 1-100+ 个文献文件,智能识别内容类型(转录/文献/混合),自动进行主题识别、课程大纲生成、总览与章节内容撰写。采用可选模块架构,适应不同类型内容(理论/实践/案例/历史等)。本技能应在用户需要将多个文献整理为系统化课程、生成学习材料、处理转录内容、或从复杂文稿中提取结构化内容时使用。
- de-ai-polish检测并去除文章中的AI化表述模式,用于写作润色、文本优化、去AI腔。
- douyin-batch-download抖音视频批量下载工具 - 基于 F2 框架实现高效、增量的视频下载功能。支持单个/批量博主下载,自动 Cookie 管理,差量更新机制。本技能应在用户需要批量下载特定博主视频、服务器部署自动化下载、或定期更新视频库时使用。
- funasr-transcribe使用本地 FunASR 服务将音频或视频文件转录为带时间戳的 Markdown 文件,支持 mp4、mov、mp3、wav、m4a 等常见格式。本技能应在用户需要语音转文字、会议记录、视频字幕、播客转录时使用。
- git-batch-commit智能 Git 批量提交工具。当用户说 "git 提交"、"git commit"、"批量提交"、"拆分提交"、"整理提交" 时使用,或者当用户暂存了多个不同类型的文件需要分开提交时使用。自动将混合的文件修改按类型分类(依赖管理、文档更新、license 文件、配置、源代码等),并创建多个清晰聚焦的提交,使用标准化的提交信息格式。帮助保持清晰的 Git 历史,确保每个提交都有单一、明确的目的。使用英文前缀(docs:、feat:、fix: 等)加中文内容,支持 GitHub 彩色标签显示。
- github-star-managerGitHub Star 项目管理工具,支持从内容自动发现并 Star 项目,同步追踪更新,生成可视化 Dashboard
- legal-proposal-generator根据案件材料或沟通记录生成各类法律服务文档(诉讼方案、咨询报告、非诉方案、建议书、沟通报告、案件分析摘要等)。本技能应在用户需要将案件材料、咨询记录或沟通内容整理为专业法律文档时使用。
- legal-qa-extractor从律师与客户沟通记录中提取有价值的法律问答对,生成结构化知识库内容。本技能应在用户需要整理客户咨询记录、从对话中提取可复用法律知识、创建问答知识库、或准备内容营销素材时使用。支持严格客户信息脱敏处理。