关于 Finding Open Access Papers
Finding Open Access Papers 是一项利用 Unpaywall 查找论文合法开放版本的研究技能,适用于出版商页面受付费墙限制且需要全文的场景。它根据 DOI 查询开放版本及来源,并区分已发表版本、已接受稿和预印本。
主要功能
- 01通过 DOI 查询开放获取状态
- 02获取推荐开放版本及 PDF 链接
- 03列出多个开放获取来源
- 04识别已发表稿、已接受稿和预印本
- 05提供错误处理与请求缓存建议
适用场景
- 01论文 DOI 页面遇到付费墙时查找全文
- 02PubMed Central 中没有全文时寻找开放版本
- 03为高相关性论文查找可用 PDF
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ kthorn/ research-superpower --skill finding-open-access-papers安装后在 Claude Code 中输入/finding-open-access-papers确认已加载。
详细介绍
查找开放获取论文
概述
使用 Unpaywall 查找合法开放获取的论文版本,这些论文可能看起来被付费墙挡住了。
**核心原则:**许多被付费墙挡住的论文都有免费版本(预印本、作者手稿、机构知识库)。Unpaywall 可以找到这些版本。
使用时机
在以下情况下使用此技能:
- DOI 解析遇到付费墙
- PubMed Central 中没有这篇论文
- 出版商网站要求订阅
- 需要获取高度相关论文的全文(评分 ≥7)
在放弃获取全文之前使用
Unpaywall API
简单的 REST API,无需身份验证即可合理使用
基本请求
curl "https://api.unpaywall.org/v2/DOI?email=YOUR_EMAIL"
参数:
DOI- 论文的 DOI(必要时进行 URL 编码)email- 用户的邮箱(必填,用于礼貌联系)
重要:在研究会话开始时询问用户的邮箱。不要使用 [email protected] 或 [email protected] 等占位邮箱。
示例:
curl "https://api.unpaywall.org/v2/10.1038/[email protected]"
响应格式
{
"doi": "10.1038/nature12373",
"title": "Paper Title",
"is_oa": true,
"best_oa_location": {
"url": "https://europepmc.org/articles/pmc3858213",
"url_for_pdf": "https://europepmc.org/articles/pmc3858213?pdf=render",
"version": "publishedVersion",
"license": "cc-by",
"host_type": "repository"
},
"oa_locations": [
{
"url": "https://europepmc.org/articles/pmc3858213",
"version": "publishedVersion"
},
{
"url": "https://arxiv.org/abs/1234.5678",
"version": "submittedVersion"
}
]
}
关键响应字段
is_oa(布尔值)
true- 有开放获取版本false- 未找到免费版本
best_oa_location(对象或 null)
- Unpaywall 推荐的最佳开放获取来源
- 优先选择已发表版本而非预印本
- 如有 PDF URL,则会包含在内
oa_locations(数组)
- 所有已知的开放获取位置
- 包含知识库、预印本服务器和机构网站
- 按质量/版本排序
version 类型:
publishedVersion- 最终发表版本(最佳)acceptedVersion- 作者已接受的手稿(良好)submittedVersion- 同行评审前的预印本(有用)
实现模式
1. 遇到付费墙后查询 Unpaywall
# Try DOI first
curl -L "https://doi.org/10.1234/example.2023"
# If paywall detected (403, subscription required, etc):
curl "https://api.unpaywall.org/v2/10.1234/[email protected]"
2. 提取最佳 URL
# Parse JSON response
response=$(curl -s "https://api.unpaywall.org/v2/DOI?email=EMAIL")
# Check if OA available
is_oa=$(echo $response | jq -r '.is_oa')
if [ "$is_oa" = "true" ]; then
# Get best PDF URL
pdf_url=$(echo $response | jq -r '.best_oa_location.url_for_pdf // .best_oa_location.url')
# Download
curl -L -o "papers/paper.pdf" "$pdf_url"
fi
3. 向用户报告
找到 OA 时:
⚠️ Paper behind paywall at publisher
✓ Found open access version via Unpaywall!
Source: Europe PMC (published version)
PDF: https://europepmc.org/articles/pmc3858213?pdf=render
→ Downloading...
未找到 OA 时:
⚠️ Paper behind paywall at publisher
✗ No open access version found via Unpaywall
Options:
- Request via institutional access
- Contact authors for preprint
- Continue with abstract only
4. 按版本优先排序
如果有多个位置:
优先顺序:
- 来自出版商或 PMC 的
publishedVersion - 来自机构知识库的
acceptedVersion - 来自预印本服务器(arXiv、bioRxiv)的
submittedVersion
与 evaluating-paper-relevance 集成
添加到全文获取工作流:
Stage 2: Fetch Full Text
Try in order:
A. PubMed Central (free full text)
B. DOI resolution → If paywall, try Unpaywall
C. Unpaywall direct lookup
D. Preprints (bioRxiv, arXiv)
更新后的工作流:
# 1. Try PMC
pmc_result=$(curl "https://eutils.ncbi.nlm.nih.gov/...")
if has_pmc_fulltext; then
fetch_pmc
exit 0
fi
# 2. Try DOI
doi_result=$(curl -L "https://doi.org/$doi")
if is_paywall; then
# 3. Try Unpaywall
unpaywall_result=$(curl "https://api.unpaywall.org/v2/$doi?email=$EMAIL")
if has_oa; then
fetch_unpaywall_pdf
exit 0
fi
fi
# 4. No full text available
report_no_fulltext
速率限制
免费版(需提供邮箱):
- 每天 100,000 次请求
- 没有严格的速率限制,但请合理使用
- 请求中必须包含邮箱
最佳实践:
- 请求之间延迟 100 ms
- 缓存响应(不要重复查询同一 DOI)
- 只查询实际需要的论文
Python 辅助示例
import requests
import time
def find_open_access(doi, email):
"""
Find open access version via Unpaywall
Returns: (pdf_url, version, source) or (None, None, None)
"""
url = f"https://api.unpaywall.org/v2/{doi}"
params = {"email": email}
try:
response = requests.get(url, params=params, timeout=10)
response.raise_for_status()
data = response.json()
if not data.get('is_oa'):
return None, None, None
best_loc = data.get('best_oa_location')
if not best_loc:
return None, None, None
pdf_url = best_loc.get('url_for_pdf') or best_loc.get('url')
version = best_loc.get('version', 'unknown')
source = best_loc.get('host_type', 'unknown')
return pdf_url, version, source
except Exception as e:
print(f"Error checking Unpaywall for {doi}: {e}")
return None, None, None
# Usage
doi = "10.1038/nature12373"
pdf_url, version, source = find_open_access(doi, "[email protected]")
if pdf_url:
print(f"Found {version} at {source}")
print(f"PDF: {pdf_url}")
# Download PDF
response = requests.get(pdf_url)
with open(f'papers/{doi.replace("/", "_")}.pdf', 'wb') as f:
f.write(response.content)
else:
print("No open access version found")
time.sleep(0.1) # Rate limiting
常见来源
知识库:
- Europe PMC / PubMed Central
- 机构知识库(大学网站)
- PubMed Central 国际镜像
预印本服务器:
- bioRxiv(生物学)
- medRxiv(医学)
- arXiv(物理、计算机科学、数学)
- ChemRxiv(化学)
出版商网站:
- 开放获取期刊
- 混合期刊(订阅期刊中的 OA 文章)
- 延迟开放获取(禁运期已结束)
错误处理
未找到 DOI:
{
"error": "true",
"message": "DOI not found"
}
→ 检查 DOI 格式,尝试其他标识符
网络错误:
- 使用指数退避重试
- 最多尝试 3 次
- 如果全部失败,向用户报告
响应格式错误:
- 检查是否有
is_oa字段 - 如果缺少
best_oa_location,则回退到oa_locations数组
快速参考
| 任务 | 命令 |
|---|---|
| 检查是否有 OA 版本 | curl "https://api.unpaywall.org/v2/DOI?email=EMAIL" |
| 获取最佳 PDF URL | 解析 .best_oa_location.url_for_pdf |
| 列出所有 OA 来源 | 解析 .oa_locations[] |
| 检查版本类型 | 查看 .version 字段 |
| 下载 PDF | curl -L -o paper.pdf "$pdf_url" |
集成点
调用方:
evaluating-paper-relevance- 全文不在 PMC 中时answering-research-questions- 针对高度相关的论文
更新:
papers-reviewed.json- 记录是否找到 OA 版本SUMMARY.md- 包含 OA 来源信息
常见错误
使用占位邮箱: 使用 [email protected] 或 [email protected] → 请用户提供真实邮箱
未填写邮箱: 必填参数,否则请求将失败
检查每篇论文: 仅在需要时检查(评分 ≥7,且无 PMC)
忽略版本类型: 已发表版本优于预印本
仅使用单一来源: 检查 oa_locations 数组,查找其他选项
未进行速率限制: 即使没有硬性限制,也要添加延迟
成功标准
满足以下条件即为成功:
- 找到并下载付费墙论文的开放获取版本
- 记录版本类型(已发表/已接受/已提交)
- 告知用户来源和版本
- 如果没有开放获取版本,则提供备用选项
后续步骤
找到开放获取版本后:
- 将 PDF 下载到 papers/ 文件夹
- 在 SUMMARY.md 中注明来源和版本
- 继续深入分析
- 如果没有开放获取版本:在摘要中注明,并仅根据摘要继续分析