125 lines
3.7 KiB
Python
125 lines
3.7 KiB
Python
from flask import Flask, request, jsonify, redirect, url_for
|
||
from config import AppID,AppKey,Secretkey,Signkey,CODE_SCOPE,REDIRECT_URI
|
||
from configToken import ACCESS_TOKEN,REFRESH_TOKEN
|
||
import requests
|
||
import urllib
|
||
app = Flask(__name__)
|
||
def update_config_token(access_token, refresh_token):
|
||
"""
|
||
更新 config.py 中的 ACCESS_TOKEN 和 REFRESH_TOKEN
|
||
"""
|
||
with open("configToken.py", "w") as f:
|
||
f.write(f'ACCESS_TOKEN = "{access_token}"\n')
|
||
f.write(f'REFRESH_TOKEN = "{refresh_token}"\n')
|
||
|
||
@app.route('/oauth_url', methods=['GET'])
|
||
def get_baidu_oauth_url():
|
||
"""
|
||
返回百度 OAuth 2.0 授权 URL
|
||
"""
|
||
base_url = "https://openapi.baidu.com/oauth/2.0/authorize"
|
||
response_type = "code"
|
||
|
||
# 构建完整 URL
|
||
oauth_url = (
|
||
f"{base_url}?"
|
||
f"response_type={response_type}&"
|
||
f"client_id={AppKey}&"
|
||
f"redirect_uri={REDIRECT_URI}&"
|
||
f"scope={CODE_SCOPE}&"
|
||
f"device_id={AppID}"
|
||
)
|
||
return jsonify({"oauth_url": oauth_url})
|
||
|
||
@app.route('/get_token', methods=['GET'])
|
||
def get_baidu_token():
|
||
"""
|
||
使用用户授权码换取 access_token
|
||
GET 参数: code
|
||
"""
|
||
code = request.args.get('code')
|
||
if not code:
|
||
return jsonify({"error": "缺少 code 参数"}), 400
|
||
|
||
headers = {
|
||
'User-Agent': 'pan.baidu.com'
|
||
}
|
||
token_url = "https://openapi.baidu.com/oauth/2.0/token"
|
||
params = {
|
||
"grant_type": "authorization_code",
|
||
"code": code,
|
||
"client_id": AppKey,
|
||
"client_secret": Secretkey,
|
||
"redirect_uri": REDIRECT_URI
|
||
}
|
||
|
||
response = requests.get(token_url, params=params,headers=headers)
|
||
data = response.json()
|
||
|
||
# 如果返回了 access_token 和 refresh_token,就更新 config.py
|
||
if "access_token" in data and "refresh_token" in data:
|
||
update_config_token(data["access_token"], data["refresh_token"])
|
||
|
||
return jsonify(data)
|
||
|
||
@app.route('/refresh_token', methods=['GET'])
|
||
def refresh_baidu_token():
|
||
"""
|
||
使用 refresh_token 刷新 access_token
|
||
GET 参数: refresh_token
|
||
"""
|
||
refresh_token = REFRESH_TOKEN
|
||
token_url = "https://openapi.baidu.com/oauth/2.0/token"
|
||
params = {
|
||
"grant_type": "refresh_token",
|
||
"refresh_token": refresh_token,
|
||
"client_id": AppKey,
|
||
"client_secret": Secretkey,
|
||
}
|
||
|
||
response = requests.get(token_url, params=params)
|
||
data = response.json()
|
||
|
||
# 如果返回了 access_token 和 refresh_token,就更新 config.py
|
||
if "access_token" in data and "refresh_token" in data:
|
||
update_config_token(data["access_token"], data["refresh_token"])
|
||
|
||
return jsonify(data)
|
||
|
||
|
||
@app.route('/list_files', methods=['GET'])
|
||
def list_files():
|
||
"""
|
||
获取百度网盘指定目录下的文件列表
|
||
GET 参数:
|
||
- access_token: 必须
|
||
- path: 必须,目录绝对路径,中文需URL编码
|
||
- order: 可选,排序字段,time/name/size
|
||
"""
|
||
path = request.args.get('path')
|
||
order = request.args.get('order', 'type') # 默认按文件类型排序
|
||
|
||
if not path:
|
||
return jsonify({"error": "缺少 access_token 或 path 参数"}), 400
|
||
BAIDU_PAN_API = "https://pan.baidu.com/rest/2.0/xpan/multimedia"
|
||
# 中文路径 URL 编码
|
||
path_encoded = urllib.parse.quote(path)
|
||
|
||
params = {
|
||
"method": "listall",
|
||
"access_token": ACCESS_TOKEN,
|
||
"path": path_encoded,
|
||
"order": order
|
||
}
|
||
|
||
response = requests.get(BAIDU_PAN_API, params=params)
|
||
try:
|
||
data = response.json()
|
||
except Exception as e:
|
||
return jsonify({"error": "返回结果不是 JSON", "detail": str(e)}), 500
|
||
|
||
return jsonify(data)
|
||
|
||
if __name__ == '__main__':
|
||
app.run(host='0.0.0.0', port=5000, debug=True)
|