- <?php
- // STARTOFFILE
- // URL的正则
- $url = '/http:\\/\\/pan\\.baidu\\.com.*(?:shareid=(\\d+)&(?:uk=(\\d+?)))/Uis';
- // 文件夹的正则
- $folder = '/\\/(get|show|folder)\\/(\\d+)\\/(\\d+)\\/(.+)(?:\\/(\\d+)[\\/]((?:.+)\\.(?:.+?))|\\/(\\d+?)[\\/]{0,1}|\\/)/Uis';
- // 单文件的正则
- $file = '/\\/(get|show)\\/(\\d+)\\/(\\d+?)(?:[\\/]((?:.+)\\.(?:.+?))|[\\/]{0,1})/Uis';
- //文件夹指定文件名的正则
- $fileName = '/\\/(file)\\/(\\d+)\\/(\\d+)\\/(.+)\\/(.+?)/Uis';
- //文件夹指定文件名的正则(扩展:为图片是增加尺寸,质量等参数)
- $picName = '/\\/pic\\/(\\d+)(?#shareid)\\/(\\d+)(?#uk)\\/(.+)(?#path)\\/(c\\d+?)(u\\d+?)q(\\d+?)(?#图片参数)\\/(.+?)(?#文件名)/Uis';
- $preg=array('url'=>$url,'folder'=>$folder,'file'=>$file,'picName'=>$picName,'fileName'=>$fileName);
- class BaiduPanProxy{
- private $uk;
- private $shareid;
- private $path; //文件夹路径
- private $file; //指定输出为图片时的文件名
- private $size; //指定输出为图片时的尺寸
- private $method; //输出方法
- private $folderIndex; //文件夹的文件索引号
- private $folder;//文件夹的json内容
- private $url='';
- private $preg=array();
- // public $trueLinkPreg='|(http:[\\\\\\/]{2,6}www\\.baidupcs\\.com[\\\\\\/]{1,3}file[\\\\\\/]{1,3}.*)\\\\\\"|U'; //已失效
- public $trueLinkPreg='|(http:[\\\\\\/]{2,6}d\\.pcs\\.baidu\\.com[\\\\\\/]{1,3}file[\\\\\\/]{1,3}.*)\\\\\\"|U';
- public function __construct($url,$preg) {
- $this->url = $url;
- $this->preg = $preg;
- }
- private function parseUrl(){
- foreach ($this->preg as $k=>$value) {
- if(0 != preg_match ( $value, $this->url, $match )){
- switch ($k) {
- case 'url':
- list ( , $this->shareid, $this->uk) = $match;
- $this->method='get';//此情况下默认是get,不能自定义
- $this->matchBy='url';
- break;
- case 'folder':
- if(8 == count ( $match )) // 文件夹,不带文件名
- list ( , $this->method, $this->shareid, $this->uk, $this->path,,,$this->folderIndex) = $match;
- if(5 == count ( $match )) // 文件夹,遍历
- list ( , $this->method, $this->shareid, $this->uk, $this->path) = $match;
- if(7 == count ( $match )) // 文件夹,带文件名
- list ( , $this->method, $this->shareid, $this->uk, $this->path,$this->folderIndex) = $match;
- $this->folderIndex=$this->folderIndex-1;
- $this->matchBy='folder';
- // var_dump($match);exit();
- break;
- case 'file':
- list ( , $this->method,$this->shareid, $this->uk) = $match;
- $this->matchBy='file';
- break;
- case 'picName':
- list ( , $this->shareid, $this->uk, $this->path, $c,$u,$q,$this->file) = $match;
- $this->size='size='.$c.'_'.$u.'&quality='.$q;
- $this->file=urldecode($this->file);
- $this->matchBy='picName';
- break;
- case 'fileName':
- list ( , ,$this->shareid, $this->uk, $this->path,$this->file) = $match;
- $this->file=urldecode($this->file);
- $this->matchBy='fileName';
- break;
- }
- return $this;
- }
- }
- if(!$match) $this->error();//匹配不到任何正确的参数则退出
- }
- private function parseFolder($url){
- $html=file_get_contents($url);
- return json_decode($html,true);
- }
- private function searchFolder(){
- $url = "http://pan.baidu.com/share/list?dir=" . $this->path . "&shareid=" . $this->shareid . "&uk=" . $this->uk . "&";
- $this->json=$this->parseFolder($url);
- if(! is_array($this->json)) $this->error();
- }
- private function getFolderIndex($list){
- foreach ($list as $k=>$v) {
- if(strtolower($v['server_filename'])==strtolower($this->file) )return $k;
- }
- }
- private function digFolder($path = '', $shareid = '', $uk = ''){
- $url = "http://pan.baidu.com/share/list?dir=" . $path . "&shareid=" . $shareid . "&uk=" . $uk . "&";
- $this->json=$this->parseFolder($url);
- if(! is_array($this->json)) $this->error();
- foreach ( $this->json ['list'] as $arr ) {
- if (1 == $arr ['isdir'])
- $this->digFolder ( urlencode ( $arr ['path'] ), $shareid, $uk );
- else
- $this->str .= "<a href=\\"" . $arr ['dlink'] . "\\">" . $arr ['server_filename'] . "</a><br />";
- }
- return $this->str;
- }
- private function getRealLink(){
- if(!$this->method){//如果没有方法,只有输入真实文件名或输出可调质量图片两种方法
- $this->searchFolder();
- $this->folderIndex=$this->getFolderIndex($this->json['list']);
- if($this->size){
- //调节图片输出质量
- $this->realLink=preg_replace("/size=c\\d+_u\\d+&quality=\\d+/", $this->size, $this->json['list'][$this->folderIndex]['thumbs']['url3']);
- }else{
- $this->realLink=$this->json['list'][$this->folderIndex]['dlink'];
- }
- }elseif ('folder' == $this->method) {
- $this->realLink = $this->digFolder($this->path,$this->shareid ,$this->uk);
- }else{
- if(!$this->path){
- $url = "http://pan.baidu.com/share/link?shareid=" . $this->shareid . "&uk=" . $this->uk;
- $html = file_get_contents ( $url );
- if (0 == preg_match ( $this->trueLinkPreg, $html, $url ))
- $this->error();
- $_string = array ("replace" => Array ("&", '\\\\' ), "string" => Array ("&", "" ) );
- // 替换转义字符
- $this->realLink = str_ireplace ( $_string ["replace"], $_string ["string"], $url [1] );
- }elseif ($this->path) {
- $this->searchFolder();
- $this->realLink=$this->json['list'][$this->folderIndex]['dlink'];
- }
- }
- }
- public function haveFun(){
- if ($this->checkNew ( $this->localVersion, $this->checkFrequency ))
- $this->updateFile ( $this->localVersion );
- $this->parseUrl()->getRealLink();
- if('show'==$this->method || 'folder'==$this->method)
- echo $this->realLink;
- else
- header ( "Location:" . $this->realLink );
- }
- private function error(){
- die('oops!! 获取失败诶~建议到<a href="https://github.com/tofuliang/baidu-pan-proxy" target="_blank">https://github.com/tofuliang/baidu-pan-proxy</a>了解了解吧~');
- }
- private function checkNew($localVersion, $checkFrequency) {
- $lastCheck = ( int ) @file_get_contents ( __DIR__ . "/.lastcheck" );
- if (time () - $lastCheck > $checkFrequency) {
- @file_put_contents ( __DIR__ . "/.lastcheck", time () );
- $serverVersion = ( double ) @file_get_contents ( "https://raw.github.com/tofuliang/baidu-pan-proxy/master/version" );
- if ($serverVersion - ( double ) $localVersion > 0)
- return true;
- return false;
- }
- return false;
- }
- public function updateFile($localVersion) {
- $new = ( string ) @file_get_contents ( "https://raw.github.com/tofuliang/baidu-pan-proxy/master/index.php" );
- if (strpos ( $new, 'STARTOFFILE' ) && strpos ( $new, 'ENDOFFILE' )) {
- copy ( __FILE__, __FILE__ . $localVersion ) && @file_put_contents ( __FILE__, $new ) && exit ( "代理程序已更新到新版" );
- }
- }
- }
- $link = new BaiduPanProxy($_SERVER ["QUERY_STRING"],$preg);
- $link->localVersion = '0.6';
- $link->checkFrequency = 86400; // 每隔多少秒到服务器检测更新,默认是一天
- $link->haveFun();
- //ENDOFFILE
- //该片段来自于http://www.codesnippet.cn/detail/221120137409.html
来源: http://www.codesnippet.cn/detail/221120137409.html