IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> 百度网盘开放平台接口,上传、下载等功能PHP详细操作 -> 正文阅读

[PHP知识库]百度网盘开放平台接口,上传、下载等功能PHP详细操作

目录

1、获取code

2、获取access_token

3、获取网盘容量

4、获取文件列表

5、预上传

6、分片上传

7、创建文件


1、获取code

    public function getCode(Request $request)
    {
        $config = [
            'client_id' => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
            'redirect_uri' => '你的回调地址',
            'state' => md5(uniqid())
        ];
        $url = 'https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id='. $config['client_id'].'&redirect_uri='. $config['redirect_uri'].'&scope=netdisk&display=mobile&qrcode=1&force_login=0&device_id=&state='.$config['state'];
        //生成二维码图片
        $qrcode = QrCode::encoding('UTF-8')->size(300)->generate($url);
        $this->success('OK', [
            'qrcode' => base64_encode($qrcode),
            'url' => $url
        ]);
    }

2、获取access_token

 public function getAuth(Request $request)
    {
        $code = $request->input('code', '');
        if(empty($code)){
            exit();
        }
        $config = [
            'client_id' => 'XXXXXXXXXXXXXXXXXXXXXXXX',
            'SecretKey' => 'XXXXXXXXXXXXXXXXXXXXXXXX',
            'redirect_uri' => '回调地址',
        ];
        $url = 'https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code&code='.$code.'&client_id='.$config['client_id'].'&client_secret='.$config['SecretKey'].'&redirect_uri=' . $config['redirect_uri'].'&state=get_list';
        $result = $this->curl_get($url);
        $access_token = json_decode($result,true);

    }

3、获取网盘容量

    public function getQuota()
    {
        $url = 'https://pan.baidu.com/api/quota?access_token='.$this->config['access_token'].'&checkfree=1&checkexpire=1';
        $result = Http::withOptions(['verify' => false])->get($url);
        $res = $result->body();
        $res = \GuzzleHttp\json_decode($res);
        if($res->errno === 0){
            $this->success('OK',[
                'total' => $res->total / 1024 / 1024 / 1024 . 'GB',
                'free' => $res->free / 1024 / 1024 / 1024 . 'GB',
                'used' => $res->used / 1024 / 1024 / 1024 . 'GB',
                'remain' => ($res->total - $res->used) / 1024 / 1024 / 1024 . 'GB',
                'expire' => $res->expire,
            ]);
        }
        $this->error($this->msg[$res->errno]);
    }

4、获取文件列表

public function getList($page)
    {
        $start = ($page - 1) * 10;
        $data = [
            'method' => 'list',
            'dir' => '/',
            'access_token' => $this->config['access_token'],
            'order' => 'time',
            'web' => 1,
        ];
        $total = \GuzzleHttp\json_decode(Http::withOptions(['verify' => false])->get($this->api.http_build_query($data))->body());
        $data['start'] = $start;
        $data['limit'] = 10;
        $result = Http::withOptions(['verify' => false])->get($this->api.http_build_query($data));
        $res = $result->body();
        $res = \GuzzleHttp\json_decode($res);
        if($res->errno === 0){
            $list = [];
            if(count($res->list) > 0){
                foreach($res->list as $key => $item){
                    $list[] = [
                        'id' => $key + 1,
                        'name' => $item->server_filename,
                        'create_time' => date('Y-m-d H:i:s', $item->server_ctime),
                        'size' => $item->isdir === 1 ? '文件夹' : $item->size / 1024 / 1024 / 1024
                    ];
                }
            }
            $this->success('OK',[
                'list' => $list,
                'total' => count($total->list) ?? 0
            ]);
        }
        $this->error($this->msg[$res->errno]);
    }

5、预上传

public function precreate()
    {
        $url = $this->api . 'method=precreate&access_token=' . $this->config['access_token'];
        $data = [
            'path' => urlencode('/apps/XXXXXX/index.txt'),
            'size' => filesize(base_path().'/public/index.txt'),
            'isdir' => 0,
            'autoinit' => 1,
            'block_list' => \GuzzleHttp\json_encode([md5('index.php')])
        ];
        $result = Http::asForm()->withOptions(['verify' => false])->post($url, $data);
        $res = $result->body();
        $res = \GuzzleHttp\json_decode($res);
        print_r($res);
        if($res->errno === 0){
            $res = $this->upload($res->uploadid, $res->path, $res->block_list);
        }
        $this->error($this->msg[$res->errno]);
    }

6、分片上传

private function upload($uploadid, $path, $block_list)
    {
        $url = 'https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?';
        $data = [
            'method' => 'upload',
            'access_token' => $this->config['access_token'],
            'type' => 'tmpfile',
            'path' => $path,
            'uploadid' => $uploadid,
            'partseq' => 0
        ];
        $url .= http_build_query($data);
        $result = Http::attach('robots', base_path().'/public/index.txt')->withOptions(['verify' => false])->post($url, [
            'file' => base_path().'\public\index.php'
        ]);
        $res = $result->body();
        $res = \GuzzleHttp\json_decode($res);
        if($res->md5){
            $this->create($path, $uploadid, $res->md5);
        }
    }

7、创建文件

private function create($path, $uploadid, $md5)
    {
        $url = $this->api. 'method=create&access_token=' . $this->config['access_token'];
        $data = [
            'path' => '/apps/xxxxxx/index.txt',
            'size' => filesize(base_path().'/public/index.txt'),
            'isdir' => '0',
            'rtype' => 1,
            'block_list' => \GuzzleHttp\json_encode([$md5]),
            'uploadid' => $uploadid,
            'mode' => 3
        ];
 
        $result = Http::withOptions(['verify' => false])->post($url, $data);
        $res = $result->body();
        $res = \GuzzleHttp\json_decode($res);
        if($res->errno === 0){

        }
    }

我目前卡在了这里,创建文件,返回

stdClass Object
(
    [errno] => 2
    [path] => 
    [request_id] => 254240173748038691
)

查阅了很多资料和大佬的文章,都没对这个有个明确的说法!

PS:这个问题,在今天突然解决了,这个block_list参数,在文档中虽然写这不是必须,但是实际上却是必须传的,其实和第一个预创建的格式和数据是一样的。

private function create($path, $uploadid, $md5)
    {
        $url = $this->api. 'method=create&access_token=' . $this->config['access_token'];
        $data = [
            'path' => $path,
            'size' => filesize(base_path().'/public/index.zip'),
            'isdir' => 0,
            'rtype' => 1,
            'block_list' => \GuzzleHttp\json_encode([$md5]),
            'uploadid' => $uploadid,
            'mode' => 3
        ];
        $result = Http::asForm()->withOptions(['verify' => false])->post($url, $data);
        $res = $result->body();
        $res = \GuzzleHttp\json_decode($res);
        if($res->errno === 0){

        }
    }

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 01:45:27  更:2022-01-14 01:45:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 14:31:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码