mcpField
F
Finding Open Access Papers

Finding Open Access Papers

github.com/kthorn生产力13165 次安装53 周前更新
代码仓库

关于 Finding Open Access Papers

Finding Open Access Papers 是一项利用 Unpaywall 查找论文合法开放版本的研究技能,适用于出版商页面受付费墙限制且需要全文的场景。它根据 DOI 查询开放版本及来源,并区分已发表版本、已接受稿和预印本。

主要功能

  1. 01通过 DOI 查询开放获取状态
  2. 02获取推荐开放版本及 PDF 链接
  3. 03列出多个开放获取来源
  4. 04识别已发表稿、已接受稿和预印本
  5. 05提供错误处理与请求缓存建议

适用场景

  1. 01论文 DOI 页面遇到付费墙时查找全文
  2. 02PubMed Central 中没有全文时寻找开放版本
  3. 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. 按版本优先排序

如果有多个位置:

优先顺序:

  1. 来自出版商或 PMC 的 publishedVersion
  2. 来自机构知识库的 acceptedVersion
  3. 来自预印本服务器(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 字段
下载 PDFcurl -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 中注明来源和版本
  • 继续深入分析
  • 如果没有开放获取版本:在摘要中注明,并仅根据摘要继续分析

评论

支持 Markdown