Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

百度网盘的操作封装

  使用网盘储存自己网站中一些备份或不常用的数据文件是个好办法,但是翻翻百度官方的API会发现很蛋疼。一大堆麻烦的流程,接口还要去申请什么的,让人顿时就欲望全无。于是把度娘按倒在地扒下API,自己分析了下网盘的数据,封装的个文件操作类。
  以前有说过用贴吧的静态图片库为自己的网站做图片备份(见:让度娘为咱做图片网络备份)。其实也是类似的道理,只是这回咱用正规一些的网盘来做,这样会保险一些。百度网盘随便注册个账号就有5G的容量,而且又没有注册限制,这是永远用不完的免费储存资源。现在我把网盘的登陆、上传、下载,封装成一个类了,方便大家使用。下面是PHP代码: class Baidu {
  const URL1='http://c.pcs.baidu.com/rest/2.0/pcs/file?';
  const URL2='http://passport.baidu.com/v2/api/?';
  public $BDUSS;
  public $username;
  public $password;
  private $cache;
  //构造函数
  public function Baidu($username,$password){
    $this->username=$username;
    $this->password=$password;
    //将BDUSS放入临时文件中,以免每一次都去登陆
    touch($this->cache=sys_get_temp_dir().'baidu.php.'.md5($username));
    $this->BDUSS=file_get_contents($this->cache) or $this->login();
  }
  //成员函数:登陆
  public function login($username=null,$password=nul,$key='百度是SB'){
    $username or $username=$this->username;
    $password or $password=$this->password;
    preg_match('/[\da-f]{32}/',Baidu::ajax(
      Baidu::URL2.'getapi&tpl='.$key,null,'BAIDUID='.$key,1
    ),$m);
    $r=Baidu::ajax(Baidu::URL2.'login',array(
      'token'=>$m[0],'tpl'=>$key,'mem_pass'=>'on',
      'username'=>$username,'password'=>$password,
    ),'BAIDUID='.$key,true);
    preg_match('/BDUSS=(.+?)(?:;|$)/',$r,$m);
    file_put_contents($this->cache,$m[1]);
    return $this->BDUSS=$m[1];
  }
  //成员函数:上传
  public function upload($path,$file){
    return Baidu::ajax(
      Baidu::URL1.http_build_query(array(
        'method'=>'upload','path'=>$path,'ondup'=>'overwrite',
        'app_id'=>250528,'BDUSS'=>$this->BDUSS
      )),array('file'=>"@$file")
    );
  }
  //成员函数:下载
  public function download($path){
    return Baidu::ajax(
      Baidu::URL1.http_build_query(array(
        'method'=>'download','path'=>$path,'app_id'=>250528,
      )),null,'BDUSS='.$this->BDUSS
    );
  }
  private static function ajax($url,$data=null,$cookie=null,$h=false){
    curl_setopt($c=curl_init($url),CURLOPT_COOKIE,$cookie);
    $h and curl_setopt($c,CURLOPT_HEADER,true);
    $data and curl_setopt($c,CURLOPT_POSTFIELDS,$data);
    //由于百度有可能返回400状态码,所以必须用ob才能正常获取数据
    ob_start();
    curl_exec($c);
    $s=ob_get_contents();
    curl_close($c);
    ob_end_clean();
    $o=json_decode($s,true);
    return $o?$o:$s;
  }
};
构造:
  new Baidu(用户名,密码);
属性:
  username 用户名
  passowrd 密码
  BDUSS 百度会话ID
方法:
  upload('网盘根目录开始的绝对路径','本地文件绝对路径')
    返回:接口本身的JSON数组对象
  download('网盘根目录开始的绝对路径')
    返回:文件数据
  login([用户名,[密码]]);
    返回:BDUSS
  暂时只封装了上传和下载的功能,因为只是用来做数据备份也用不上什么其它功能。其实有BDUSS的话,可以做很多事情。贴吧发帖,签到什么的全都通用的。如果有需要可以往类上扩展。。。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^