<think>我们被要求回答如何访问京东和拼多多的API进行应用开发或系统集成。注意,用户之前的问题是关于使用API替代爬虫,现在具体询问京东和拼多多。
根据已知信息,我们之前提供过淘宝和京东的API调用示例,但拼多多的API没有详细说明。现在需要补充拼多多的API接入方法。
步骤:
1. 注册开发者账号
2. 创建应用,获取API密钥
3. 阅读官方文档,了解API调用方法和参数
4. 编写代码调用API
5. 处理返回数据
对于京东,我们已有部分代码,但需要完善(特别是OAuth授权部分)。
对于拼多多,我们将提供新的代码示例。
注意:拼多多的开放平台为“拼多多开放平台”(https://open.pinduoduo.com/)
我们将分别介绍京东和拼多多的API接入步骤,并提供代码示例。
由于之前回答中已经有一部分京东的API调用,这里将完善并补充拼多多的部分。
一、京东API接入步骤:
1. 注册京东宙斯开放平台(https://jos.jd.com)
2. 创建应用,获取App Key和App Secret
3. 根据文档获取访问令牌(Access Token),京东部分API需要OAuth2.0授权
4. 调用API(参考京东API文档,例如商品搜索API)
二、拼多多API接入步骤:
1. 注册拼多多开放平台(https://open.pinduoduo.com)
2. 创建应用,获取Client ID和Client Secret
3. 获取Access Token(拼多多使用OAuth2.0授权,需要回调地址)
4. 调用API(例如:pdd.ddk.goods.search 商品搜索)
代码示例部分:
我们将分别写两个类的京东和拼多多的API调用方法,并注意错误处理。
由于用户之前的问题中提到了导出Excel,但本问题主要是关于API接入,因此我们重点放在API调用上,导出部分可以简单提及或省略(因为之前已经实现过)。
但是,为了完整性,我们可以提供一个简单的数据导出示例。
注意:京东和拼多多的API调用频率限制和费用问题,免费版通常有调用次数限制。
下面开始编写回答:</think># 京东与拼多多API接入开发指南
## 一、平台API接入流程
```mermaid
graph LR
A[注册开发者账号] --> B[创建应用]
B --> C[获取API密钥]
C --> D[阅读API文档]
D --> E[实现OAuth授权]
E --> F[调用API接口]
F --> G[数据处理]
```
## 二、京东API接入指南
### 1. 准备工作
- **注册开发者账号**:[京东宙斯开放平台](https://jos.jd.com)
- 创建应用获取凭证:
- App Key
- App Secret
- 回调URL(用于OAuth)
- 申请所需API权限(如商品、订单等)
### 2. OAuth授权流程
京东使用OAuth 2.0授权,典型流程:
```
用户访问 -> 重定向到授权页 -> 用户授权 -> 返回授权码 ->
用授权码换取Access Token -> 使用Access Token调用API
```
### 3. API调用示例(商品搜索)
```python
import requests
import hashlib
import time
class JDAPI:
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.access_token = self._get_access_token()
def _get_access_token(self):
"""获取Access Token"""
url = "https://oauth.jd.com/oauth/token"
params = {
"grant_type": "authorization_code",
"client_id": self.app_key,
"client_secret": self.app_secret,
"code": "AUTHORIZATION_CODE", # 从回调URL获取
"redirect_uri": "YOUR_CALLBACK_URL"
}
response = requests.post(url, params=params)
return response.json()["access_token"]
def _generate_sign(self, params):
"""生成API签名"""
sorted_params = sorted(params.items())
sign_str = self.app_secret + ''.join(f"{k}{v}" for k, v in sorted_params) + self.app_secret
return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
def search_goods(self, keyword, page=1):
"""商品搜索API"""
method = "jingdong.ware.product.search"
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
params = {
"method": method,
"access_token": self.access_token,
"app_key": self.app_key,
"timestamp": timestamp,
"v": "1.0",
"keyword": keyword,
"page": str(page)
}
params["sign"] = self._generate_sign(params)
try:
response = requests.get("https://api.jd.com/routerjson", params=params)
return response.json().get("data", [])
except Exception as e:
print(f"京东API调用失败: {str(e)}")
return []
```
## 三、拼多多API接入指南
### 1. 准备工作
- **注册开发者账号**:[拼多多开放平台](https://open.pinduoduo.com)
- 创建应用获取凭证:
- Client ID
- Client Secret
- 申请API权限(根据业务需求)
### 2. API调用特点
- 使用MD5签名
- 所有请求参数需按字母顺序排序
- 需要Access Token(有效期约24小时)
### 3. API调用示例(商品搜索)
```python
class PDDAPI:
def __init__(self, client_id, client_secret):
self.client_id = client_id
self.client_secret = client_secret
self.access_token = self._get_access_token()
def _get_access_token(self):
"""获取Access Token"""
url = "https://open-api.pinduoduo.com/oauth/token"
data = {
"client_id": self.client_id,
"client_secret": self.client_secret,
"grant_type": "client_credentials"
}
response = requests.post(url, data=data)
return response.json()["access_token"]
def _generate_sign(self, params):
"""生成MD5签名"""
sorted_params = sorted(params.items())
sign_str = self.client_secret + ''.join(f"{k}{v}" for k, v in sorted_params) + self.client_secret
return hashlib.md5(sign_str.encode('utf-8')).hexdigest()
def search_goods(self, keyword, page=1):
"""商品搜索API"""
api_url = "https://open-api.pinduoduo.com/api/router"
params = {
"type": "pdd.ddk.goods.search",
"client_id": self.client_id,
"access_token": self.access_token,
"timestamp": str(int(time.time())),
"keyword": keyword,
"page": page
}
params["sign"] = self._generate_sign(params)
try:
response = requests.post(api_url, data=params)
data = response.json()
return data.get("goods_search_response", {}).get("goods_list", [])
except Exception as e:
print(f"拼多多API调用失败: {str(e)}")
return []
```
## 四、系统集成最佳实践
### 1. 统一API适配层设计
```python
class EcommerceAPI:
def __init__(self, platform, credentials):
self.platform = platform
if platform == "JD":
self.api = JDAPI(credentials["app_key"], credentials["app_secret"])
elif platform == "PDD":
self.api = PDDAPI(credentials["client_id"], credentials["client_secret"])
def search(self, keyword, page=1):
return self.api.search_goods(keyword, page)
def get_order_list(self, start_time, end_time):
"""统一订单查询接口"""
if self.platform == "JD":
return self.api.get_jd_orders(start_time, end_time)
elif self.platform == "PDD":
return self.api.get_pdd_orders(start_time, end_time)
```
### 2. 错误处理与重试机制
```python
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=2, max=10))
def safe_api_call(api_method, *args):
try:
return api_method(*args)
except requests.exceptions.RequestException as e:
print(f"网络错误: {str(e)}")
raise
except (KeyError, ValueError) as e:
print(f"数据解析错误: {str(e)}")
raise
```
### 3. 限流与配额管理
```python
import time
from collections import defaultdict
class RateLimiter:
def __init__(self, max_calls, period):
self.max_calls = max_calls
self.period = period
self.timestamps = defaultdict(list)
def wait(self, api_name):
now = time.time()
calls = self.timestamps[api_name]
# 移除过期的时间戳
calls = [t for t in calls if t > now - self.period]
self.timestamps[api_name] = calls
if len(calls) >= self.max_calls:
sleep_time = self.period - (now - calls[0])
time.sleep(max(sleep_time, 0))
self.timestamps[api_name].append(time.time())
# 使用示例
limiter = RateLimiter(max_calls=100, period=60) # 60秒100次调用
limiter.wait("goods_search")
data = api.search_goods("智能手机")
```
## 五、注意事项与优化建议
1. **API限制管理**:
- 京东:普通应用约1000次/天
- 拼多多:根据应用等级不同,500-5000次/天
- 建议:$Q = \frac{\text{总配额}}{\text{时间段}} \times \text{安全系数}$ 控制调用频率
2. **数据安全**:
- 使用HTTPS传输
- 敏感数据加密存储
- 定期轮换API密钥
3. **性能优化**:
- 批量请求处理(如京东支持最多50个商品ID批量查询)
- 异步调用(使用asyncio/aiohttp)
- 本地缓存高频数据
4. **监控与日志**:
```python
import logging
logging.basicConfig(filename='api_integration.log', level=logging.INFO)
def log_api_call(api_name, params, response):
log_data = {
"timestamp": datetime.now().isoformat(),
"api": api_name,
"params": params,
"status": response.status_code,
"latency": response.elapsed.total_seconds()
}
logging.info(json.dumps(log_data))
```
## 六、常见问题解决
1. **授权失效处理**:
```python
def refresh_token(api_client):
try:
api_client.refresh_access_token()
return True
except RefreshTokenException:
notify_admin("需要重新授权")
return False
```
2. **数据格式转换**:
```python
def normalize_product_data(platform, raw_data):
"""统一不同平台的数据格式"""
mapping = {
"JD": {"id": "skuId", "title": "name", "price": "price"},
"PDD": {"id": "goods_id", "title": "goods_name", "price": "min_group_price"}
}
return {
"product_id": raw_data[mapping[platform]["id"]],
"name": raw_data[mapping[platform]["title"]],
"price": float(raw_data[mapping[platform]["price"]]) / 100 # 拼多多价格为分
}
```
3. **分页处理**:
```python
def paginated_fetch(api_method, keyword, max_pages=10):
results = []
page = 1
while page <= max_pages:
data = api_method(keyword, page)
if not data:
break
results.extend(data)
if len(data) < 100: # 假设每页最多100条
break
page += 1
time.sleep(0.5) # 避免触发限流
return results
```