You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中使用OAuth调用新版OCLC Classify API?

OCLC Classify API 授权与批量ISBN处理指南

一、先搞懂「Secure Endpoint」是什么

之前的Classify API是公开可直接访问的,现在改成了安全端点(Secure Endpoint)——意思是所有请求必须携带有效的身份验证凭证(Access Token),否则会直接返回Unauthorized错误。OCLC采用OAuth 2.0的客户端凭证模式生成这个凭证,你拿到的Client ID和Client Secret(WSKey)就是生成Token的核心密钥。

二、Python中配置授权并调用API的核心步骤

1. 先获取Access Token

用你的Client ID和Secret向OCLC授权服务器请求Token,这个Token有1小时有效期,过期后需要重新获取。

2. 携带Token调用API

拿到Token后,在请求Classify API的HTTP请求头里添加这个Token,就能正常获取数据。

三、完整代码示例

基础示例(单OCN查询)

import requests

# 替换成你的Client ID和Client Secret
CLIENT_ID = "你的专属Client ID"
CLIENT_SECRET = "你的专属Client Secret"

# 1. 获取Access Token
token_url = "https://oauth.oclc.org/token"
token_payload = {
    "grant_type": "client_credentials",
    "scope": "WorldCatMetadataAPI"
}
token_response = requests.post(token_url, auth=(CLIENT_ID, CLIENT_SECRET), data=token_payload)
token_data = token_response.json()
access_token = token_data.get("access_token")

if not access_token:
    print("Token获取失败:", token_data)
    exit()

# 2. 调用Classify API
classify_url = "https://metadata.api.oclc.org/classify/?oclc=57358293&summary=true"
headers = {
    "Authorization": f"Bearer {access_token}"
}
classify_response = requests.get(classify_url, headers=headers)

if classify_response.status_code == 200:
    print(classify_response.json())
else:
    print("请求失败:", classify_response.status_code, classify_response.text)

批量处理ISBN获取OCN的示例

import requests
import time

# 替换成你的凭证和文件路径
CLIENT_ID = "你的专属Client ID"
CLIENT_SECRET = "你的专属Client Secret"
ISBN_FILE_PATH = "isbn_list.txt"  # 每行一个ISBN的文本文件

def get_access_token():
    token_url = "https://oauth.oclc.org/token"
    payload = {
        "grant_type": "client_credentials",
        "scope": "WorldCatMetadataAPI"
    }
    response = requests.post(token_url, auth=(CLIENT_ID, CLIENT_SECRET), data=payload)
    if response.status_code == 200:
        return response.json().get("access_token")
    else:
        raise Exception(f"Token获取失败: {response.text}")

def get_ocn_by_isbn(isbn, access_token):
    classify_url = f"https://metadata.api.oclc.org/classify/?isbn={isbn}&summary=true"
    headers = {"Authorization": f"Bearer {access_token}"}
    response = requests.get(classify_url, headers=headers)
    if response.status_code == 200:
        data = response.json()
        # 根据API返回结构提取OCN,不同书籍的返回结构可能有差异
        ocn = data.get("oclc") or data.get("works", [{}])[0].get("oclc")
        return ocn
    else:
        print(f"ISBN {isbn} 查询失败: {response.status_code} {response.text}")
        return None

def batch_process_isbns(file_path):
    access_token = get_access_token()
    with open(file_path, "r", encoding="utf-8") as f:
        isbns = [line.strip() for line in f if line.strip()]
    
    results = []
    for index, isbn in enumerate(isbns):
        # 每处理20个ISBN重新获取一次Token,避免过期
        if index % 20 == 0:
            access_token = get_access_token()
        ocn = get_ocn_by_isbn(isbn, access_token)
        results.append({"ISBN": isbn, "OCN": ocn})
        print(f"处理完成:ISBN {isbn} → OCN {ocn}")
        # 添加延迟避免触发限流
        time.sleep(1)
    
    # 保存结果到文件
    with open("isbn_ocn_results.txt", "w", encoding="utf-8") as f:
        for res in results:
            f.write(f"{res['ISBN']}\t{res['OCN']}\n")
    print("批量处理完成,结果已保存到isbn_ocn_results.txt")

if __name__ == "__main__":
    batch_process_isbns(ISBN_FILE_PATH)

四、关键注意事项

  • Token有效期为1小时,批量处理时建议每处理一定数量的ISBN后重新获取Token(示例中是每20个)。
  • API返回的JSON结构可能因书籍数据不同而变化,提取OCN时需根据实际返回内容调整代码逻辑。
  • OCLC API有限流规则,建议在批量请求中添加1秒左右的延迟,避免被限制访问。

内容的提问来源于stack exchange,提问作者Melissa Belvadi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:55:15