如何在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
相关产品推荐
相关产品推荐

