diff --git a/disk/BaiduDisk.php b/disk/BaiduDisk.php new file mode 100644 index 0000000..c543c8a --- /dev/null +++ b/disk/BaiduDisk.php @@ -0,0 +1,1256 @@ +disktag = $tag; + $this->redirect_uri = 'https://scfonedrive.github.io/'; + if (getConfig('client_id', $tag) && getConfig('client_secret', $tag)) { + $this->appName = 'OneManager'; + $this->client_id = getConfig('client_id', $tag); + $this->client_secret = getConfig('client_secret', $tag); + } else { + $this->appName = 'OneManager'; + $this->client_id = 'knLn7Z8S1YkjIKdjXGr1pBOAuSLGNMbr'; + $this->client_secret = 'BC4M3sLexAfjKUPUdgT3YGhT0dgV5X8t'; + } + $this->oauth_url = 'http://openapi.baidu.com/oauth/2.0/'; + $this->api_url = 'https://pan.baidu.com/rest/2.0/xpan/'; + $this->scope = 'basic,netdisk'; + $this->client_secret = urlencode($this->client_secret); + $this->scope = urlencode($this->scope); + $this->DownurlStrName = 'dlink'; + $this->ext_api_url = ''; + $res = $this->get_access_token(getConfig('refresh_token', $tag)); + } + + public function isfine() + { + if (!$this->access_token) return false; + else return true; + } + public function show_base_class() + { + return get_class(); + //$tmp[0] = get_class(); + //$tmp[1] = get_class($this); + //return $tmp; + } + + public function ext_show_innerenv() + { + return []; + } + + public function list_files($path = '/') + { + global $exts; + if ($path=='') $path = '/'; + //echo 'path: ' . $path . "
\n"; + if (!($files = getcache('path_' . $path, $this->disktag))) { + /*$pos = splitlast($path, '/'); + $parentpath = $pos[0]; + if ($parentpath=='') $parentpath = '/'; + $filename = strtolower($pos[1]); + if ($parentfiles = getcache('path_' . $parentpath, $this->disktag)) { + if (isset($parentfiles['children'][$filename][$this->DownurlStrName])) { + if (in_array(splitlast($filename,'.')[1], $exts['txt'])) { + if (!(isset($parentfiles['children'][$filename]['content'])&&$parentfiles['children'][$filename]['content']['stat']==200)) { + //$content1 = curl('GET', $parentfiles['children'][$filename][$this->DownurlStrName]); + //$parentfiles['children'][$filename]['content'] = $content1; + //savecache('path_' . $parentpath, $parentfiles, $this->disktag); + if ($parentfiles['children'][$filename]['size']<1024*1024) { + if (!(isset($parentfiles['children'][$filename]['content'])&&$parentfiles['children'][$filename]['content']['stat']==200)) { + $content1 = curl('GET', $parentfiles['children'][$filename][$this->DownurlStrName]); + $tmp = null; + $tmp = json_decode(json_encode($content1), true); + if ($tmp['body']===null) { + $txtcode = chkTxtCode($content1['body']); + if ($txtcode!==false) $tmp['body'] = iconv($txtcode, 'UTF-8//TRANSLIT', $content1['body']); + $tmp = json_decode(json_encode($tmp), true); + if ($tmp['body']) $content1['body'] = $tmp['body']; + } + $parentfiles['children'][$filename]['content'] = $content1; + savecache('path_' . $path, $parentfiles['children'][$filename], $this->disktag); + } + } else { + $parentfiles['children'][$filename]['content']['stat'] = 202; + $parentfiles['children'][$filename]['content']['body'] = 'File too large.'; + } + } + } + return $this->files_format($parentfiles['children'][$filename]); + } + }*/ + + $url = $this->api_url . $this->ext_api_url; + + //$url .= 'file?method=list&access_token=' . $this->access_token . '&dir=' . $path; + $url .= 'multimedia?method=listall&access_token=' . $this->access_token . '&path=' . $path . '&web=1'; + $p = 0; + while ($p<3 && !$arr['stat']) { + $arr = curl('GET', $url); + $p ++; + } + //echo $url . '
外' . $arr['stat'] . '
' . json_encode(json_decode($arr['body']), JSON_PRETTY_PRINT) . '
'; + //echo $arr['body']; + if ($arr['stat']==200) { + $files = json_decode($arr['body'], true); + //echo '
' . json_encode($files, JSON_PRETTY_PRINT) . '
'; + if ($files['errno']==-9) { + $files['error']['stat'] = 404; + $files['error']['code'] = 'Not Found'; + $files['error']['message'] = 'NO such file or folder';//errmsg + } elseif ($files['errno']==-7) { + $files['error']['stat'] = 403; + $files['error']['code'] = 'Forbidden'; + $files['error']['message'] = '';//errmsg + } elseif ($files['errno']===0) { + //echo '
正常:' . json_encode($files, JSON_PRETTY_PRINT) . '
'; + if ($files['list']) { // have item, is folder + if ($files['folder']['childCount']>200) { + // files num > 200 , then get nextlink + $page = $_POST['pagenum']==''?1:$_POST['pagenum']; + if ($page>1) + //if (!($files = getcache('path_1' . $path . '_' . $page, $this->disktag))) + { + $children = $this->fetch_files_children($path, $page); + //echo '
' . json_encode($children, JSON_PRETTY_PRINT) . '
'; + $files['children'] = $children['value']; + //$files['children'] = children_name($files['children']); + $files['folder']['page'] = $page; + //savecache('path_' . $path . '_' . $page, $files, $this->disktag); + } + } else { + // files num < 200 , then cache + //if (isset($files['children'])) { + //$files['list'] = children_name($files['list']); + //} + savecache('path_' . $path, $files, $this->disktag); + } + } else { // no item, theck isdir + $url = $this->api_url . $this->ext_api_url; + $fs = $this->list_files(splitlast($path, '/')[0])['list'][strtolower(urldecode(splitlast($path, '/')[1]))]; + //var_dump($fs); + if ($fs['type']=='folder') { + // is empty folder + //savecache('path_' . $path, $fs, $this->disktag); + $files = $fs; + } else { + // is file + $fsid = $fs['id'];//var_dump($fsid); + //$fsid = $this->list_files(splitlast($path, '/')[0])['list'][splitlast($path, '/')[1]]; + //echo 'ID: ' . $fsid . "
\n"; + //echo 'path: ' . $path; + //var_dump(splitlast($path, '/')[1]); + //var_dump($fsid); + $url .= 'multimedia?method=filemetas&dlink=1&access_token=' . $this->access_token . '&fsids=[' . $fsid . ']'; + $p = 0; + $arr = null; + while ($p<3 && !$arr['stat']) { + $arr = curl('GET', $url); + $p ++; + } + //echo $url . '
是文件' . $arr['stat'] . '
' . json_encode(json_decode($arr['body']), 448) . '
'; + if ($arr['stat']==200) { + $files = json_decode($arr['body'], true)['list'][0]; + $files['url'] = curl('GET', $files[$this->DownurlStrName] . '&access_token=' . $this->access_token, '', ['User-Agent'=>'pan.baidu.com'], 1)['returnhead']['Location']; + $files['list'] = ''; + if (isset($fs['thumbs'])) $files['thumbs'] = $fs['thumbs']; + //echo strtolower(splitlast($files['filename'],'.')[1]) . '进'; + if (in_array(strtolower(splitlast($files['filename'],'.')[1]), $exts['txt'])) { + if ($files['size']<1024*1024) { + //echo '进1'; + if (!(isset($files['content'])&&$files['content']['stat']==200)) { + $content1 = curl('GET', $files['url']); + $tmp = null; + $tmp = json_decode(json_encode($content1), true); + if ($tmp['body']===null) { + $txtcode = chkTxtCode($content1['body']); + if ($txtcode!==false) $tmp['body'] = iconv($txtcode, 'UTF-8//TRANSLIT', $content1['body']); + $tmp = json_decode(json_encode($tmp), true); + if ($tmp['body']) $content1['body'] = $tmp['body']; + } + $files['content'] = $content1; + } + } else { + $files['content']['stat'] = 202; + $files['content']['body'] = 'File too large.'; + } + } + if ($files['url']) savecache('path_' . $path, $files, $this->disktag); + } elseif ($arr['stat']==0) { + $files['error']['stat'] = 0; + $files['error']['code'] = 'Network error'; + $files['error']['message'] = 'Can not connect to ' . substr($url, 0, strpos($url, '?')); + } + } + } + } else { + $files['error']['stat'] = 500; + $files['error']['code'] = 'Other error'; + $files['error']['message'] = $arr . "~
\n" . json_encode($arr) . "~"; + } + } elseif ($arr['stat']==0) { + $files['error']['stat'] = 0; + $files['error']['code'] = 'Network error'; + $files['error']['message'] = 'Can not connect to ' . substr($url, 0, strpos($url, '?')); + } else { + //error_log1($arr['body']); + $files = json_decode($arr['body'], true); + if ($files['errno']==31066) { + $files['error']['stat'] = 404; + $files['error']['code'] = 'Not Found'; + $files['error']['message'] = 'NO such file or folder';//errmsg + } else { + $files['error']['stat'] = 503; + $files['error']['code'] = 'unknown Error'; + $files['error']['message'] = '~' . $arr['body'] . "~"; + } + //$files = json_decode( '{"unknownError":{ "stat":'.$arr['stat'].',"message":"'.$arr['body'].'"}}', true); + //error_log1(json_encode($files, JSON_PRETTY_PRINT)); + } + } + //echo '
format前' . json_encode($files, 448) . '
'; + return $this->files_format($files); + } + + protected function files_format($files) + { + if (isset($files['list'])) { + if ($files['list']) { + $tmp['type'] = 'folder'; + //$tmp['id'] = $files['id']; + //$tmp['name'] = $files['name']; + //$tmp['time'] = $files['lastModifiedDateTime']; + //$tmp['size'] = $files['size']; + //$tmp['childcount'] = $files['folder']['childCount']; + //$tmp['page'] = $files['folder']['page']; + foreach ($files['list'] as $file) { + $filename = strtolower($file['server_filename']); + if (!$file['isdir']) { + $tmp['list'][$filename]['type'] = 'file'; + //var_dump($file); + //echo $file['name'] . ':' . $this->DownurlStrName . ':' . $file[$this->DownurlStrName] . PHP_EOL; + //$tmp['list'][$filename]['url'] = $file[$this->DownurlStrName]; + $tmp['list'][$filename]['mime'] = $file['file']['mimeType']; + } elseif ($file['isdir']) { + $tmp['list'][$filename]['type'] = 'folder'; + } + $tmp['list'][$filename]['id'] = $file['fs_id']; + $tmp['list'][$filename]['name'] = $file['server_filename']; + $tmp['list'][$filename]['time'] = date('Y-m-d H:i:s', $file['server_mtime']); + $tmp['list'][$filename]['size'] = $file['size']; + if (isset($file['thumbs'])) $tmp['list'][$filename]['thumbs'] = $file['thumbs']; + } + } else { + $tmp['type'] = 'file'; + $tmp['id'] = $files['fs_id']; + $tmp['name'] = $files['filename']; + $tmp['time'] = date('Y-m-d H:i:s', $files['server_mtime']); + $tmp['size'] = $files['size']; + $tmp['mime'] = $files['file']['mimeType']; + $tmp['url'] = $files['url'];//$files[$this->DownurlStrName]; + if (isset($files['content'])) $tmp['content'] = $files['content']; + if (isset($files['thumbs'])) $tmp['thumbs'] = $files['thumbs']; + } + } elseif (isset($files['type']) || isset($files['error'])) { + //echo '
' . json_encode($files, JSON_PRETTY_PRINT) . '
'; + return $files; + } + //error_log1(json_encode($tmp)); + //echo '
' . json_encode($tmp, JSON_PRETTY_PRINT) . '
'; + return $tmp; + } + + protected function fetch_files_children($path, $page, $getNextlink = false) { + $children = getcache('files_' . $path . '_page_' . $page, $this->disktag); + if (!$children) { + $url = $this->api_url . $this->ext_api_url; + if ($path !== '/') { + $url .= ':' . $path; + if (substr($url,-1)=='/') $url=substr($url,0,-1); + $url .= ':'; + } + $url .= '/children?$top=' . ($page-1)*200 . '&$select=id,name,size,file,folder,parentReference,lastModifiedDateTime,' . $this->DownurlStrName; + $children_tmp = json_decode($this->MSAPI('GET', $url)['body'], true); + //echo $url . '
' . json_encode($children_tmp, JSON_PRETTY_PRINT) . '
'; + $p = 1; + $i = 0; + foreach ($children_tmp['value'] as $child) { + $i++; + $value_name = 'child_' . $p; + ${$value_name}['value'][] = $child; + if ($i==200) { + savecache('files_' . $path . '_page_' . $p, ${$value_name}, $this->disktag); + unset(${$value_name}); + $i = 0; + $p++; + } + } + + $url = $children_tmp['@odata.nextLink']; + $children_tmp = json_decode($this->MSAPI('GET', $url)['body'], true); + //echo $url . '
' . json_encode($children_tmp, JSON_PRETTY_PRINT) . '
'; + $p = $page; + $i = 0; + foreach ($children_tmp['value'] as $child) { + $i++; + $value_name = 'child_' . $p; + ${$value_name}['value'][] = $child; + if ($i==200) { + savecache('files_' . $path . '_page_' . $p, ${$value_name}, $this->disktag); + //unset(${$value_name}); + $i = 0; + $p++; + } + } + if ($i!=0) savecache('files_' . $path . '_page_' . $p, ${$value_name}, $this->disktag); + $value_name = 'child_' . $page; + return ${$value_name}; + } + return $children; + + /*if ($getNextlink) { + if (isset($children['@odata.nextLink'])) { + return $children; + } else { + if ($page*200>9800) { + $children_tmp = fetch_files_children($path, floor($page/49)*49, 1); + $url = $children_tmp['@odata.nextLink']; + $children = json_decode(curl('GET', $url, false, ['Authorization' => 'Bearer ' . $this->access_token])['body'], true); + } + } + }*/ + } + protected function fetch_files_children1($files, $path, $page) + { + $maxpage = ceil($files['folder']['childCount']/200); + if (!($children = getcache('files_' . $path . '_page_' . $page, $this->disktag))) { + $pageinfochange=0; + for ($page1=$page;$page1>=1;$page1--) { + $page3=$page1-1; + $url = getcache('nextlink_' . $path . '_page_' . $page3, $this->disktag); + if ($url == '') { + if ($page1==1) { + $url = $this->api_url . $this->ext_api_url; + if ($path !== '/') { + $url .= ':' . $path; + if (substr($url,-1)=='/') $url=substr($url,0,-1); + $url .= ':'; + } + $url .= '/children?$select=id,name,size,file,folder,parentReference,lastModifiedDateTime,'.$this->DownurlStrName; + $children = json_decode($this->MSAPI('GET', $url)['body'], true); + // echo $url . '
' . json_encode($children, JSON_PRETTY_PRINT) . '
'; + savecache('files_' . $path . '_page_' . $page1, $children, $this->disktag); + $nextlink=getcache('nextlink_' . $path . '_page_' . $page1, $this->disktag); + if ($nextlink!=$children['@odata.nextLink']) { + savecache('nextlink_' . $path . '_page_' . $page1, $children['@odata.nextLink'], $this->disktag); + $pageinfocache['nextlink_' . $path . '_page_' . $page1] = $children['@odata.nextLink']; + $pageinfocache = clearbehindvalue($path,$page1,$maxpage,$pageinfocache); + $pageinfochange = 1; + } + $url = $children['@odata.nextLink']; + for ($page2=$page1+1;$page2<=$page;$page2++) { + sleep(1); + $children = json_decode($this->MSAPI('GET', $url)['body'], true); + savecache('files_' . $path . '_page_' . $page2, $children, $this->disktag); + $nextlink=getcache('nextlink_' . $path . '_page_' . $page2, $this->disktag); + if ($nextlink!=$children['@odata.nextLink']) { + savecache('nextlink_' . $path . '_page_' . $page2, $children['@odata.nextLink'], $this->disktag); + $pageinfocache['nextlink_' . $path . '_page_' . $page2] = $children['@odata.nextLink']; + $pageinfocache = clearbehindvalue($path,$page2,$maxpage,$pageinfocache); + $pageinfochange = 1; + } + $url = $children['@odata.nextLink']; + } + //echo $url . '
' . json_encode($children, JSON_PRETTY_PRINT) . '
'; + return $children; + /* + $files['children'] = $children['value']; + $files['folder']['page']=$page; + $pageinfocache['filenum'] = $files['folder']['childCount']; + $pageinfocache['dirsize'] = $files['size']; + $pageinfocache['cachesize'] = $cachefile['size']; + $pageinfocache['size'] = $files['size']-$cachefile['size']; + if ($pageinfochange == 1) $this->MSAPI('PUT', path_format($path.'/'.$cachefilename), json_encode($pageinfocache, JSON_PRETTY_PRINT))['body']; + return $files;*/ + } + } else { + for ($page2=$page3+1;$page2<=$page;$page2++) { + sleep(1); + $children = json_decode($this->MSAPI('GET', $url)['body'], true); + savecache('files_' . $path . '_page_' . $page2, $children, $this->disktag, 3300); + $nextlink=getcache('nextlink_' . $path . '_page_' . $page2, $this->disktag); + if ($nextlink!=$children['@odata.nextLink']) { + savecache('nextlink_' . $path . '_page_' . $page2, $children['@odata.nextLink'], $this->disktag, 3300); + $pageinfocache['nextlink_' . $path . '_page_' . $page2] = $children['@odata.nextLink']; + $pageinfocache = clearbehindvalue($path,$page2,$maxpage,$pageinfocache); + $pageinfochange = 1; + } + $url = $children['@odata.nextLink']; + } + //echo $url . '
' . json_encode($children, JSON_PRETTY_PRINT) . '
'; + return $children; + + /*$files['children'] = $children['value']; + $files['folder']['page']=$page; + $pageinfocache['filenum'] = $files['folder']['childCount']; + $pageinfocache['dirsize'] = $files['size']; + $pageinfocache['cachesize'] = $cachefile['size']; + $pageinfocache['size'] = $files['size']-$cachefile['size']; + if ($pageinfochange == 1) $this->MSAPI('PUT', path_format($path.'/'.$cachefilename), json_encode($pageinfocache, JSON_PRETTY_PRINT))['body']; + return $files;*/ + } + } + }/* else { + $files['folder']['page']=$page; + for ($page4=1;$page4<=$maxpage;$page4++) { + if (!($url = getcache('nextlink_' . $path . '_page_' . $page4, $this->disktag))) { + if ($files['folder'][$path.'_'.$page4]!='') savecache('nextlink_' . $path . '_page_' . $page4, $files['folder'][$path.'_'.$page4], $this->disktag); + } else { + $files['folder'][$path.'_'.$page4] = $url; + } + } + }*/ + return $children; + //return $files; + } + + public function Rename($file, $newname) { + $oldname = spurlencode($file['name']); + $oldname = path_format($file['path'] . '/' . $oldname); + $data = 'async=1'; + $data .= '&filelist=[{"path":"' . $oldname . '","newname":"' . $newname . '"}]'; + $url = $this->api_url . $this->ext_api_url; + $url .= 'file?method=filemanager&access_token=' . $this->access_token . '&opera=rename'; + $result = curl('POST', $url, $data); + if (json_decode($result['body'], true)['errno']===0) return output('{"name":"' . $newname . '"}', 200); + else return output($result['body'], $result['stat']); + //return output(json_encode($this->files_format(json_decode($result['body'], true))), $result['stat']); + } + public function Delete($file) { + $filename = spurlencode($file['name']); + $filename = path_format($file['path'] . '/' . $filename); + $data = 'async=1'; + $data .= '&filelist=["' . $filename . '"]'; + $url = $this->api_url . $this->ext_api_url; + $url .= 'file?method=filemanager&access_token=' . $this->access_token . '&opera=delete'; + $result = curl('POST', $url, $data); + if (json_decode($result['body'], true)['errno']===0) return output('', 204); + else return output($result['body'], $result['stat']); + } + public function Encrypt($folder, $passfilename, $pass) { + $result = $this->Create($folder, 'file', $passfilename, $pass); + $path1 = $folder['path']; + if ($path1!='/'&&substr($path1, -1)=='/') $path1 = substr($path1, 0, -1); + savecache('path_' . $path1 . '/?password', '', $this->disktag, 1); + return output(json_encode($this->files_format(json_decode($result['body'], true))), $result['stat']); + //return output($result['body'], $result['stat']); + } + public function Move($file, $folder, $replace = 'fail') { + $filename = spurlencode($file['name']); + $filename = path_format($file['path'] . '/' . $filename); + $data = 'async=1'; + $data .= '&filelist=[{"path":"' . $filename . '","dest":"' . $folder['path'] . '","newname":"' . $file['name'] . '","ondup":"' . $replace . '"}]'; + error_log1('data in MOVE: ' . $data); + $url = $this->api_url . $this->ext_api_url; + $url .= 'file?method=filemanager&access_token=' . $this->access_token . '&opera=move'; + $result = curl('POST', $url, $data); + if (!$result['stat']) $result['stat'] = 501; + $path2 = spurlencode($folder['path'], '/'); + if ($path2!='/'&&substr($path2, -1)=='/') $path2 = substr($path2, 0, -1); + savecache('path_' . $path2, json_decode('{}', true), $this->disktag, 1); + if (json_decode($result['body'], true)['errno']===0) return ['stat'=>200, 'body'=>'{"errno":0,"name":"' . $file['name'] . '"}']; + else return output($result['body'], $result['stat']); + //return output(json_encode($this->files_format(json_decode($result['body'], true))), $result['stat']); + return output($result['body'], $result['stat']); + } + public function Copy($file) { + $filename = spurlencode($file['name']); + $filename = path_format($file['path'] . '/' . $filename); + $data = 'async=0'; + $data .= '&filelist=[{"path":"' . $filename . '","dest":"' . $file['path'] . '","newname":"' . $file['name'] . '","ondup":"newcopy"}]'; + $url = $this->api_url . $this->ext_api_url; + $url .= 'file?method=filemanager&access_token=' . $this->access_token . '&opera=copy'; + while ($p<3 && !$result['stat']) { + $result = curl('POST', $url, $data); + $p++; + } + + /*$namearr = splitlast($file['name'], '.'); + date_default_timezone_set('UTC'); + if ($namearr[0]!='') { + $newname = $namearr[0] . ' (' . date("Ymd\THis\Z") . ')'; + if ($namearr[1]!='') $newname .= '.' . $namearr[1]; + } else { + $newname = '.' . $namearr[1] . ' (' . date("Ymd\THis\Z") . ')'; + } + $data = '{ "name": "' . $newname . '" }'; + if ($file['id']) $result = $this->MSAPI('copy', "/items/" . $file['id'], $data); + else $result = $this->MSAPI('copy', $filename, $data); + $num = 0; + while ($result['stat']==409 && json_decode($result['body'], true)['error']['code']=='nameAlreadyExists') { + $num++; + if ($namearr[0]!='') { + $newname = $namearr[0] . ' (' . getconstStr('Copy') . ' ' . $num . ')'; + if ($namearr[1]!='') $newname .= '.' . $namearr[1]; + } else { + $newname = '.' . $namearr[1] . ' ('.getconstStr('Copy'). ' ' . $num .')'; + } + //$newname = spurlencode($newname); + $data = '{ "name": "' . $newname . '" }'; + $result = $this->MSAPI('copy', $filename, $data); + }*/ + if (json_decode($result['body'], true)['errno']===0) return output('{"name":"' . $file['name'] . '"}', 200); + else return output($result['body'], $result['stat']); + //return output(json_encode($this->files_format(json_decode($result['body'], true))), $result['stat']); + //return output($url . "\n" . $data . "\n" . $result['body'], $result['stat']); + } + public function Edit($file, $content) { + /*TXT一般不会超过4M,不用二段上传 + $filename = $path1 . ':/createUploadSession'; + $response=MSAPI('POST',$filename,'{"item": { "@microsoft.graph.conflictBehavior": "replace" }}',$_SERVER['access_token']); + $uploadurl=json_decode($response,true)['uploadUrl']; + echo MSAPI('PUT',$uploadurl,$data,$_SERVER['access_token']);*/ + $result = $this->MSAPI('PUT', $file['path'], $content); + //return output($result['body'], $result['stat']); + //echo $result; + $resultarry = json_decode($result['body'],true); + if (isset($resultarry['error'])) return message($resultarry['error']['message']. '
'.getconstStr('Back').'','Error', 403); + else return output('success', 0); + } + public function Create($parent, $type, $name, $content = '') { + if ($type=='file') { + $file['path'] = $parent['path']; + $file['name'] = $name; + $file['size'] = strlen($content); + $file['md5s'] = '["' . md5($content) . '"]'; + $result = $this->preCreate($file); + //echo 'preCreate
' . json_encode($result, 448) . '
'; + if ($result['stat']==200 && json_decode($result['body'],true)['errno']==0) { + $res = json_decode($result['body'], true); + if ($res['return_type']==2) { + //已有,秒传? + error_log1('Rapid_upload'); + $a = 1; + } else { + $result = $this->partUpload($res['path'], $res['uploadid'], 0, $content); + if ($result['stat']==200 && json_decode($result['body'],true)['md5']) { + $md5 = json_decode($result['body'], true)['md5']; + $info['path'] = $res['path']; + $info['size'] = $file['size']; + $info['md5s'] = '["' . $md5 . '"]'; + $info['uploadid'] = $res['uploadid']; + $result = $this->completeUpload($info); + if ($result['stat']==200 && json_decode($result['body'],true)['errno']==0) { + $res = json_decode($result['body'], true); + if (substr($res['path'], 0, strlen($res['path'])-strlen($res['server_filename']))!=$parent['path']) { + $result = $this->Move(['name'=>$res['server_filename'],'path'=>spurlencode(substr($res['path'], 0, strlen($res['path'])-strlen($res['server_filename'])), '/')], ['path'=>$parent['path']], 'overwrite'); + $res = json_decode($result['body'], true); + if ($res['errno']===0) { + $name1 = splitfirst(splitfirst($parent['path'],'/')[1],'/')[0]; + //echo 'deleting ' . $name1; + $this->Delete(['name'=>$name1, 'path'=>'/apps/' . $this->appName . '/']); + } else { + $res = json_decode($result['body'], true); + $res['OMmsg'] = 'err in Move.'; + $result['body'] = json_encode($res); + } + } + } else { + $res1 = json_decode($result['body'], true); + $res1['OMmsg'] = 'err in completeUpload.'; + $res1['preCreate_result'] = $res; + $result['body'] = json_encode($res1); + } + } else { + $res = json_decode($result['body'], true); + $res['OMmsg'] = 'err in partUpload.'; + $result['body'] = json_encode($res); + } + } + } else { + $res = json_decode($result['body'], true); + $res['OMmsg'] = 'err in preCreate.'; + $result['body'] = json_encode($res); + } + } + if ($type=='folder') { + $file['path'] = urldecode($parent['path']) . '/' . $name; + $file['size'] = strlen($content); + //$file['md5s'] = '["' . md5($content) . '"]'; + $result = $this->completeUpload($file, 1); + } + if ($result['stat']===0) $result['stat'] = 501; + //savecache('path_' . $path1, json_decode('{}',true), $_SERVER['disktag'], 1); + //return output(json_encode($this->files_format(json_decode($result['body'], true))), $result['stat']); + return output($result['body'], $result['stat']); + } + private function preCreate($file, $isdir = 0) { + $url = $this->api_url . $this->ext_api_url; + $url .= 'file?method=precreate&access_token=' . $this->access_token; + //error_log1('url: ' . $url); + if (substr($file['path'],0,17)==='/apps/' . $this->appName . '/') $path = $file['path']; + else $path = '/apps/' . $this->appName . '/' . $file['path']; + $data['path'] = path_format($path . '/' . urlencode($file['name'])); + $data['size'] = $file['size']; + $data['isdir'] = $isdir; + $data['block_list'] = $file['md5s']; + $data['autoinit'] = 1; + $data['rtype'] = 3; // 0: fail, 1: rename, 2: rename when not same, 3: overlay + foreach ($data as $key => $value) $formdata .= '&' . $key . '=' . $value; + $formdata = substr($formdata, 1); + error_log1('data: ' . $formdata); + while ($p<3 && !$result['stat']) { + $result = curl('POST', $url, $formdata); + $p++; + } + error_log1('res_pre: ' . json_encode($result)); + return $result; + } + private function partUpload($path, $uploadid, $partnum, $content) { + $url = 'https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?method=upload&access_token=' . $this->access_token . '&type=tmpfile&path=' . $path . '&uploadid=' . $uploadid . '&partseq=' . $partnum; + $file = sys_get_temp_dir() . '/' . $uploadid . '_' . $partnum; + file_put_contents($file, $content); + $data['file'] = '@' . $file; + while ($p<3 && !$result['stat']) { + $result = curl('POST', $url, $data, ['content-type'=>'multipart/form-data']); + $p++; + } + error_log1('res_uping: ' . json_encode($result)); + file_put_contents($file, ''); + return $result; + } + private function completeUpload($info, $isdir = 0) { + $url = $this->api_url . $this->ext_api_url; + $url .= 'file?method=create&access_token=' . $this->access_token; + //error_log1('url: ' . $url); + $data['path'] = urlencode($info['path']); + //$data['path'] = $info['path']; + $data['size'] = $info['size']; + $data['isdir'] = $isdir; + $data['block_list'] = $info['md5s']; + $data['uploadid'] = $info['uploadid']; + $data['rtype'] = 3; // 0: fail, 1: rename, 2: rename when not same, 3: overlay + foreach ($data as $key => $value) $formdata .= '&' . $key . '=' . $value; + $formdata = substr($formdata, 1); + error_log1('data: ' . $formdata); + while ($p<3 && !$result['stat']) { + $result = curl('POST', $url, $formdata); + $p++; + } + error_log1('res_comp: ' . json_encode($result)); + return $result; + } + + public function AddDisk() { + global $constStr; + global $EnvConfigs; + + $envs = ''; + foreach ($EnvConfigs as $env => $v) if (isCommonEnv($env)) $envs .= '\'' . $env . '\', '; + $url = $_SERVER['PHP_SELF']; + //$this->api_url = splitfirst($_SERVER['api_url'], '/v1.0')[0] . '/v1.0'; + + if (isset($_GET['Finish'])) { + if ($this->access_token == '') { + $refresh_token = getConfig('refresh_token', $this->disktag); + if (!$refresh_token) { + $html = 'No refresh_token config, please AddDisk again or wait minutes.
' . $this->disktag; + $title = 'Error'; + return message($html, $title, 201); + } + $response = $this->get_access_token($refresh_token); + if (!$response) return message($this->error['body'], $this->error['stat'] . ' Error', $this->error['stat']); + } + + $tmp = null; + $tmp['Driver'] = get_class($this); + if ($_POST['DriveType']=='Onedrive') { + /*$api = $this->api_url . '/me'; + $arr = curl('GET', $api, '', [ 'Authorization' => 'Bearer ' . $this->access_token ], 1); + if ($arr['stat']==200) { + $userid = json_decode($arr['body'], true)['id']; + $api = $this->api_url . '/users/' . $userid . '/drive'; + $arr = curl('GET', $api, '', [ 'Authorization' => 'Bearer ' . $this->access_token ], 1); + if ($arr['stat']!=200) return message($arr['stat'] . '
' . $api . '
' . $arr['body'], 'Get User Drive ID', $arr['stat']); + $tmp['DriveId'] = json_decode($arr['body'], true)['id']; + } elseif ($arr['stat']==403||$arr['stat']==401) { + // 403:世纪不让列me,401:个人也不给拿 + $api = $this->api_url . '/me/drive'; + } else { + return message($arr['stat'] . $arr['body'], 'Get User ID', $arr['stat']); + }*/ + if ($tmp['Driver']=='Sharepoint') $tmp['Driver'] = 'Onedrive'; + elseif ($tmp['Driver']=='SharepointCN') $tmp['Driver'] = 'OnedriveCN'; + $tmp['sharepointSite'] = ''; + $tmp['siteid'] = ''; + } elseif ($_POST['DriveType']=='Custom') { + // sitename计算siteid + $tmp1 = $this->get_siteid($_POST['sharepointSite']); + if (isset($tmp1['stat'])) return message($arr['stat'] . $tmp1['body'], 'Get Sharepoint Site ID ' . $_POST['sharepointSite'], $tmp1['stat']); + $siteid = $tmp1; + //$api = $this->api_url . '/sites/' . $siteid . '/drive/'; + //$arr = curl('GET', $api, '', [ 'Authorization' => 'Bearer ' . $this->access_token ], 1); + //if ($arr['stat']!=200) return message($arr['stat'] . $arr['body'], 'Get Sharepoint Drive ID ' . $_POST['DriveType'], $arr['stat']); + $tmp['siteid'] = $siteid; + $tmp['sharepointSite'] = $_POST['sharepointSite']; + if ($tmp['Driver']=='Onedrive') $tmp['Driver'] = 'Sharepoint'; + elseif ($tmp['Driver']=='OnedriveCN') $tmp['Driver'] = 'SharepointCN'; + } else { + // 直接是siteid + $tmp['siteid'] = $_POST['DriveType']; + $tmp['sharepointSite'] = $_POST['sharepointSiteUrl']; + if ($tmp['Driver']=='Onedrive') $tmp['Driver'] = 'Sharepoint'; + elseif ($tmp['Driver']=='OnedriveCN') $tmp['Driver'] = 'SharepointCN'; + } + + $response = setConfigResponse( setConfig($tmp, $this->disktag) ); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 201); + } else { + $html .= ''; + return message($html, getconstStr('Wait'), 201, 1); + } + } + + if (isset($_GET['SelectDrive'])) { + if ($this->access_token == '') { + $refresh_token = getConfig('refresh_token', $this->disktag); + if (!$refresh_token) { + $html = 'No refresh_token config, please AddDisk again or wait minutes.
' . $this->disktag; + $title = 'Error'; + return message($html, $title, 201); + } + $response = $this->get_access_token($refresh_token); + if (!$response) return message($this->error['body'], $this->error['stat'] . ' Error', $this->error['stat']); + } + $url = 'https://pan.baidu.com/rest/2.0/xpan/nas?method=uinfo&access_token=' . $this->access_token; + $response = json_decode(curl('GET', $url)['body'], true); + $html = '头图 ' . $response['avatar_url'] . "
\n"; + $html .= '名 ' . $response['baidu_name'] . "
\n"; + $html .= '名 ' . $response['netdisk_name'] . "
\n"; + $html .= $response['errno'] . "
\n"; + $html .= $response['errmsg'] . "
\n"; + + $html .= '空间 ' . $this->getDiskSpace() . "
\n"; + + $html .= '程序还在测试,上面信息显示正常就请直接去首页。'; + return message($html, $title, 201); + + $title = 'Select Driver'; + $html = ' +
+
+
'; + if ($sites[0]!='') foreach ($sites as $k => $v) { + $html .= ' + '; + } + $html .= ' + +
+ '; + $html .= ' + +
+
+ +'; + return message($html, $title, 201); + } + + if (isset($_GET['install2']) && isset($_GET['code'])) { + $tmp = curl('GET', $this->oauth_url . 'token?grant_type=authorization_code&code=' . $_GET['code'] . '&client_id=' . $this->client_id .'&client_secret=' . $this->client_secret . '&redirect_uri=' . $this->redirect_uri ); + if ($tmp['stat']==200) $ret = json_decode($tmp['body'], true); + if (isset($ret['refresh_token'])) { + $refresh_token = $ret['refresh_token']; + $str = ' + refresh_token :
'; + $str .= ' +

+ ' . getconstStr('SavingToken') . ' + '; + $tmptoken['Driver'] = $_GET['AddDisk']; + $tmptoken['refresh_token'] = $refresh_token; + $tmptoken['token_expires'] = time()+7*24*60*60; + $response = setConfigResponse( setConfig($tmptoken, $this->disktag) ); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 201); + } else { + savecache('access_token', $ret['access_token'], $this->disktag, $ret['expires_in'] - 60); + $html .= ''; + return message($html, getconstStr('Wait') . ' 3s', 201, 1); + } + } + return message('
' . json_encode(json_decode($tmp['body']), JSON_PRETTY_PRINT) . '
', $tmp['stat']); + //return message('
' . json_encode($ret, JSON_PRETTY_PRINT) . '
', 500); + } + + if (isset($_GET['install1'])) { + //if (get_class($this)=='Onedrive' || get_class($this)=='OnedriveCN') { + return message(' + ' . getconstStr('JumptoOffice') . ' + + ', getconstStr('Wait') . ' 1s', 201); + //} else { + // return message('Something error, retry after a few seconds.', 'Retry', 201); + //} + } + + if (isset($_GET['install0'])) { + if ($_POST['disktag_add']!='') { + $_POST['disktag_add'] = preg_replace('/[^0-9a-zA-Z|_]/i', '', $_POST['disktag_add']); + $f = substr($_POST['disktag_add'], 0, 1); + if (strlen($_POST['disktag_add'])==1) $_POST['disktag_add'] .= '_'; + if (isCommonEnv($_POST['disktag_add'])) { + return message('Do not input ' . $envs . '
', 'Error', 400); + } elseif (!(('a'<=$f && $f<='z') || ('A'<=$f && $f<='Z'))) { + return message('Please start with letters
+ ', 'Error', 400); + } + + $tmp = null; + // clear envs + foreach ($EnvConfigs as $env => $v) if (isInnerEnv($env)) $tmp[$env] = ''; + + $tmp['disktag_add'] = $_POST['disktag_add']; + $tmp['diskname'] = $_POST['diskname']; + $tmp['Driver'] = $_GET['AddDisk']; + if ($_POST['custom_client']=='on') { + $tmp['client_id'] = $_POST['client_id']; + $tmp['client_secret'] = $_POST['client_secret']; + } + $response = setConfigResponse( setConfig($tmp, $this->disktag) ); + if (api_error($response)) { + $html = api_error_msg($response); + $title = 'Error'; + return message($html, $title, 400); + } else { + $title = getconstStr('MayinEnv'); + $html = getconstStr('Wait'); + $url .= '?install1&disktag=' . $_GET['disktag'] . '&AddDisk=' . $_GET['AddDisk']; + $html .= ''; + return message($html, $title, 201, 1); + } + + } + } + + $html = ' +
+
+ ' . getconstStr('DiskTag') . ': (' . getConfig('disktag') . ') +
+ ' . getconstStr('DiskName') . ': +
+
+
+ +
'; + $html .= '第三方程序只能在"/apps/程序名/"有上传权限,所以最好将public_path设置为"/apps/' . $this->appName . '/"。

'; + if ($_SERVER['language']=='zh-cn') $html .= '你要理解 scfonedrive.github.io 是github上的静态网站,
除非github真的挂掉了,
不然,稍后你如果连不上,请检查你的运营商或其它“你懂的”问题!
'; + $html .=' + +
+
+ '; + $title = 'Select Account Type'; + return message($html, $title, 201); + } + + protected function get_access_token($refresh_token) { + if (!$refresh_token) { + $tmp['stat'] = 0; + $tmp['body'] = 'No refresh_token'; + $this->error = $tmp; + return false; + } + if (!($this->access_token = getcache('access_token', $this->disktag))) { + $p=0; + while ($response['stat']==0&&$p<3) { + $response = curl('GET', $this->oauth_url . 'token?grant_type=refresh_token&refresh_token=' . $refresh_token . '&client_id=' . $this->client_id . '&client_secret=' . $this->client_secret ); + $p++; + } + if ($response['stat']==200) $ret = json_decode($response['body'], true); + if (!isset($ret['access_token'])) { + error_log1($this->oauth_url . 'token' . '?client_id=' . $this->client_id . '&client_secret=' . $this->client_secret . '&grant_type=refresh_token&requested_token_use=on_behalf_of&refresh_token=' . substr($refresh_token, 0, 20) . '******' . substr($refresh_token, -20)); + error_log1('failed to get [' . $this->disktag . '] access_token. response: ' . $response['body']); + $response['body'] = json_encode(json_decode($response['body']), JSON_PRETTY_PRINT); + $response['body'] .= '\nfailed to get [' . $this->disktag . '] access_token.'; + $this->error = $response; + return false; + //throw new Exception($response['stat'].', failed to get ['.$this->disktag.'] access_token.'.$response['body']); + } + $tmp = $ret; + $tmp['access_token'] = substr($tmp['access_token'], 0, 10) . '******'; + $tmp['refresh_token'] = substr($tmp['refresh_token'], 0, 10) . '******'; + error_log1('[' . $this->disktag . '] Get access token:' . json_encode($tmp, JSON_PRETTY_PRINT)); + $this->access_token = $ret['access_token']; + savecache('access_token', $this->access_token, $this->disktag, $ret['expires_in'] - 300); + //if (time()>getConfig('token_expires', $this->disktag)) + setConfig([ 'refresh_token' => $ret['refresh_token'], 'token_expires' => time()+7*24*60*60 ], $this->disktag); + return true; + } + return true; + } + + public function del_upload_cache($path) + { + error_log1('del.tmp:GET,'.json_encode($_GET,JSON_PRETTY_PRINT)); + $tmp = splitlast($_GET['filename'], '/'); + if ($tmp[1]!='') { + $filename = $tmp[0] . '/.' . $_GET['filelastModified'] . '_' . $_GET['filesize'] . '_' . $tmp[1] . '.tmp'; + } else { + $filename = '.' . $_GET['filelastModified'] . '_' . $_GET['filesize'] . '_' . $_GET['filename'] . '.tmp'; + } + $filename = path_format( path_format($_SERVER['list_path'] . path_format($path)) . '/' . spurlencode($filename, '/') ); + $tmp = $this->MSAPI('DELETE', $filename, ''); + $path1 = path_format($_SERVER['list_path'] . path_format($path)); + if ($path1!='/'&&substr($path1,-1)=='/') $path1=substr($path1,0,-1); + savecache('path_' . $path1, json_decode('{}',true), $this->disktag, 1); + return output($tmp['body'],$tmp['stat']); + } + + public function get_thumbnails_url($path = '/') + { + $thumb_url = getcache('thumb_'.$path, $this->disktag); + if ($thumb_url=='') { + $files = $this->list_files(splitlast($path, '/')[0])['list'][strtolower(urldecode(splitlast($path, '/')[1]))]; + if (isset($files['thumbs'])) { + savecache('thumb_' . $path, $files['thumbs']['url2'], $this->disktag); + $thumb_url = $files['thumbs']['url2']; + } + } + return $thumb_url; + } + + public function smallfileupload($path, $tmpfile) { + if (!$_SERVER['admin']) { + $tmp1 = splitlast($tmpfile['name'], '.'); + if ($tmp1[0]==''||$tmp1[1]=='') $filename = md5_file($tmpfile['tmp_name']); + else $filename = md5_file($tmpfile['tmp_name']) . '.' . $tmp1[1]; + } else { + $filename = $tmpfile['name']; + } + $content = file_get_contents($tmpfile['tmp_name']); + $result = $this->Create(['path'=>path_format($_SERVER['list_path'] . '/' . $path . '/')], 'file', $filename, $content); + //echo 'Small
' . json_encode($result, 448) . '
'; + $res = json_decode($result['body'], true); + if (isset($res['errno'])&&$res['errno']===0) $res['url'] = $_SERVER['host'] . path_format($_SERVER['base_disk_path'] . '/' . $path . '/' . $filename); + return output(json_encode($res, JSON_UNESCAPED_SLASHES), $result['stat']); + } + public function bigfileupload($path) + { + if ($_POST['upbigfilename']=='') return output('error: no file name', 400); + if (!is_numeric($_POST['filesize'])) return output('error: no file size', 400); + if (!$_SERVER['admin']) if (!isset($_POST['filemd5'])) return output('error: no file md5', 400); + + $tmp = splitlast($_POST['upbigfilename'], '/'); + if ($tmp[1]!='') { + $fileinfo['name'] = $tmp[1]; + if ($_SERVER['admin']) $fileinfo['path'] = $tmp[0]; + } else { + $fileinfo['name'] = $_POST['upbigfilename']; + } + $fileinfo['size'] = $_POST['filesize']; + $fileinfo['filelastModified'] = $_POST['filelastModified']; + if ($_SERVER['admin']) { + $filename = spurlencode($_POST['upbigfilename'], '/'); + } else { + $tmp1 = splitlast($fileinfo['name'], '.'); + if ($tmp1[0]==''||$tmp1[1]=='') $filename = $_POST['filemd5']; + else $filename = $_POST['filemd5'] . '.' . $tmp1[1]; + } + if ($fileinfo['size']>10*1024*1024) { + $cachefilename = spurlencode( $fileinfo['path'] . '/.' . $fileinfo['filelastModified'] . '_' . $fileinfo['size'] . '_' . $fileinfo['name'] . '.tmp', '/'); + $getoldupinfo = $this->list_files(path_format($path . '/' . $cachefilename)); + //error_log1(json_encode($getoldupinfo, JSON_PRETTY_PRINT)); + if (isset($getoldupinfo['url'])&&$getoldupinfo['size']<5120) { + $getoldupinfo_j = curl('GET', $getoldupinfo['url']); + $getoldupinfo = json_decode($getoldupinfo_j['body'], true); + if ( json_decode( curl('GET', $getoldupinfo['uploadUrl'])['body'], true)['@odata.context']!='' ) return output($getoldupinfo_j['body'], $getoldupinfo_j['stat']); + } + } + $response = $this->MSAPI('createUploadSession', path_format($path . '/' . $filename), '{"item": { "@microsoft.graph.conflictBehavior": "fail" }}'); + if ($response['stat']<500) { + $responsearry = json_decode($response['body'],true); + if (isset($responsearry['error'])) return output($response['body'], $response['stat']); + $fileinfo['uploadUrl'] = $responsearry['uploadUrl']; + if ($fileinfo['size']>10*1024*1024) $this->MSAPI('PUT', path_format($path . '/' . $cachefilename), json_encode($fileinfo, JSON_PRETTY_PRINT)); + } + return output($response['body'], $response['stat']); + } + public function getDiskSpace() { + if (!($diskSpace = getcache('diskSpace', $this->disktag))) { + $url = 'https://pan.baidu.com/api/quota?access_token=' . $this->access_token; + $p=0; + while ($response['stat']==0&&$p<3) { + $response = curl('GET', $url); + $p++; + }//return $response['body']; + $res = json_decode($response['body'], true); + $used = size_format($res['used']); + $total = size_format($res['total']); + $diskSpace = $used . ' / ' . $total; + //$diskSpace = $response['body'] . '
' . $res['used'] . ' / ' . $res['total']; + savecache('diskSpace', $diskSpace, $this->disktag); + } + return $diskSpace; + } + public function ConduitDown($url, $filetime, $fileConduitCacheTime) { + $res = curl('GET', $url . '&access_token=' . $this->access_token, '', ['User-Agent'=>'pan.baidu.com'], 0, 1); + //echo $res['returnhead']['Location']; + if ($res['stat']==200) { + return output( + base64_encode($res['body']), + 200, + [ + 'Accept-Ranges' => 'bytes', + //'access-control-allow-origin' => '*', + //'access-control-expose-headers' => 'Content-Length, WWW-Authenticate, Location, Accept-Ranges', + 'Content-Type' => $files['mime'], + 'Cache-Control' => 'max-age=' . $fileConduitCacheTime, + //'Cache-Control' => 'max-age=0', + 'Last-Modified' => gmdate('D, d M Y H:i:s T', strtotime($filetime)) + ], + true + ); + } else { + return output($res['body'], $res['stat']); + } + } + + protected function MSAPI($method, $path, $data = '', $headers = []) + { + $activeLimit = getConfig('activeLimit', $this->disktag); + if ($activeLimit!='') { + if ($activeLimit>time()) { + $tmp['error']['code'] = 'Retry-After'; + $tmp['error']['message'] = 'MS limit until ' . date('Y-m-d H:i:s', $activeLimit); + return [ 'stat' => 429, 'body' => json_encode($tmp) ]; + } else { + setConfig(['activeLimit' => ''], $this->disktag); + } + } + if (substr($path,0,7) == 'http://' or substr($path,0,8) == 'https://') { + $url = $path; + } else { + $url = $this->api_url . $this->ext_api_url; + if ($path=='' or $path=='/') { + $url .= '/'; + } elseif (substr($path, 0, 6)=="/items") { + $url = substr($url, 0, -5); + $url .= $path; + } else { + $url .= ':' . $path; + if (substr($url,-1)=='/') $url=substr($url,0,-1); + } + if ($method=='GET') { + $method = 'GET'; // do nothing + } elseif ($method=='PUT') { + if ($path=='' or $path=='/') { + $url .= 'content'; + } else { + $url .= ':/content'; + } + $headers['Content-Type'] = 'text/plain'; + } elseif ($method=='PATCH') { + $headers['Content-Type'] = 'application/json'; + } elseif ($method=='POST') { + $headers['Content-Type'] = 'application/json'; + } elseif ($method=='DELETE') { + $headers['Content-Type'] = 'application/json'; + } else { + if ($path=='' or $path=='/') { + $url .= $method; + } elseif (substr($path, 0, 6)=="/items") { + $url .= '/' . $method; + } else { + $url .= ':/' . $method; + } + $method='POST'; + $headers['Content-Type'] = 'application/json'; + } + } + $headers['Authorization'] = 'Bearer ' . $this->access_token; + if (!isset($headers['Accept'])) $headers['Accept'] = '*/*'; + //if (!isset($headers['Referer'])) $headers['Referer'] = $url;* + $sendHeaders = array(); + foreach ($headers as $headerName => $headerVal) { + $sendHeaders[] = $headerName . ': ' . $headerVal; + } + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); + curl_setopt($ch, CURLOPT_POSTFIELDS, $data); + curl_setopt($ch, CURLOPT_TIMEOUT, 5); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + //curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); + curl_setopt($ch, CURLOPT_HTTPHEADER, $sendHeaders); + $retry = 0; + $response = []; + while ($retry<3&&!$response['stat']) { + $response['body'] = curl_exec($ch); + $response['stat'] = curl_getinfo($ch, CURLINFO_HTTP_CODE); + $retry++; + } + //$response['Location'] = curl_getinfo($ch); + if ($response['stat']==429) { + $res = json_decode($response['body'], true); + $retryAfter = $res['error']['retryAfterSeconds']; + $retryAfter_n = (int)$retryAfter; + if ($retryAfter_n>0) { + $tmp1['activeLimit'] = $retryAfter_n + time(); + setConfig($tmp1, $this->disktag); + } + } + curl_close($ch); + /*error_log1($response['stat'].' + '.$response['body'].' + '.$url.' + ');*/ + return $response; + } + +}