主题
python
import streamlit as st
import requests
import json
import os
from openapi_client.api import fileinfo_api
import openapi_client
st.subheader("百度网盘资源提取工具")
if "access_code" not in st.session_state:
st.session_state.access_code = ""
if "access_token" not in st.session_state:
st.session_state.access_token = ""
if "refresh_token" not in st.session_state:
st.session_state.refresh_token = ""
AppKey=os.getenv('BAIDU_DISK_APPKEY')
SecretKey=os.getenv('BAIDU_DISK_SECRETKEY')
SignKey=os.getenv('BAIDU_DISK_SIGNKEY')
AppID=os.getenv('BAIDU_DISK_APPID')
redirect_uri='oob'
def get_access_token(code):
base_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
}
get_access_token_url = f'{base_url}?{"&".join([f"{key}={value}" for key, value in params.items()])}'
payload = {}
headers = {
'User-Agent': 'pan.baidu.com'
}
response = requests.request("GET", get_access_token_url, headers=headers, data = payload)
res = response.text
token = json.loads(res)
st.session_state.access_token = token['access_token']
st.write(token['access_token'])
st.session_state.refresh_token = token['refresh_token']
def search_file(keyword,root_path="/"):
dir_list = []
with openapi_client.ApiClient() as api_client:
api_instance = fileinfo_api.FileinfoApi(api_client)
key = keyword # str |
web = "1" # str | (optional)
num = "3" # str | (optional)
page = "1" # str | (optional)
dir = root_path # str | (optional)
recursion = "1" # str | (optional)
try:
api_response = api_instance.xpanfilesearch(
st.session_state.access_token, key, web=web, num=num, page=page, dir=dir, recursion=recursion)
for item in api_response['list']:
# 只处理目录不处理文件
if len(os.path.basename(item['path']).split(".")) == 1:
dir_list.append({
"dirUrl":f'https://pan.baidu.com/disk/main#/index?category=all&path={item["path"]}',
# "filename":item['server_filename'],
# "path":item['path'],
# "size":item['size'],
# "videoUrl":f'https://pan.baidu.com/pfile/video?path={item["path"]}'
})
except openapi_client.ApiException as e:
print("Exception when calling FileinfoApi->xpanfilesearch: %s\n" % e)
return dir_list
hasAccessToken = st.toggle("已有access_token")
if hasAccessToken:
st.session_state.access_token = st.text_input('请输入access_token',type="password")
else:
if st.button('1、获取授权码'):
url = f'https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id={AppKey}&redirect_uri={redirect_uri}&scope=basic,netdisk&device_id={AppID}'
st.link_button("点击获取", url,type="secondary")
st.info("点击获取后,会跳转到百度网盘授权页面,点击同意即可获取授权码")
code = st.text_input('2、请输入授权码',type="password")
if st.button('3、获取access_token') and code:
get_access_token(code)
#
keyword = st.text_input('请输入搜索关键字',value="TypeScript")
if st.button('搜索文件'):
with st.spinner('搜索中...'):
data = search_file(keyword)
print(data)
config = {
"dirUrl": st.column_config.LinkColumn(),
}
st.dataframe(data,column_config=config, use_container_width=True)