Use when you have a written implementation plan to execute in a separate session with review checkpoints
npx skills add xulei-shl/cnki-journal-fetcher --skill "lis-journals-fetcher"
Install specific skill from multi-skill repository
# Description
面向图书馆学领域的多源期刊论文追踪工具,支持 CNKI、人大报刊复印资料、独立网站期刊。自动获取、筛选、总结论文数据。触发方式:说'获取期刊论文'、期刊名+年期、或 /lis-journals-fetcher
# SKILL.md
name: lis-journals-fetcher
description: "面向图书馆学领域的多源期刊论文追踪工具,支持 CNKI、人大报刊复印资料、独立网站期刊。自动获取、筛选、总结论文数据。触发方式:说'获取期刊论文'、期刊名+年期、或 /lis-journals-fetcher"
allowed-tools: "Read, Edit, Write, Bash, Glob, Grep, AskUserQuestion, Task"
多源期刊论文获取工具
支持 CNKI、人大报刊复印资料、独立网站期刊的统一论文获取工具。
概述
读取期刊类型配置,通过 Grep 动态搜索确定期刊类型和来源,根据发行周期和上次获取记录计算目标年期,调用对应的爬虫 Subagent 获取论文数据,自动更新状态。
支持的期刊类型
| 类型标识 | 名称 | 期刊数量 | 爬虫方式 |
|---|---|---|---|
| cnki | CNKI 期刊 | 15 种 | cnki-spider-agent |
| rdfybk | 人大报刊复印资料 | 3 种 | rdfybk-spider-agent |
| lis | 独立网站期刊 | 1 种 | lis-spider-agent |
📖 详细的类型配置和 URL 规则,请参见 reference/journal-types-config.md
触发识别
自然语言触发模式
当用户输入包含以下模式时,自动触发本 skill:
| 模式类型 | 触发条件 | 示例 |
|---|---|---|
| 通用关键词 | 包含"获取期刊论文"、"下载最新期刊"、"爬取期刊" | "获取期刊论文" |
| 期刊名 + 动作 | 期刊名 + "论文/期刊"相关词 | "中国图书馆学报最新论文"、"图书情报工作第5期" |
| 年期指定 | 期刊名 + "最新X期"/"第X期"/"202X年第X期" | "获取图书馆学情报学第5期" |
📖 详细的期刊匹配规则和类型识别流程,请参见 步骤 2:期刊类型识别与选择
命令触发模式
直接调用命令:
/cnki-journals-fetcher
快速开始
使用示例
命令触发:
/cnki-journals-fetcher
自然语言触发:
获取中国图书馆学报最新论文
图书情报工作第10期
帮我下载图书馆学情报学最新2期
执行流程
触发(命令/自然语言)
↓
解析期刊名和年期参数
↓
┌─────────────────────────────────────────┐
│ 期刊类型识别 → Grep 搜索所有期刊信息文件 │
│ → 0个: 显示类型选择 │
│ → 1个: 直接选中 │
│ → 多个: 显示列表选择 │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ 年期解析 → 已指定: 使用指定年期 │
│ → 未指定: 智能推荐年期 │
└─────────────────────────────────────────┘
↓
显示爬取计划(包含推荐理由)
↓
用户确认(单次交互)
↓
前置检查并创建输出目录
↓
调用爬虫 Subagent 执行爬取 ⭐
↓
自动调用 paper-filter subagent 过滤论文
↓
人工修改确认(可选)
↓
调用 filter_papers.py 生成筛选文件
↓
自动调用 paper-summarizer subagent 生成总结报告
↓
MEMORY.md 更新(条件触发)
↓
更新状态 + 显示结果总结
工作流程
步骤 1:读取期刊类型配置
读取 {baseDir}/.claude/skills/cnki-journals-fetcher/reference/journal-types-config.md,解析类型定义。
提取信息:
- 类型标识、名称、期刊信息文件、爬虫 Subagent、URL 列名
步骤 2:期刊类型识别与选择
2.1 用户已指定期刊名
使用 Grep 动态搜索所有期刊信息文件:
Grep(
pattern=期刊名,
path="{baseDir}/.claude/skills/cnki-journals-fetcher/reference/journals-list",
glob="*.md",
output_mode="files_with_matches"
)
处理结果:
| 匹配数 | 处理方式 |
|---|---|
| 0 个 | 显示完整期刊列表(按类型分组) |
| 1 个 | 直接使用该类型,进入期刊选择 |
| 多个 | 显示匹配项,让用户选择类型 |
多类型匹配示例:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔍 期刊类型识别
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
找到 "图书情报" 相关期刊:
[1] CNKI 期刊 - 图书情报知识 (cnki-期刊信息.md)
[2] 独立网站期刊 - 图书情报工作 (独立网站-期刊信息.md)
请选择期刊类型 [1-2]:
2.2 用户未指定期刊名
显示类型选择菜单:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📚 多源期刊论文获取工具
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
请选择期刊类型:
[1] CNKI 期刊 (15 种)
[2] 人大报刊复印资料 (3 种)
[3] 独立网站期刊 (1 种)
请选择 [1-3]:
使用 AskUserQuestion 工具确认。
2.3 期刊选择
确定类型后,读取对应的期刊信息文件:
- CNKI → journals-list/cnki-期刊信息.md
- 人大报刊 → journals-list/人大报刊-期刊信息.md
- 独立网站 → journals-list/独立网站-期刊信息.md
期刊列表显示:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📚 CNKI 期刊列表 (共 15 种)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
双月刊 (9 种):
[1] 中国图书馆学报 上次获取: 2025-6 ✓
[2] 图书情报知识 上次获取: 2025-6 ✓
...
月刊 (6 种):
[4] 图书馆论坛 上次获取: 2025-12 ✓
...
请选择期刊 (输入编号或期刊名称):
显示逻辑:
- 按发行周期分组显示
- 使用数据文件中的原始编号
- 显示"上一次获取年期"状态,已获取的标注 ✓
步骤 2.5:年期解析
解析用户输入中的年期参数:
| 输入模式 | 解析逻辑 | 示例 |
|---|---|---|
| "最新X期" | 从当前年倒推X期 | "最新2期" → 2025-5, 2025-6 |
| "YYYY年第X期" / "YYYY-X" | 指定年期 | "2025-5" → 2025年5期 |
| "第X期" / "X期" | 当前年份 + 期号 | "第5期" → 2025-5 |
| 无年期参数 | 进入步骤3自动计算 | - |
步骤 3:智能计算目标年期
当用户未指定年期时,根据发行周期、上次获取记录、当前日期智能推荐目标年期。
详细推荐策略、算法实现、展示格式:参见 reference/period-recommendation.md
核心策略:
1. 年初(1-2月)→ 推荐上年最后一期
2. 月初(1-7号)→ 推荐上一期
3. 有上次记录 → 增量推荐
4. 首次爬取 → 推荐上一期
支持的发行周期:月刊、双月刊、季刊、半月刊
步骤 4:显示爬取计划
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 爬取任务确认
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
期刊: 中国图书馆学报 (CNKI, 双月刊)
网址: navi.cnki.net/knavi/journals/ZGTS/detail
上次获取: 2025-4
本次爬取: 2025-5, 2025-6
预计保存: outputs/中国图书馆学报/2025-5.json, 2025-6.json
是否获取论文摘要?
[1] 仅论文列表 (推荐,快速) ⭐
[2] 包含摘要详情 (较慢)
确认执行?
[3] 确认执行
[4] 修改参数
[5] 取消
使用 AskUserQuestion 工具确认。先询问是否获取摘要,再询问是否执行。
步骤 5:前置目录检查
在执行爬虫前,先检查目录是否存在,不存在则创建:
[ -d "outputs/{期刊名}" ] || mkdir -p "outputs/{期刊名}"
重要:此步骤必须在执行爬虫之前完成,避免因目录不存在导致爬虫执行失败后重试。
步骤 6:调用爬虫 Subagent
根据期刊类型调用对应的爬虫 Subagent,直接构造命令而非传递自然语言参数:
# 构造命令参数
details_flag = "-d" if get_details else "--no-details"
# CNKI 期刊
Task(
subagent_type="cnki-spider-agent",
description="执行CNKI期刊爬取",
prompt=f"""
请执行以下爬虫命令:
python {baseDir}/.claude/skills/cnki-journals-fetcher/scripts/cnki_spider.py \
-u "{url}" \
-y {year} -i {issue} {details_flag} \
-o outputs/{期刊名}/{年-期}.json
"""
)
# 人大报刊复印资料
Task(
subagent_type="rdfybk-spider-agent",
description="执行人大报刊复印资料爬取",
prompt=f"""
请执行以下爬虫命令:
python {baseDir}/.claude/skills/cnki-journals-fetcher/scripts/rdfybk_spider.py \
-j {code} -y {year} -i {issue} {details_flag} \
-o outputs/{期刊名}/{年-期}.json
"""
)
# 独立网站期刊 (图书情报工作)
Task(
subagent_type="lis-spider-agent",
description="执行独立网站期刊爬取",
prompt=f"""
请执行以下爬虫命令:
python {baseDir}/.claude/skills/cnki-journals-fetcher/scripts/lis_spider.py \
-j {期刊代码} -y {year} -i {issue} -v {volume} {details_flag} \
-o outputs/{期刊名}/{年-期}.json
"""
)
📖 各爬虫 Subagent 详细说明:
- CNKI: .claude/agents/cnki-spider-agent.md
- 独立网站: .claude/agents/lis-spider-agent.md
- 人大报刊: .claude/agents/rdfybk-spider-agent.md
处理爬取结果:
- 成功:记录成功年期和论文数量
- 空结果:进入回退流程
- 错误:显示错误信息,询问是否继续
步骤 7:回退机制
当目标年期爬取不到(空结果)时:
⚠️ 2026-1 期爬取失败(可能尚未发布)
可用操作:
[1] 尝试回退到上一期
[2] 手动输入年期
[3] 跳过此期
请选择 [1-3]:
使用 AskUserQuestion 工具交互式处理。
步骤 8:更新状态
爬取成功后,使用 Edit 工具更新对应的期刊信息文件。
找到对应期刊行,更新"上一次获取年期"列:
| 中国图书馆学报 | https://... | 双月 | 1-6 | 2025-6 |
步骤 9:自动论文过滤
爬取成功后,自动调用 paper-filter subagent 对获取的论文进行智能过滤标注。
调用格式:
Task(
subagent_type="paper-filter",
description="过滤标注论文",
prompt="直接执行论文标注,跳过确认步骤。读取 {baseDir}/MEMORY.md 获取用户研究兴趣,然后对 outputs/{期刊名}/{年-期}.json 中的论文进行过滤标注,添加 interest_match、match_reasons、relevance_score 字段,并直接保存回原文件。"
)
📖 paper-filter subagent 详细说明:参见 .claude/agents/paper-filter.md
错误处理:
- 如果 paper-filter 执行失败,显示警告但继续完成主流程
- 如果 MEMORY.md 不存在或配置不完整,提示用户先配置研究兴趣
步骤 9.2:人工修改确认
在 paper-filter 完成后,生成筛选文件前,提供人工修改选项。
⚠️ 重要:此步骤严禁使用 AskUserQuestion 工具!
数据处理要求(必须执行):
-
首先使用 Read 工具读取完整的 JSON 文件
python # 读取实际数据文件 papers_json = read("outputs/{期刊名}/{年-期}.json") -
解析每篇论文的实际状态
interest_match:布尔值,是否相关match_reasons:数组,匹配的关键词-
relevance_score:浮点数,相关度 -
动态生成过滤结果列表
```python
# 伪代码 - 按相关度排序
related = [p for p in papers if p['interest_match'] == true]
unrelated = [p for p in papers if p['interest_match'] == false]
related.sort(key=lambda x: x['relevance_score'], reverse=True)
unrelated.sort(key=lambda x: x['relevance_score'], reverse=True)
# 动态输出列表(基于实际数据,不要依赖 paper-filter 的摘要报告)
for i, paper in enumerate(related, 1):
print(f"[{i}] {paper['title']}")
print(f" 匹配: {', '.join(paper['match_reasons'])}")
print(f" 相关度: {paper['relevance_score']}")
```
- 正确的编号映射
- 显示的编号是显示顺序(1, 2, 3...)
- 切换时需要通过 JSON 中的
title或pages定位论文 - 不要假设"数组索引 = 编号 - 1",因为列表是排序后的
输出格式:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 论文过滤结果
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 过滤统计
┌─────────────────────────────────────┐
│ 总论文数 │ 12 篇 │
│ 相关论文 │ 9 篇 ⭐ (75%) │
│ 匹配关键词 │ AI应用、知识组织、对话式搜索 │
└─────────────────────────────────────┘
✅ 相关论文 (9篇,按相关度排序):
[1] 面向科技实体抽取任务的大小模型少样本数据协同训练研究
匹配: 大模型、大小模型协同、AI应用研究、实体抽取-知识组织相关
相关度: 0.85
[2] AIGC环境下对话式搜索与传统搜索的用户行为及学习效果比较研究
匹配: AIGC、AI应用研究、生成式AI
相关度: 0.80
... (继续列出所有相关论文)
❌ 不相关论文 (3篇,按相关度排序):
[1] 1974—2024年全球信息素养教育研究主题的识别、演进与展望
原因: 信息素养教育-非核心关注
相关度: 0.10
... (继续列出所有不相关论文)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
修改命令 (直接输入):
直接继续 - 跳过修改,使用自动过滤结果
完成 - 结束修改,进入下一步
论文标题 - 切换指定论文的相关状态 (可输入部分标题匹配)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
请输入命令:
处理逻辑(循环等待用户输入):
-
显示结果后,直接等待用户输入(不使用任何工具,暂停等待)
-
根据用户输入执行:
| 用户输入 | 处理方式 |
|---|---|
直接继续 |
设置 user_modified = false,直接进入步骤 9.5 |
完成 |
设置 user_modified = true,进入步骤 9.5 |
| 论文标题(部分匹配) | 读取 JSON,切换对应论文的相关状态,刷新显示后继续等待输入 |
- 论文切换逻辑:
- 使用 Read 读取 JSON 文件
- 通过标题匹配定位论文(支持部分匹配)
- 切换
interest_match状态(true ↔ false) - 如果设为 true,根据论文内容设置
match_reasons和relevance_score - 如果设为 false,清空
match_reasons并将relevance_score设为 0 - 使用 Write 更新文件
- 重新读取 JSON 并刷新显示当前状态
- 继续等待用户输入
错误处理:
- 如果标题匹配不到论文,提示"未找到匹配的论文,请重新输入"
- 如果匹配到多篇论文,提示"匹配到多篇论文,请输入更具体的标题"
- 如果 JSON 文件格式损坏,提示错误并跳过修改步骤
步骤 9.5:生成筛选文件
论文过滤完成后,调用 filter_papers.py 脚本生成独立的筛选文件。
执行命令:
python {baseDir}/.claude/skills/cnki-journals-fetcher/scripts/filter_papers.py \
-i outputs/{期刊名}/{年-期}.json
步骤 10:自动生成论文总结
筛选文件生成后,自动调用 paper-summarizer subagent 生成结构化的 Markdown 总结报告。
调用格式:
Task(
subagent_type="paper-summarizer",
description="生成论文总结报告",
prompt="读取 outputs/{期刊名}/{年-期}-filtered.json,生成论文总结报告并保存到 outputs/{期刊名}/{年-期}-summary.md"
)
📖 paper-summarizer subagent 详细说明:参见 .claude/agents/paper-summarizer.md
步骤 10.2:MEMORY.md 更新(条件触发)
触发条件:仅当 user_modified = true 时执行(即用户在步骤 9.2 中选择了修改过滤标签)
调用 memory-updater-agent,使用模式 C(指定期刊年期)执行更新。
📖 memory-updater skill 详见:.claude/skills/memory-updater/SKILL.md
步骤 11:显示结果总结
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 爬取任务完成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 任务统计
┌─────────────────────────────────────┐
│ 期刊名称 │ 中国图书馆学报 │
│ 类型 │ CNKI │
│ 发行周期 │ 双月刊 │
│ 计划爬取 │ 2025-5, 2025-6 │
│ 成功获取 │ 2025-5 (12篇) │
│ 失败 │ 2025-6 (未发布) │
├─────────────────────────────────────┤
│ 状态已更新 │ 上次获取: 2025-4 → 2025-5│
│ 结果保存 │ outputs/中国图书馆学报/ │
└─────────────────────────────────────┘
🔍 论文过滤结果
┌─────────────────────────────────────┐
│ 总论文数 │ 12 篇 │
│ 相关论文 │ 5 篇 ⭐ │
│ 匹配关键词 │ 知识组织、元数据、... │
└─────────────────────────────────────┘
📁 已保存文件:
• outputs/中国图书馆学报/2025-5.json (已标注)
• outputs/中国图书馆学报/2025-5-filtered.json (筛选后)
• outputs/中国图书馆学报/2025-5-summary.md (总结报告)
输出格式
JSON 结果文件 (outputs/{期刊名}/{年-期}.json):
[
{
"year": 2025,
"issue": 6,
"title": "论文标题",
"author": "作者1; 作者2",
"pages": "1-10",
"abstract_url": "https://...",
"abstract": "论文摘要内容..."
}
]
错误处理
| 错误类型 | 处理方式 |
|---|---|
| 期刊类型配置文件不存在 | 提示检查路径 {baseDir}/.claude/skills/cnki-journals-fetcher/reference/journal-types-config.md |
| 期刊信息文件不存在 | 提示检查对应的期刊信息文件路径 |
| Subagent 执行失败 | 显示错误信息,询问是否继续 |
| 网络超时 | 重试 1 次,仍失败则跳过并记录 |
| 年期格式解析错误 | 提示检查"上一次获取年期"格式 |
常量定义
| 常量 | 值 |
|---|---|
| 类型配置路径 | {baseDir}/.claude/skills/cnki-journals-fetcher/reference/journal-types-config.md |
| 期刊信息目录 | {baseDir}/.claude/skills/cnki-journals-fetcher/reference/journals-list/ |
| 年期推荐策略 | {baseDir}/.claude/skills/cnki-journals-fetcher/reference/period-recommendation.md |
| 筛选脚本路径 | {baseDir}/.claude/skills/cnki-journals-fetcher/scripts/filter_papers.py |
| 结果输出路径 | {baseDir}/outputs/{期刊名}/{年-期}.json |
| 超时时间 | 120000ms (2分钟) |
扩展性
添加新期刊类型只需 3 步,无需修改主 Skill:
- 创建期刊信息文件:
reference/journals-list/{类型}-期刊信息.md - 创建爬虫 Subagent:
.claude/agents/{类型}-spider-agent.md - 在 journal-types-config.md 添加一行配置
📖 详细的扩展步骤,请参见 reference/journal-types-config.md
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.