Skip to content

1744437650910

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)