代码示例

各种编程语言的 API 使用示例

这里提供了多种编程语言的完整代码示例,帮助您快速集成 Semantic Scholar API。

Python 示例

搜索论文

import requests

API_KEY = "sk-user-your-key-here"
BASE_URL = "https://ai4scholar.net/graph/v1"

def search_papers(query, limit=10):
    url = f"{BASE_URL}/paper/search"
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    params = {
        "query": query,
        "limit": limit,
        "fields": "paperId,title,abstract,authors,year,citationCount"
    }
    
    response = requests.get(url, headers=headers, params=params)
    
    if response.status_code == 200:
        data = response.json()
        print(f"找到 {data['total']} 篇论文")
        for paper in data['data']:
            print(f"\n标题: {paper['title']}")
            print(f"年份: {paper['year']}")
            print(f"引用数: {paper['citationCount']}")
        return data
    else:
        print(f"请求失败: {response.status_code}")
        return None

# 使用示例
results = search_papers("machine learning", limit=5)

获取论文详情

def get_paper_details(paper_id):
    url = f"{BASE_URL}/paper/{paper_id}"
    headers = {
        "Authorization": f"Bearer {API_KEY}",
        "Content-Type": "application/json"
    }
    params = {
        "fields": "paperId,title,abstract,authors,year,citationCount,references,citations"
    }
    
    response = requests.get(url, headers=headers, params=params)
    
    if response.status_code == 200:
        paper = response.json()
        print(f"标题: {paper['title']}")
        print(f"年份: {paper['year']}")
        print(f"引用数: {paper['citationCount']}")
        return paper
    else:
        print(f"请求失败: {response.status_code}")
        return None

# 使用示例
paper = get_paper_details("649def34f8be52c8b66281af98ae884c09aef38b")

JavaScript 示例

搜索论文

const API_KEY = "sk-user-your-key-here";
const BASE_URL = "https://ai4scholar.net/graph/v1";

async function searchPapers(query, limit = 10) {
  const url = new URL(`${BASE_URL}/paper/search`);
  url.searchParams.append('query', query);
  url.searchParams.append('limit', limit);
  url.searchParams.append('fields', 'paperId,title,abstract,authors,year,citationCount');

  try {
    const response = await fetch(url, {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${API_KEY}`,
        'Content-Type': 'application/json',
      },
    });

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }

    const data = await response.json();
    console.log(`找到 ${data.total} 篇论文`);
    
    data.data.forEach(paper => {
      console.log(`\n标题: ${paper.title}`);
      console.log(`年份: ${paper.year}`);
      console.log(`引用数: ${paper.citationCount}`);
    });

    return data;
  } catch (error) {
    console.error('请求失败:', error);
    return null;
  }
}

// 使用示例
searchPapers("machine learning", 5);

获取论文详情

async function getPaperDetails(paperId) {
  const url = new URL(`${BASE_URL}/paper/${paperId}`);
  url.searchParams.append('fields', 'paperId,title,abstract,authors,year,citationCount');

  try {
    const response = await fetch(url, {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${API_KEY}`,
        'Content-Type': 'application/json',
      },
    });

    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }

    const paper = await response.json();
    console.log(`标题: ${paper.title}`);
    console.log(`年份: ${paper.year}`);
    return paper;
  } catch (error) {
    console.error('请求失败:', error);
    return null;
  }
}

// 使用示例
getPaperDetails("649def34f8be52c8b66281af98ae884c09aef38b");

cURL 示例

搜索论文

curl -X GET "https://ai4scholar.net/graph/v1/paper/search?query=machine%20learning&limit=5&fields=paperId,title,authors,year,citationCount" \
  -H "Authorization: Bearer sk-user-your-key-here" \
  -H "Content-Type: application/json"

获取论文详情

curl -X GET "https://ai4scholar.net/graph/v1/paper/649def34f8be52c8b66281af98ae884c09aef38b?fields=paperId,title,abstract,authors,year" \
  -H "Authorization: Bearer sk-user-your-key-here" \
  -H "Content-Type: application/json"

批量获取论文

curl -X POST "https://ai4scholar.net/graph/v1/paper/batch" \
  -H "Authorization: Bearer sk-user-your-key-here" \
  -H "Content-Type: application/json" \
  -d '{
    "ids": ["649def34f8be52c8b66281af98ae884c09aef38b", "204e3073870fae3d05bcbc2f6a8e263d9b72e776"]
  }'

错误处理

常见错误码

  • 401 Unauthorized: API 密钥无效或缺失
  • 402 Payment Required: 积分余额不足
  • 404 Not Found: 资源不存在
  • 429 Too Many Requests: 请求频率过高
  • 500 Internal Server Error: 服务器错误

错误处理示例

try:
    response = requests.get(url, headers=headers, params=params)
    response.raise_for_status()  # 抛出 HTTP 错误
    data = response.json()
except requests.exceptions.HTTPError as e:
    if response.status_code == 401:
        print("API 密钥无效")
    elif response.status_code == 402:
        print("积分余额不足,请充值")
    elif response.status_code == 429:
        print("请求过于频繁,请稍后重试")
    else:
        print(f"HTTP 错误: {e}")
except requests.exceptions.RequestException as e:
    print(f"请求异常: {e}")

最佳实践

1. 使用环境变量存储密钥

import os
API_KEY = os.getenv('SEMANTIC_SCHOLAR_API_KEY')

2. 添加重试逻辑

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

session = requests.Session()
retry = Retry(total=3, backoff_factor=0.3)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)

3. 请求日志记录

import logging

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

logger.info(f"正在搜索: {query}")
logger.info(f"剩余积分: {response.headers.get('X-Credits-Remaining')}")