mirror of
https://github.com/ctwj/urldb.git
synced 2025-11-25 03:15:04 +08:00
308 lines
10 KiB
PHP
308 lines
10 KiB
PHP
<?php
|
||
namespace netdisk\pan;
|
||
|
||
class AlipanPan extends BasePan
|
||
{
|
||
public function __construct($config = [])
|
||
{
|
||
parent::__construct($config);
|
||
$this->urlHeader = [
|
||
'Accept: application/json, text/plain, */*',
|
||
'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
|
||
'Authorization: ',
|
||
'Content-Type: application/json',
|
||
'Origin: https://www.alipan.com',
|
||
'Priority: u=1, i',
|
||
'Referer: https://www.alipan.com/',
|
||
'Sec-Ch-Ua: "Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122"',
|
||
'Sec-Ch-Ua-Mobile: ?0',
|
||
'Sec-Ch-Ua-Platform: "Windows"',
|
||
'Sec-Fetch-Dest: empty',
|
||
'Sec-Fetch-Mode: cors',
|
||
'Sec-Fetch-Site: same-site',
|
||
'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0',
|
||
'X-Canary: client=web,app=share,version=v2.3.1'
|
||
];
|
||
}
|
||
|
||
public function getFiles($pdir_fid=0)
|
||
{
|
||
$tokenFile = __DIR__ . '/access_token.json';
|
||
$access_token = $this->manageAccessToken($tokenFile);
|
||
if(empty($access_token)){
|
||
return jerr2('登录状态异常,获取access_token失败');
|
||
}
|
||
foreach ($this->urlHeader as &$header) {
|
||
if (str_starts_with($header, 'Authorization: ')) {
|
||
$header = 'Authorization: Bearer ' . $access_token;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if($pdir_fid === 0){
|
||
$pdir_fid = 'root';
|
||
}
|
||
|
||
$urlData = array(
|
||
'all' => false,
|
||
'drive_id' => '2008425230',
|
||
'fields' => "*",
|
||
'limit' => 100,
|
||
'order_by' => "updated_at",
|
||
'order_direction' => "DESC",
|
||
'parent_file_id' => $pdir_fid,
|
||
'url_expire_sec' => 14400,
|
||
);
|
||
|
||
$res = curlHelper("https://api.aliyundrive.com/adrive/v3/file/list", "POST", json_encode($urlData),$this->urlHeader)['body'];
|
||
$res = json_decode($res, true);
|
||
if(!empty($res['message'])){
|
||
return jerr2($res['message']);
|
||
}
|
||
return jok2('获取成功',$res['items']);
|
||
}
|
||
|
||
public function transfer($share_id)
|
||
{
|
||
$tokenFile = __DIR__ . '/access_token.json';
|
||
$access_token = $this->manageAccessToken($tokenFile);
|
||
if(empty($access_token)){
|
||
return jerr2('登录状态异常,获取access_token失败');
|
||
}
|
||
foreach ($this->urlHeader as &$header) {
|
||
if (str_starts_with($header, 'Authorization: ')) {
|
||
$header = 'Authorization: Bearer ' . $access_token;
|
||
break;
|
||
}
|
||
}
|
||
|
||
$data = [];
|
||
$res = $this->getAlipan1($share_id);
|
||
if(!isset($res['file_infos'])){
|
||
return jerr2($res['message']);
|
||
}
|
||
$infos = $res;
|
||
|
||
if($this->isType == 1){
|
||
$urls['title'] = $infos['share_name'];
|
||
$urls['share_url'] = $this->url;
|
||
return jok2('检验成功', $urls);
|
||
}
|
||
|
||
//通过分享id获取file_id
|
||
$file_infos = $infos['file_infos'];
|
||
//通过分享id获取X-Share-Token
|
||
$res = $this->getAlipan2($share_id);
|
||
if(!isset($res['share_token'])){
|
||
return jerr2($res['message']);
|
||
}
|
||
$share_token = $res['share_token'];
|
||
|
||
$to_pdir_fid = Config('qfshop.ali_file'); //默认存储路径
|
||
if($this->expired_type == 2){
|
||
$to_pdir_fid = Config('qfshop.ali_file_time'); //临时资源路径
|
||
}
|
||
|
||
$data3['requests'] = [];
|
||
$data3['resource'] = 'file';
|
||
|
||
foreach ($file_infos as $key=>$value) {
|
||
$data3['requests'][$key]['body']['auto_rename'] = true;
|
||
$data3['requests'][$key]['body']['file_id'] = $value['file_id'];
|
||
$data3['requests'][$key]['body']['share_id'] = $share_id;
|
||
$data3['requests'][$key]['body']['to_drive_id'] = '2008425230';
|
||
$data3['requests'][$key]['body']['to_parent_file_id'] = $to_pdir_fid;
|
||
$data3['requests'][$key]['headers']['Content-Type'] = 'application/json';
|
||
$data3['requests'][$key]['id'] = $key.'';
|
||
$data3['requests'][$key]['method'] = 'POST';
|
||
$data3['requests'][$key]['url'] = '/file/copy';
|
||
}
|
||
|
||
//保存
|
||
$res = $this->getAlipan3($data3,$share_token);
|
||
if (!isset($res['responses'])) {
|
||
return jerr2($res['message'] ?? '请求失败,无响应数据');
|
||
}
|
||
|
||
$response = $res['responses'][0];
|
||
$body = $response['body'];
|
||
if (isset($body['code'])) {
|
||
return jerr2($body['message'] ?? '请求失败');
|
||
}
|
||
|
||
$responses = $res['responses'];
|
||
|
||
$data4['drive_id'] = '2008425230';
|
||
$data4['expiration'] = '';
|
||
$data4['share_pwd'] = '';
|
||
$data4['file_id_list'] = [];
|
||
|
||
foreach ($responses as $key=>$value){
|
||
$data4['file_id_list'][] = $value['body']['file_id'];
|
||
}
|
||
|
||
//分享
|
||
$res = $this->getAlipan4($data4);
|
||
if(!isset($res['share_url'])){
|
||
return jerr2($res['message']??'转存失败4');
|
||
}
|
||
$share = $res;
|
||
|
||
$data['share_url'] = $share['share_url'];
|
||
$data['title'] = $share['share_title'];
|
||
$data['fid'] = $share['file_id_list'];
|
||
|
||
return jok2('转存成功', $data);
|
||
}
|
||
|
||
/**
|
||
* 阿里-0-通过分享id获取file_id
|
||
*
|
||
* @return void
|
||
*/
|
||
public function getAlipan1($share_id)
|
||
{
|
||
$urlData = [
|
||
'share_id' => $share_id,
|
||
];
|
||
$urlHeader = array(
|
||
'Content-Type: application/json',
|
||
);
|
||
$res = curlHelper("https://api.aliyundrive.com/adrive/v3/share_link/get_share_by_anonymous", "POST", json_encode($urlData),$urlHeader)['body'];
|
||
return json_decode($res, true);
|
||
}
|
||
|
||
/**
|
||
* 阿里-0-通过分享id获取X-Share-Token
|
||
*
|
||
* @return void
|
||
*/
|
||
public function getAlipan2($share_id)
|
||
{
|
||
$urlData = array(
|
||
'share_id' => $share_id,
|
||
);
|
||
$res = curlHelper("https://api.aliyundrive.com/v2/share_link/get_share_token", "POST", json_encode($urlData), $this->urlHeader)['body'];
|
||
return json_decode($res, true);
|
||
}
|
||
|
||
/**
|
||
* 阿里-1-保存
|
||
*
|
||
* @return void
|
||
*/
|
||
public function getAlipan3($urlData,$share_token)
|
||
{
|
||
$urlHeader= $this->urlHeader;
|
||
$urlHeader[] = 'X-Share-Token: '.$share_token;
|
||
$res = curlHelper("https://api.aliyundrive.com/adrive/v4/batch", "POST", json_encode($urlData), $urlHeader)['body'];
|
||
return json_decode($res, true);
|
||
}
|
||
|
||
/**
|
||
* 阿里-2-分享
|
||
*
|
||
* @return void
|
||
*/
|
||
public function getAlipan4($urlData)
|
||
{
|
||
$res = curlHelper("https://api.aliyundrive.com/adrive/v2/share_link/create", "POST", json_encode($urlData), $this->urlHeader)['body'];
|
||
return json_decode($res, true);
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* 管理 access_token
|
||
* @param string $tokenFile token文件路径
|
||
* @return string access_token
|
||
*/
|
||
private function manageAccessToken($tokenFile)
|
||
{
|
||
$tokenData = [];
|
||
$currentRefreshToken = Config('qfshop.Authorization');
|
||
|
||
// 检查文件是否存在
|
||
if (file_exists($tokenFile)) {
|
||
$tokenData = json_decode(file_get_contents($tokenFile), true);
|
||
|
||
// 检查token是否存在且未过期且不为空,且refresh_token未改变
|
||
if (isset($tokenData['access_token'])
|
||
&& isset($tokenData['expires_at'])
|
||
&& isset($tokenData['refresh_token'])
|
||
&& !empty($tokenData['access_token'])
|
||
&& time() < $tokenData['expires_at']
|
||
&& $tokenData['refresh_token'] === $currentRefreshToken
|
||
) {
|
||
return $tokenData['access_token'];
|
||
}
|
||
}
|
||
|
||
// 获取新的token
|
||
$newToken = $this->getNewAccessToken();
|
||
|
||
// 保存新token
|
||
$tokenData = [
|
||
'access_token' => $newToken,
|
||
'refresh_token' => $currentRefreshToken,
|
||
'expires_at' => time() + 3600
|
||
];
|
||
|
||
file_put_contents($tokenFile, json_encode($tokenData));
|
||
|
||
return $newToken;
|
||
}
|
||
|
||
/**
|
||
* 获取新的access_token
|
||
* @return string
|
||
*/
|
||
private function getNewAccessToken()
|
||
{
|
||
$urlData = [
|
||
'refresh_token' => Config('qfshop.Authorization'),
|
||
];
|
||
$urlHeader = array(
|
||
'Content-Type: application/json',
|
||
);
|
||
$res = curlHelper("https://api.aliyundrive.com/token/refresh", "POST", json_encode($urlData),$urlHeader)['body'];
|
||
$res = json_decode($res, true);
|
||
return $res['access_token']??'';
|
||
}
|
||
|
||
|
||
/**
|
||
* 删除指定资源
|
||
*
|
||
* @return void
|
||
*/
|
||
public function deletepdirFid($filelist)
|
||
{
|
||
$urlData['requests'] = [];
|
||
$urlData['resource'] = 'file';
|
||
|
||
foreach ($filelist as $key=>$value) {
|
||
$urlData['requests'][$key]['body']['file_id'] = $value??'';
|
||
$urlData['requests'][$key]['body']['drive_id'] = '2008425230';
|
||
$urlData['requests'][$key]['headers']['Content-Type'] = 'application/json';
|
||
$urlData['requests'][$key]['id'] = $value??'';
|
||
$urlData['requests'][$key]['method'] = 'POST';
|
||
$urlData['requests'][$key]['url'] = '/recyclebin/trash';
|
||
}
|
||
|
||
$tokenFile = __DIR__ . '/access_token.json';
|
||
$access_token = $this->manageAccessToken($tokenFile);
|
||
if(empty($access_token)){
|
||
return jerr2('登录状态异常,获取access_token失败');
|
||
}
|
||
foreach ($this->urlHeader as &$header) {
|
||
if (str_starts_with($header, 'Authorization: ')) {
|
||
$header = 'Authorization: Bearer ' . $access_token;
|
||
break;
|
||
}
|
||
}
|
||
$res = curlHelper("https://api.aliyundrive.com/adrive/v4/batch", "POST", json_encode($urlData), $this->urlHeader)['body'];
|
||
return json_decode($res, true);
|
||
}
|
||
|
||
} |