mirror of
https://github.com/ctwj/urldb.git
synced 2025-11-25 03:15:04 +08:00
252 lines
8.9 KiB
PHP
252 lines
8.9 KiB
PHP
<?php
|
||
namespace netdisk\pan;
|
||
|
||
class BaiduPan extends BasePan
|
||
{
|
||
|
||
public function getFiles($pdir_fid=0)
|
||
{
|
||
if($pdir_fid === 0){
|
||
$pdir_fid = '/';
|
||
}
|
||
$cookie = Config('qfshop.baidu_cookie');
|
||
$network = new \netdisk\pan\BaiduWork($cookie);
|
||
|
||
$res = $network->getDirList($pdir_fid);
|
||
// 如果返回的是错误码,说明目录不存在,需要创建
|
||
if (is_numeric($res)) {
|
||
return jerr2($network->getErrorMessage($res));
|
||
}
|
||
|
||
return jok2('获取成功',$res);
|
||
}
|
||
|
||
public function transfer($pwd_id)
|
||
{
|
||
$cookie = Config('qfshop.baidu_cookie');
|
||
$network = new \netdisk\pan\BaiduWork($cookie);
|
||
|
||
$bdstoken = $network->getBdstoken();
|
||
$network->setBdstoken($bdstoken);
|
||
|
||
$urlParts = parse_url($this->url);
|
||
$linkUrl = $urlParts['scheme'] . '://' . $urlParts['host'] . $urlParts['path']; // 分享链接
|
||
$passCode = $this->code; // 4位提取码
|
||
|
||
|
||
// 先判断是否有提取码
|
||
if (!empty($passCode)) {
|
||
// 验证提取码
|
||
$randsk = $network->verifyPassCode($linkUrl, $passCode);
|
||
if (is_numeric($randsk)) {
|
||
return jerr2($network->getErrorMessage($randsk));
|
||
}
|
||
// 验证成功,更新 cookie
|
||
$network->updateBdclnd($randsk);
|
||
}
|
||
|
||
// 获取转存参数
|
||
$transferParams = $network->getTransferParams($linkUrl);
|
||
if (is_numeric($transferParams)) {
|
||
return jerr2($network->getErrorMessage($transferParams));
|
||
}
|
||
|
||
// 解析返回的参数
|
||
list($shareId, $userId, $fsIds, $fileNames, $isDirs) = $transferParams;
|
||
|
||
if($this->isType == 1){
|
||
$urls['title'] = $fileNames[0];
|
||
$urls['share_url'] = $this->url;
|
||
return jok2('检验成功', $urls);
|
||
}
|
||
|
||
$folderName = Config('qfshop.baidu_file'); //默认存储路径
|
||
if($this->expired_type == 2){
|
||
$folderName = Config('qfshop.baidu_file_time'); //临时资源路径
|
||
}
|
||
|
||
if(empty($folderName)){
|
||
$folderName = '/心悦转存文件'; // 未设置时默认目录
|
||
}
|
||
|
||
// 检查目录名是否包含非法字符
|
||
$invalidChars = ['<', '>', '|', '*', '?', '\\', ':'];
|
||
foreach ($invalidChars as $char) {
|
||
if (strpos($folderName, $char) !== false) {
|
||
return jerr2('转存目录名有非法字符,不能包含:< > | * ? \\ :');
|
||
}
|
||
}
|
||
|
||
// 先检查目录是否存在,不存在再创建
|
||
$dirList = $network->getDirList($folderName);
|
||
// 如果返回的是错误码,说明目录不存在,需要创建
|
||
if (is_numeric($dirList)) {
|
||
$createResult = $network->createDir($folderName);
|
||
if ($createResult !== 0) {
|
||
return jerr2($network->getErrorMessage($createResult));
|
||
}
|
||
}
|
||
|
||
// 执行文件转存
|
||
$transferResult = $network->transferFile([$shareId, $userId, $fsIds], $folderName);
|
||
if ($transferResult !== 0) {
|
||
return jerr2($network->getErrorMessage($transferResult));
|
||
}
|
||
|
||
// 转存成功后,获取目录中的文件列表
|
||
$dirList = $network->getDirList('/' . $folderName);
|
||
if (is_numeric($dirList)) {
|
||
return jerr2($network->getErrorMessage($dirList));
|
||
}
|
||
|
||
// 找到刚刚转存的所有文件
|
||
$targetFiles = [];
|
||
$fsIdList = [];
|
||
$filePaths = [];
|
||
$adFilePaths = []; // 用于存储包含广告的文件路径
|
||
$allFilesAreAds = true; // 假设所有文件都是广告
|
||
|
||
foreach ($dirList as $file) {
|
||
if (in_array($file['server_filename'], $fileNames)) {
|
||
$targetFiles[] = $file;
|
||
$fsIdList[] = $file['fs_id'];
|
||
$filePath = '/' . $folderName . '/' . $file['server_filename'];
|
||
$filePaths[] = $filePath;
|
||
|
||
// 检查文件名是否包含广告内容
|
||
$containsAd = $this->containsAdKeywords($file['server_filename']);
|
||
|
||
// 如果是目录,需要检查目录内的文件
|
||
if ($file['isdir'] == 1) {
|
||
// 获取子目录内容
|
||
$subDirList = $network->getDirList($filePath);
|
||
if (!is_numeric($subDirList)) {
|
||
foreach ($subDirList as $subFile) {
|
||
// 检查子文件是否包含广告关键词
|
||
if ($this->containsAdKeywords($subFile['server_filename'])) {
|
||
// 将包含广告的子文件添加到待删除列表
|
||
$adFilePaths[] = $filePath . '/' . $subFile['server_filename'];
|
||
} else {
|
||
// 只要有一个文件不是广告,就将标志设为false
|
||
$allFilesAreAds = false;
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
// 如果是文件,直接判断
|
||
if ($containsAd) {
|
||
$adFilePaths[] = $filePath;
|
||
} else {
|
||
$allFilesAreAds = false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (empty($targetFiles)) {
|
||
return jerr2('分享失败,找不到刚转存的文件');
|
||
}
|
||
|
||
// 如果所有文件都是广告,删除整个转存的内容
|
||
if ($allFilesAreAds && !empty($targetFiles)) {
|
||
// 删除所有转存的文件
|
||
$deleteResult = $network->batchDeleteFiles($filePaths);
|
||
if ($deleteResult['errno'] === 0) {
|
||
return jerr2('资源内容为空或所有转存的文件都包含广告内容,已全部删除');
|
||
} else {
|
||
// return jerr2('删除广告文件失败');
|
||
}
|
||
}
|
||
|
||
// 如果只有部分文件是广告,只删除广告文件
|
||
if (!empty($adFilePaths)) {
|
||
$deleteResult = $network->batchDeleteFiles($adFilePaths);
|
||
// 删除后更新文件列表
|
||
if ($deleteResult['errno'] === 0) {
|
||
// 从fsIdList和filePaths中移除已删除的广告文件
|
||
foreach ($adFilePaths as $adPath) {
|
||
$key = array_search($adPath, $filePaths);
|
||
if ($key !== false) {
|
||
unset($filePaths[$key]);
|
||
unset($fsIdList[$key]);
|
||
}
|
||
}
|
||
// 重新索引数组
|
||
$filePaths = array_values($filePaths);
|
||
$fsIdList = array_values($fsIdList);
|
||
}
|
||
}
|
||
|
||
// 如果删除广告后没有文件了,返回提示
|
||
if (empty($fsIdList)) {
|
||
return jerr2('资源内容为空或所有转存的文件都包含广告内容,已全部删除');
|
||
}
|
||
|
||
// 创建分享
|
||
$expiry = 0; // 0为永久
|
||
// $password = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'), 0, 4); // 随机4位提取码
|
||
$password = '6666'; // 随机4位提取码
|
||
$shareLink = $network->createShare(implode(',', $fsIdList), $expiry, $password);
|
||
|
||
if (is_numeric($shareLink)) {
|
||
return jerr2($network->getErrorMessage($shareLink));
|
||
}
|
||
|
||
if(!empty($password)){
|
||
$shareLink = $shareLink. '?pwd='. $password;
|
||
}
|
||
// 转存成功
|
||
return jok2("文件转存成功", [
|
||
'title' => $fileNames[0],
|
||
'share_url' => $shareLink,
|
||
'fid' => $filePaths,
|
||
'code' => $password,
|
||
]);
|
||
}
|
||
|
||
|
||
/**
|
||
* 检查文件名是否包含广告关键词
|
||
* @param string $filename 文件名
|
||
* @return bool 是否包含广告关键词
|
||
*/
|
||
private function containsAdKeywords($filename)
|
||
{
|
||
$banned = Config('qfshop.quark_banned') ?? ''; // 如果出现这些字样就删除
|
||
|
||
// 广告关键词列表
|
||
$adKeywords = [];
|
||
if (!empty($banned)) {
|
||
$adKeywords = array_map('trim', explode(',', $banned));
|
||
}
|
||
|
||
// 转为小写进行比较
|
||
$lowercaseFilename = mb_strtolower($filename);
|
||
|
||
foreach ($adKeywords as $keyword) {
|
||
if (mb_strpos($lowercaseFilename, mb_strtolower($keyword)) !== false) {
|
||
return true;
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* 删除指定资源
|
||
*
|
||
* @return void
|
||
*/
|
||
public function deletepdirFid($filePaths)
|
||
{
|
||
$cookie = Config('qfshop.baidu_cookie');
|
||
$network = new \netdisk\pan\BaiduWork($cookie);
|
||
|
||
$bdstoken = $network->getBdstoken();
|
||
$network->setBdstoken($bdstoken);
|
||
|
||
// 调用批量删除方法
|
||
$result = $network->batchDeleteFiles($filePaths);
|
||
return $result;
|
||
}
|
||
} |