<?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)/(cd+?)(ud+?)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=cd+_ud+&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">http://www.php.cn/;/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
Modoer 是一款以本地分享,多功能的点评网站管理系统。采用 PHP+MYSQL 开发设计,开放全部源代码。因具有非凡的访问速度和卓越的负载能力而深受国内外朋友的喜爱,不局限于商铺类点评,真正实现了多类型的点评,可以让您的网站点评任何事与物,同时增加产品模块,也更好的网站产品在网站上展示。Modoer点评系统 2.5 Build 20110710更新列表1.同步 旗舰版系统框架2.增加 限制图片
0
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号