跳到主要内容
知仓学习社ZHICANG

doi-content-negotiation

Retrieve structured metadata from any DOI via HTTP content negotiation

不碰外部(只输出文字)无严重或高危命中brycewang-stanford/Auto-Empirical-Research-Skills

它会碰到什么

扫了多少1 个文本文件,6 KB
它会碰到什么不碰外部(只输出文字)
命中总数5 处
命中统计严重 0 · 高 0 · 中 0 · 低 0

这一栏是扫描器报的事实,不是结论。命中多不等于有毒(安全工具、规则库、示例脚本本来就会包含危险写法),命中少也不等于干净。它和你手上的凭据、文件、网络有什么关系,需要你自己看。

技能内容

DOI Content Negotiation

Overview

Any DOI can return structured metadata in multiple formats through HTTP content negotiation — simply set the Accept header when requesting https://doi.org/{doi}. This is the most universal way to get citation metadata, BibTeX entries, JSON-LD, and RDF from any publisher without needing a specific API. Works for all 300M+ registered DOIs. Free, no authentication.

Usage

Basic Content Negotiation

# Get JSON citation metadata (Citeproc JSON)
curl -LH "Accept: application/vnd.citationstyles.csl+json" \
  "https://doi.org/10.1038/nature14539"

# Get BibTeX
curl -LH "Accept: application/x-bibtex" \
  "https://doi.org/10.1038/nature14539"

# Get RIS format
curl -LH "Accept: application/x-research-info-systems" \
  "https://doi.org/10.1038/nature14539"

# Get formatted citation (APA style)
curl -LH "Accept: text/x-bibliography; style=apa" \
  "https://doi.org/10.1038/nature14539"

# Get formatted citation (Chicago style)
curl -LH "Accept: text/x-bibliography; style=chicago-author-date" \
  "https://doi.org/10.1038/nature14539"

Available Formats

| Accept Header | Format | Use Case |

|--------------|--------|----------|

| application/vnd.citationstyles.csl+json | Citeproc JSON | Programmatic metadata |

| application/x-bibtex | BibTeX | LaTeX bibliography |

| application/x-research-info-systems | RIS | Reference managers |

| text/x-bibliography; style=apa | Formatted text | Direct citation |

| application/rdf+xml | RDF/XML | Linked data |

| text/turtle | Turtle RDF | Linked data |

| application/vnd.schemaorg.ld+json | Schema.org JSON-LD | Web metadata |

| application/json | DataCite JSON | DataCite DOIs |

| application/vnd.crossref.unixref+xml | Crossref XML | Full Crossref metadata |

Citation Styles

Over 9,000 CSL styles available:

# APA 7th edition
style=apa

# Chicago Manual of Style (author-date)
style=chicago-author-date

# IEEE
style=ieee

# MLA
style=modern-language-association

# Harvard
style=harvard-cite-them-right

# Vancouver (medical)
style=vancouver

# Nature
style=nature

Citeproc JSON Response

{
  "DOI": "10.1038/nature14539",
  "type": "article-journal",
  "title": "Deep learning",
  "author": [
    {"given": "Yann", "family": "LeCun"},
    {"given": "Yoshua", "family": "Bengio"},
    {"given": "Geoffrey", "family": "Hinton"}
  ],
  "container-title": "Nature",
  "volume": "521",
  "issue": "7553",
  "page": "436-444",
  "issued": {"date-parts": [[2015, 5, 28]]},
  "publisher": "Springer Science and Business Media LLC",
  "ISSN": ["0028-0836", "1476-4687"],
  "URL": "http://dx.doi.org/10.1038/nature14539",
  "abstract": "Deep learning allows computational models..."
}

Python Usage

import requests


def get_metadata(doi: str) -> dict:
    """Get structured metadata for a DOI."""
    resp = requests.get(
        f"https://doi.org/{doi}",
        headers={"Accept": "application/vnd.citationstyles.csl+json"},
        allow_redirects=True,
    )
    resp.raise_for_status()
    return resp.json()


def get_bibtex(doi: str) -> str:
    """Get BibTeX entry for a DOI."""
    resp = requests.get(
        f"https://doi.org/{doi}",
        headers={"Accept": "application/x-bibtex"},
        allow_redirects=True,
    )
    resp.raise_for_status()
    return resp.text


def get_formatted_citation(doi: str,
                            style: str = "apa") -> str:
    """Get a formatted citation string."""
    resp = requests.get(
        f"https://doi.org/{doi}",
        headers={
            "Accept": f"text/x-bibliography; style={style}",
        },
        allow_redirects=True,
    )
    resp.raise_for_status()
    return resp.text.strip()


def batch_bibtex(dois: list) -> str:
    """Generate BibTeX file for multiple DOIs."""
    entries = []
    for doi in dois:
        try:
            bib = get_bibtex(doi)
            entries.append(bib)
        except requests.HTTPError:
            entries.append(f"% Failed to resolve: {doi}")
    return "\n\n".join(entries)


# Example: get metadata
meta = get_metadata("10.1038/nature14539")
authors = ", ".join(
    f"{a['given']} {a['family']}" for a in meta.get("author", [])
)
print(f"{meta['title']}")
print(f"  Authors: {authors}")
print(f"  {meta.get('container-title')} ({meta.get('volume')})")

# Example: get BibTeX
bibtex = get_bibtex("10.1038/nature14539")
print(f"\nBibTeX:\n{bibtex}")

# Example: formatted APA citation
apa = get_formatted_citation("10.1038/nature14539", "apa")
print(f"\nAPA: {apa}")

# Example: batch export
bibliography = batch_bibtex([
    "10.1038/nature14539",
    "10.5555/3295222.3295349",
])
with open("references.bib", "w") as f:
    f.write(bibliography)

Use Cases

  1. Bibliography generation: Export BibTeX/RIS for any DOI list
  2. Citation formatting: Generate properly formatted citations
  3. Metadata extraction: Get structured metadata for data pipelines
  4. Linked data: Retrieve RDF for knowledge graph construction
  5. Verification: Confirm publication details from authoritative source

References

See Also

  • [doi-resolution-guide](../doi-resolution-guide/SKILL.md) -- Conceptual overview of DOI resolution, validation, normalization, and CrossRef API usage.

想直接用这个技能?

本站把开放许可(MIT / Apache 等)的技能按仓库打包整理到网盘,点一下转存到你自己的网盘,不用一个个从 GitHub 拉。许可未声明的技能只给原始仓库链接,不打包。