Files
Xinyue-Search/extend/netdisk/pan/BaiduPan.php
T

251 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位提取码
$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;
}
}