|
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
豆瓣API请求发送演示
展示多种请求发送方式
"""
import json
from douban_signature_final import DoubanSignatureFinal
def demo_simple_request():
"""演示简单的API请求"""
print("=== 方法1: 使用完整库发送请求 ===\n")
# 创建签名器
signer = DoubanSignatureFinal()
# 电影热榜API
url = "https://frodo.douban.com/api/v2/subject_collection/movie_real_time_hotest/items"
params = {
'type': 'movie',
'start': '0',
'count': '5', # 只获取5部电影
'udid': '748659a92430f1e85b21daae1949c5698fdab92f',
'rom': 'android',
'apikey': '0dad551ec0f84ed02907ff5c42e8ec70',
's': 'rexxar_new',
'channel': 'ali_market',
'timezone': 'Asia/Shanghai',
'device_id': '748659a92430f1e85b21daae1949c5698fdab92f',
'os_rom': 'android',
'sugar': '0',
'loc_id': '108288',
}
try:
# 发送请求
response = signer.make_request(url, params, "GET")
print(f"状态码: {response.status_code}")
if response.status_code == 200:
data = response.json()
print("✅ 请求成功!")
print(f"总数: {data.get('count', 0)}")
# 显示电影信息
items = data.get('subject_collection_items', [])
for i, item in enumerate(items, 1):
movie = item.get('rating', {})
print(f"{i}. {item.get('title', 'N/A')} - 评分: {movie.get('value', 'N/A')}")
else:
print(f"❌ 请求失败: {response.text}")
except Exception as e:
print(f"❌ 请求异常: {e}")
def demo_manual_request():
"""演示手动构造请求"""
print(f"\n=== 方法2: 手动构造请求 ===\n")
import requests
from douban_signature_final import DoubanSignatureFinal
signer = DoubanSignatureFinal()
# 书籍推荐API
url = "https://frodo.douban.com/api/v2/subject_collection/book_bestseller/items"
params = {
'type': 'book',
'start': '0',
'count': '3',
'apikey': '0dad551ec0f84ed02907ff5c42e8ec70',
}
# 手动生成签名
sig, ts = signer.generate_signature(url, "GET")
params['_sig'] = sig
params['_ts'] = ts
# 构造请求头
headers = {
'User-Agent': 'Rexxar-Core/0.1.3 api-client/1 com.douban.frodo/7.89.0(307) Android/33 product/coral vendor/Google model/Pixel 4 XL brand/google rom/android network/wifi udid/748659a92430f1e85b21daae1949c5698fdab92f platform/mobile nd/1 com.douban.frodo/7.89.0(307) Rexxar/1.2.151 platform/mobile 1.2.151',
'Accept': 'application/json',
}
print(f"请求URL: {url}")
print(f"生成的签名: {sig}")
print(f"时间戳: {ts}")
try:
# 发送GET请求
response = requests.get(url, params=params, headers=headers)
print(f"\n状态码: {response.status_code}")
if response.status_code == 200:
data = response.json()
print("✅ 请求成功!")
# 显示书籍信息
items = data.get('subject_collection_items', [])
for i, item in enumerate(items, 1):
rating = item.get('rating', {})
print(f"{i}. {item.get('title', 'N/A')} - 评分: {rating.get('value', 'N/A')}")
else:
print(f"❌ 请求失败: {response.text}")
except Exception as e:
print(f"❌ 请求异常: {e}")
def demo_post_request():
"""演示POST请求 (注意:这只是演示,可能需要登录)"""
print(f"\n=== 方法3: POST请求演示 ===\n")
import requests
from douban_signature_final import DoubanSignatureFinal
signer = DoubanSignatureFinal()
# 假设的用户API (可能需要登录)
url = "https://frodo.douban.com/api/v2/user/profile"
# POST请求体
post_data = json.dumps({
"action": "get_profile"
})
# 生成签名 (包含请求体)
sig, ts = signer.generate_signature(url, "POST", post_data)
# 查询参数
params = {
'apikey': '0dad551ec0f84ed02907ff5c42e8ec70',
'_sig': sig,
'_ts': ts,
}
headers = {
'User-Agent': 'Rexxar-Core/0.1.3 api-client/1 com.douban.frodo/7.89.0(307) Android/33 product/coral vendor/Google model/Pixel 4 XL brand/google rom/android network/wifi udid/748659a92430f1e85b21daae1949c5698fdab92f platform/mobile nd/1 com.douban.frodo/7.89.0(307) Rexxar/1.2.151 platform/mobile 1.2.151',
'Content-Type': 'application/json',
}
print(f"POST URL: {url}")
print(f"请求体: {post_data}")
print(f"生成的签名: {sig}")
try:
response = requests.post(url, params=params, data=post_data, headers=headers)
print(f"\n状态码: {response.status_code}")
print(f"响应: {response.text[:200]}...")
except Exception as e:
print(f"❌ 请求异常: {e}")
def demo_multiple_apis():
"""演示调用多个不同的API"""
print(f"\n=== 方法4: 批量API调用 ===\n")
signer = DoubanSignatureFinal()
apis = [
{
"name": "电影正在热映",
"url": "https://frodo.douban.com/api/v2/subject_collection/movie_showing/items",
"params": {'type': 'movie', 'start': '0', 'count': '3', 'apikey': '0dad551ec0f84ed02907ff5c42e8ec70'}
},
{
"name": "电视剧热榜",
"url": "https://frodo.douban.com/api/v2/subject_collection/tv_hot/items",
"params": {'type': 'tv', 'start': '0', 'count': '3', 'apikey': '0dad551ec0f84ed02907ff5c42e8ec70'}
},
{
"name": "音乐新碟榜",
"url": "https://frodo.douban.com/api/v2/subject_collection/music_latest/items",
"params": {'type': 'music', 'start': '0', 'count': '3', 'apikey': '0dad551ec0f84ed02907ff5c42e8ec70'}
}
]
for api in apis:
print(f" 调用API: {api['name']}")
try:
response = signer.make_request(api['url'], api['params'], "GET")
if response.status_code == 200:
data = response.json()
count = data.get('count', 0)
print(f" ✅ 成功 - 获取到 {count} 条数据")
# 显示第一条数据的标题
items = data.get('subject_collection_items', [])
if items:
first_item = items[0]
print(f" 首条: {first_item.get('title', 'N/A')}")
else:
print(f" ❌ 失败 - 状态码: {response.status_code}")
except Exception as e:
print(f" ❌ 异常: {e}")
print()
def demo_save_response():
"""演示保存响应数据"""
print(f"=== 方法5: 保存响应数据 ===\n")
signer = DoubanSignatureFinal()
url = "https://frodo.douban.com/api/v2/subject_collection/movie_real_time_hotest/items"
params = {
'type': 'movie',
'start': '0',
'count': '10',
'apikey': '0dad551ec0f84ed02907ff5c42e8ec70',
}
try:
response = signer.make_request(url, params, "GET")
if response.status_code == 200:
data = response.json()
# 保存原始响应
with open("douban_movies.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print("✅ 数据已保存到 douban_movies.json")
# 提取并保存简化版本
simplified = []
items = data.get('subject_collection_items', [])
for item in items:
simplified.append({
"title": item.get('title'),
"rating": item.get('rating', {}).get('value'),
"year": item.get('year'),
"directors": [d.get('name') for d in item.get('directors', [])],
"genres": item.get('genres', [])
})
with open("douban_movies_simple.json", "w", encoding="utf-8") as f:
json.dump(simplified, f, ensure_ascii=False, indent=2)
print("✅ 简化数据已保存到 douban_movies_simple.json")
print(f" 共获取 {len(simplified)} 部电影数据")
else:
print(f"❌ 请求失败: {response.status_code}")
except Exception as e:
print(f"❌ 异常: {e}")
if __name__ == "__main__":
print("???? 豆瓣API请求发送演示\n")
# 运行所有演示
demo_simple_request()
demo_manual_request()
demo_post_request()
demo_multiple_apis()
demo_save_response()
print(" 所有演示完成!")
print("\n 使用提示:")
print("1. 简单调用: 使用 DoubanSignatureFinal().make_request()")
print("2. 手动控制: 先生成签名,再发送requests请求")
print("3. 批量调用: 循环调用不同API")
print("4. 数据保存: 将响应保存为JSON文件")
|
所有评论(0)