forked from tofuliang/baidu-pan-proxy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.php
183 lines (168 loc) · 8.59 KB
/
index.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
<?php
// STARTOFFILE
// URL的正则
$url = '/(?:http:\/\/(?:pan|yun)\.baidu\.com.*(?:uk=(\d+)&(?:shareid=(\d+?)))|http:\/\/(?:pan|yun)\.baidu\.com.*(?:shareid=(\d+)&(?:uk=(\d+?))))(?#shareid和uk位置可能互换)/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 $trueLinkPregFix='|(http:.*expires=\dh.*)\\\"|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':
$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){
$html = file_get_contents ( $this->url );
if (0 == preg_match_all ( $this->trueLinkPreg, $html, $url ))
$this->error();
//去掉匹配到的重复项
$url = array_unique($url);
$url = array_unique($url[0]);
foreach ($url as $value) {
//如果匹配到多个链接,从中选择有效时长短的一个
if( 0 != preg_match($this->trueLinkPregFix, $value))
$this->realLink = $value;
}
if(!$this->realLink)
$this->error();
// 替换转义字符
$_string = array ("replace" => Array ("&", '\\' ), "string" => Array ("&", "" ) );
$this->realLink = str_ireplace ( $_string ["replace"], $_string ["string"], $this->realLink);
}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.8';
$link->checkFrequency = 86400; // 每隔多少秒到服务器检测更新,默认是一天
$link->haveFun();
//ENDOFFILE