diff --git a/.env b/.env index 762a345..6e62d89 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ -APP_DEBUG = false -SYSTEM_SALT= YAdmin +APP_DEBUG = true +SYSTEM_SALT= admin [APP] DEFAULT_TIMEZONE = Asia/Chongqing @@ -7,7 +7,7 @@ DEFAULT_TIMEZONE = Asia/Chongqing [DATABASE] TYPE = mysql HOSTNAME = 127.0.0.1 -DATABASE = www_dj_com +DATABASE = www_abc_com USERNAME = 123456 PASSWORD = 123456 HOSTPORT = 3306 diff --git a/.gitignore b/.gitignore index 19d1575..c0aa785 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ /.svn /.vscode runtime +nginx.htaccess +.env \ No newline at end of file diff --git a/.htaccess b/.htaccess index 0519ecb..e69de29 100644 --- a/.htaccess +++ b/.htaccess @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/README.md b/README.md index f816fee..57ab810 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,18 @@ 如有任何问题或建议,欢迎交流探讨! 😊 +> **声明**:本项目由 Trae AI 辅助编写。由于本人时间有限,仅在空闲时维护。如遇使用问题,请优先自行排查,感谢理解! + ## 更新日志 +### v3.0 + +- 新增 项目安装向导,简化部署流程 +- 新增 多网盘转存导入功能,支持夸克、阿里、百度、UC +- 优化 解决部分数据导致的路由报错 +- 优化 AI重构转存功能,提升稳定性与效率 + + ### v2.1 - 增加网页全网搜功能 @@ -20,7 +30,6 @@ - 后台增加批量删除功能 - 优化表格导入功能 -注:如何更新见文件夹updateLog/24.11.4 ### v2 @@ -33,53 +42,10 @@ - 支持多网盘导入功能(目前仅夸克支持转存分享) - 增加资源分类功能 -注:鉴于数据库改动大,最快升级方式:1、重新搭建新项目;2、旧项目后台导出资源表格;3、新项目导入这个表格 +## 搭建教程 -## 后台安装教程 +[教程](https://tcn6g7hyxvir.feishu.cn/wiki/WYT4wZtrjijeswkI0RSc4ofTnah) -0、PHP(选择7.2,其它版本不兼容) - -1、上传源码到服务器 - -2、设置网站运行目录public - -3、设置thinkphp伪静态 - -4、导入数据库文件 - -5、修改.env文件数据库参数 - -后台地址:https://你的域名/qfadmin -账号密码:admin 123456 - -## 常见问题 - -0、系统不再支持全部转存及每日更新,有能力者可自行修改使用 - -1、全部转存执行1分钟~5分钟后中断问题,修改超时限制 -该操作用时很长,请设置最大值86400 设置后需重启下服务 -宝塔设置教程 https://www.kancloud.cn/loveouu/bthelp/1541867 - -2、非7.2版本导致的报错,请自行解决,不要再问!!!不会就百度或者老老实实用7.2 - -3、nginx 404 Not Found 伪静态设置 -```shell -location ~* (runtime|application)/{ - return 403; -} -location / { - if (!-e $request_filename){ - rewrite ^(.*)$ /index.php?s=$1 last; break; - } -} -``` - -4、网站经常打不开,出现500的情况,未具体找到原因,可能是因为服务器配置太低,分词功能占用内存过高导致的 -升级服务器配置或后台修改搜索模式改为“精准搜索”; - - -5、全网搜的内容为临时分享资源,需要配置计划任务 每5分钟执行一次 即可 -https://XXXXX/api/other/delete_search ## 前台截图 @@ -96,13 +62,6 @@ https://XXXXX/api/other/delete_search  -## 如何获取夸克网盘Cookie - -登录夸克网盘后,按下F12,刷新页面 - - - - # 免费交流社群 可以进交流群,一起交流学习,添加时请备注来源(如果项目对你有所帮助,也可以请我喝杯咖啡 ☕️ ~) diff --git a/app/admin/controller/Source.php b/app/admin/controller/Source.php index 639691f..36ed4f9 100644 --- a/app/admin/controller/Source.php +++ b/app/admin/controller/Source.php @@ -342,7 +342,6 @@ class Source extends QfShop $this->excelField = $excelField; $this->exportExcelData($dataList); - print_r(12); } /** @@ -362,50 +361,7 @@ class Source extends QfShop $source_category_id = input('source_category_id')??0; - $urls = input("urls"); - - $urls = explode("\n", $urls); - - // 去掉数组元素中的空白字符 - $urls = array_map('trim', $urls); - - // 过滤掉空值的数组元素 - $urls = array_filter($urls); - - $allData = array_values(array_filter(array_map(function ($item) { - // 提取 URL - if (!preg_match('/https?:\/\/[^\s]+/', $item, $matches)) { - return null; // 没有匹配到 URL,直接丢弃 - } - - $url = trim($matches[0]); - $code = ''; - - // 提取提取码(?pwd= 或 , 分割) - if (preg_match('/\?pwd=([^,\s]+)/', $item, $pwdMatch)) { - $code = trim($pwdMatch[1]); - } elseif (preg_match('/,(.+)$/', $item, $commaMatch)) { - $code = trim($commaMatch[1]); - } - - // 返回结果时,确保 title 保持为空字符串 - return [ - 'url' => $url, - 'title' => '', - 'code' => $code - ]; - }, $urls))); - - - // 去重,使用 'url' 字段来去重 - $uniqueUrls = []; - $allData = array_filter($allData, function($item) use (&$uniqueUrls) { - if (!in_array($item['url'], $uniqueUrls)) { - $uniqueUrls[] = $item['url']; // 添加到已处理的 URL 列表 - return true; // 保留此项目 - } - return false; // 去掉重复的项目 - }); + $allData = parsePanLinks(input("urls")); $quarkPlugin = new QuarkPlugin(); if(input("type")==2){ @@ -416,7 +372,7 @@ class Source extends QfShop $res = $quarkPlugin->import($allData,$source_category_id); } - return jok('已提交任务,稍后查看结果2',$res); + return jok('已提交任务,稍后查看结果2',$allData); } /** @@ -449,10 +405,13 @@ class Source extends QfShop if ($error) { return $error; } - $quarkPlugin = new QuarkPlugin(); - $result = $quarkPlugin->getFiles(Config('qfshop.quark_cookie')); - return jok('获取成功',$result); + $result = $quarkPlugin->getFiles(input('type')??0,input('pdir_fid')??0); + + if($result['code'] != 200){ + return jerr($result['message']); + } + return jok('获取成功',$result['data']); } } diff --git a/app/api/controller/Index.php b/app/api/controller/Index.php index 8d13ec3..64af936 100644 --- a/app/api/controller/Index.php +++ b/app/api/controller/Index.php @@ -12,8 +12,246 @@ class Index extends QfShop { public function index() { - return jok("Hello World!"); + // return jok("Hello World!"); + + $cookie = 'csrfToken=gKesaboeWtJkukG4VNGh5Ljk; BAIDUID=757FBF0C282638B49A59DC7E37C7702B:FG=1; BAIDUID_BFESS=757FBF0C282638B49A59DC7E37C7702B:FG=1; Hm_lvt_7a3960b6f067eb0085b7f96ff5e660b0=1742787964; RT="z=1&dm=baidu.com&si=86a18d7d-4537-4b9b-ac36-06a756df3179&ss=m8mj80dn&sl=0&tt=0&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ul=261&hd=26a"; Hm_lpvt_7a3960b6f067eb0085b7f96ff5e660b0=1742794455; newlogin=1; ppfuid=FOCoIC3q5fKa8fgJnwzbE67EJ49BGJeplOzf+4l4EOvDuu2RXBRv6R3A1AZMa49I27C0gDDLrJyxcIIeAeEhD8JYsoLTpBiaCXhLqvzbzmvy3SeAW17tKgNq/Xx+RgOdb8TWCFe62MVrDTY6lMf2GrfqL8c87KLF2qFER3obJGmxOaJD7Qr04D9rET96PX99GEimjy3MrXEpSuItnI4KD2P5vWa8VVdqKPLBckQ0WyruzFB5pZ7L1GIDHy291nRZSc37WI7hn7N5DEkitWgHVHqxGUGRl1qke9+4QxQVI1jGgLbz7OSojK1zRbqBESR5Pdk2R9IA3lxxOVzA+Iw1TWLSgWjlFVG9Xmh1+20oPSbrzvDjYtVPmZ+9/6evcXmhcO1Y58MgLozKnaQIaLfWRIM4pp9u1B7t2Y8SxQH/XnrgZXt2Kg4R5SS0He7SlWGt42bJBOW2wZKr1YF6Z6VWTM5FjnYxYstXg/9EfB3EVmLB2thKqX6G/zUWgdr9REaklV1Uhhp5FAe6gNJIUptp7EMAaXYKm11G+JVPszQFdp9AJLcm4YSsYUXkaPI2Tl66J246cmjWQDTahAOINR5rXR5r/7VVI1RMZ8gb40q7az7vCK56XLooKT5a+rsFrf5Zu0yyCiiagElhrTEOtNdBJJq8eHwEHuFBni9ahSwpC7lbKkUwaKH69tf0DFV7hJROiLETSFloIVkHdy3+I2JUr1LsplAz0hMkWt/tE4tXVUV7QcTDTZWS/2mCoS/GV3N9awQ6iM6hs/BWjlgnEa1+5hYkkYOBBLZqDwzG9FQyZZJmSCAynpprqnVbhrjcNYdk5FKazXcZ/j40FJv+iLGBn3nkkgHlne61I8I7KhtQgInXjsNS9+mteGCT/vj/pEvkm+ZitcePbf21QMldRrlvw4uFnWmLU84Th29MqUuVR0ujl0ys3zTnxv/D47Q2VFyeFv12nptBFm2PISy0WmJ/Sy3ktTWpm7mcOABi5Gey1FBzkrq/nzqRQID/LRsJJW24e+1N4wlJzhNmFXMQ0YiYVdq7aHN89Oybut+xsc38J6I4Wd2rVi5xrH8hGqvd77OJuzH8X+tb0PV+Xnu3NL1fmqLIh+XcF6fnyPFPUxteQtbtLyi+gq5zowg1oFj8O/L9oVsoK22a9qUmM/HrJMRsLi1+J9aSd42+X78fDIZgkPh3epzLLvwRmnAbs5z/V+jl3P3gVnlwm9bfwhaFtnhFN2dHYAw7i4QhrXdzc77isXhbvkM5DsEwz5RTVSb4C+N+kIl81Iase/C16XVPKOj9XA==; BDUSS=jYwbDRJZG0yTi1VbDgtMWF6M1BGZ0k0ZG96dm9iOHJGczFMOUYtMFhwYlJmd2hvRVFBQUFBJCQAAAAAAAAAAAEAAAA63UdY2K~Yr8Dksru5~cjL0MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHy4GfR8uBnT; BDUSS_BFESS=jYwbDRJZG0yTi1VbDgtMWF6M1BGZ0k0ZG96dm9iOHJGczFMOUYtMFhwYlJmd2hvRVFBQUFBJCQAAAAAAAAAAAEAAAA63UdY2K~Yr8Dksru5~cjL0MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHy4GfR8uBnT; STOKEN=608a270497995724e6ed69015178372081331f404747f0a8492ee31de1184c41; PANPSC=6332961014215215224%3AAuI6D6iGxsvXU%2FMlrspYA1cS2d9ns3O5g0mIZdLHpdQGbqupDlB1gtH1%2BL8BUDk1coDRJu%2FbTp%2FiLaLUl0KD5De4ZdaW7CoOlL98c8Ccr9ch6uZoP3DwQ9YfJggg9xZJa6gjWHNi7jj6tFSlPcYsyyZWmuM7JILl4szUrnVKA5MNNiO7%2B4TS%2B1QskbZnP5EyWagh%2FyTVtumv9EBTj3cIccvsqRsDSpjMTItbmssa8FDJel1POICqciYu0WtaRbrkbSBvzd4TSG3wk8UVEJrJjetuQFScyIV%2FkrFWWqsgPEw%3D; Hm_lvt_182d6d59474cf78db37e0b2248640ea5=1742788120; ndut_fmt=6F438330EB0B4C594C515F276A3E73E3F2D3A8BB5A3C26DD1E721E98B58ED17B; Hm_lpvt_182d6d59474cf78db37e0b2248640ea5=1742795476; ab_sr=1.0.1_YTI3MjJmMjkwY2Y5MTJhMjc4MGJhNWU2ZGMwNTFiZWZiNmZhMTZkMWRlNWYyMzAxNTA1OTU2YTU4ZjU5M2ZiNWI5NDY2YjYwZWY3Yjc4YTY3MmNiMWVlNWNkNzE2ZGI2YzJmYTY1YTgwM2M1ZDJlYTk1YjAxZTcyMmNkNWRkNzliM2RiOGMzYzUxYmMwZTU4OTJiZmRmNjhiMDIzZDc1OWRhMGIyNGNkMDJhOTMzZjllYmQxMDUzY2ZjYzU4MjVk'; + // $cookie = ''; + $network = new \netdisk\pan\BaiduWork($cookie); + $bdstoken = $network->getBdstoken(); + $network->setBdstoken($bdstoken); + + // 验证提取码 + // $linkUrl = "https://pan.baidu.com/s/11ioAjAwdwzI3BEvP5c62bw"; // 分享链接 + // $passCode = "him8"; // 4位提取码 + + $linkUrl = "https://pan.baidu.com/s/1HU99KPtdJEpKnYnYLnQ37Q"; // 分享链接 + $passCode = "ruwf"; // 4位提取码 + + // $linkUrl = "https://pan.baidu.com/s/1f03pM6dvtZPGA1bA0DH9AQ"; // 分享链接 + // $passCode = "a9oa"; // 4位提取码 + + // 先判断是否有提取码 + if (!empty($passCode)) { + // 验证提取码 + $randsk = $network->verifyPassCode($linkUrl, $passCode); + if (is_numeric($randsk)) { + return jerr($network->getErrorMessage($randsk)); + } + // 验证成功,更新 cookie + $network->updateBdclnd($randsk); + } + + // 获取转存参数 + $transferParams = $network->getTransferParams($linkUrl); + if (is_numeric($transferParams)) { + return jerr($network->getErrorMessage($transferParams)); + } + // 解析返回的参数 + list($shareId, $userId, $fsIds, $fileNames, $isDirs) = $transferParams; + + $folderName = ''; // 自定义保存目录名 + // 检查目录名是否包含非法字符 + $invalidChars = ['<', '>', '|', '*', '?', '\\', ':']; + foreach ($invalidChars as $char) { + if (strpos($folderName, $char) !== false) { + return jerr('转存目录名有非法字符,不能包含:< > | * ? \\ :'); + } + } + + // 先检查目录是否存在,不存在再创建 + $dirList = $network->getDirList('/' . $folderName); + // 如果返回的是错误码,说明目录不存在,需要创建 + if (is_numeric($dirList)) { + $createResult = $network->createDir($folderName); + if ($createResult !== 0) { + return jerr($network->getErrorMessage($createResult)); + } + } + + // 执行文件转存 + $transferResult = $network->transferFile([$shareId, $userId, $fsIds], $folderName); + if ($transferResult !== 0) { + return jerr($network->getErrorMessage($transferResult)); + } + + // 转存成功后,获取目录中的文件列表 + $dirList = $network->getDirList('/' . $folderName); + if (is_numeric($dirList)) { + return jerr($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 jerr('找不到刚转存的文件'); + } + + // 如果所有文件都是广告,删除整个转存的内容 + if ($allFilesAreAds && !empty($targetFiles)) { + // 删除所有转存的文件 + $deleteResult = $network->batchDeleteFiles($filePaths); + if ($deleteResult['errno'] === 0) { + return jok('所有转存的文件都包含广告内容,已全部删除', [ + 'deletedCount' => $deleteResult['deletedCount'], + 'paths' => $deleteResult['paths'] + ]); + } else { + return jerr('删除广告文件失败: ' . $deleteResult['message']); + } + } + + // 如果只有部分文件是广告,只删除广告文件 + 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 jok('所有有效文件都包含广告内容,已全部删除'); + } + + // 创建分享 + $expiry = 0; // 0为永久 + $password = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'), 0, 4); // 随机4位提取码 + $shareLink = $network->createShare(implode(',', $fsIdList), $expiry, $password); + + if (is_numeric($shareLink)) { + return jerr($network->getErrorMessage($shareLink)); + } + + // 转存成功 + return jok("文件转存成功", [ + 'fileNames' => $fileNames, + 'fileCount' => count($fsIdList), + 'folderName' => $folderName, + 'shareLink' => $shareLink, + 'password' => $password, + 'filePaths' => $filePaths, + 'removedAdFiles' => $adFilePaths + ]); } + + /** + * 检查文件名是否包含广告关键词 + * @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; + } + + public function getFiles() + { + $cookie = 'csrfToken=gKesaboeWtJkukG4VNGh5Ljk; BAIDUID=757FBF0C282638B49A59DC7E37C7702B:FG=1; BAIDUID_BFESS=757FBF0C282638B49A59DC7E37C7702B:FG=1; Hm_lvt_7a3960b6f067eb0085b7f96ff5e660b0=1742787964; RT="z=1&dm=baidu.com&si=86a18d7d-4537-4b9b-ac36-06a756df3179&ss=m8mj80dn&sl=0&tt=0&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ul=261&hd=26a"; Hm_lpvt_7a3960b6f067eb0085b7f96ff5e660b0=1742794455; newlogin=1; ppfuid=FOCoIC3q5fKa8fgJnwzbE67EJ49BGJeplOzf+4l4EOvDuu2RXBRv6R3A1AZMa49I27C0gDDLrJyxcIIeAeEhD8JYsoLTpBiaCXhLqvzbzmvy3SeAW17tKgNq/Xx+RgOdb8TWCFe62MVrDTY6lMf2GrfqL8c87KLF2qFER3obJGmxOaJD7Qr04D9rET96PX99GEimjy3MrXEpSuItnI4KD2P5vWa8VVdqKPLBckQ0WyruzFB5pZ7L1GIDHy291nRZSc37WI7hn7N5DEkitWgHVHqxGUGRl1qke9+4QxQVI1jGgLbz7OSojK1zRbqBESR5Pdk2R9IA3lxxOVzA+Iw1TWLSgWjlFVG9Xmh1+20oPSbrzvDjYtVPmZ+9/6evcXmhcO1Y58MgLozKnaQIaLfWRIM4pp9u1B7t2Y8SxQH/XnrgZXt2Kg4R5SS0He7SlWGt42bJBOW2wZKr1YF6Z6VWTM5FjnYxYstXg/9EfB3EVmLB2thKqX6G/zUWgdr9REaklV1Uhhp5FAe6gNJIUptp7EMAaXYKm11G+JVPszQFdp9AJLcm4YSsYUXkaPI2Tl66J246cmjWQDTahAOINR5rXR5r/7VVI1RMZ8gb40q7az7vCK56XLooKT5a+rsFrf5Zu0yyCiiagElhrTEOtNdBJJq8eHwEHuFBni9ahSwpC7lbKkUwaKH69tf0DFV7hJROiLETSFloIVkHdy3+I2JUr1LsplAz0hMkWt/tE4tXVUV7QcTDTZWS/2mCoS/GV3N9awQ6iM6hs/BWjlgnEa1+5hYkkYOBBLZqDwzG9FQyZZJmSCAynpprqnVbhrjcNYdk5FKazXcZ/j40FJv+iLGBn3nkkgHlne61I8I7KhtQgInXjsNS9+mteGCT/vj/pEvkm+ZitcePbf21QMldRrlvw4uFnWmLU84Th29MqUuVR0ujl0ys3zTnxv/D47Q2VFyeFv12nptBFm2PISy0WmJ/Sy3ktTWpm7mcOABi5Gey1FBzkrq/nzqRQID/LRsJJW24e+1N4wlJzhNmFXMQ0YiYVdq7aHN89Oybut+xsc38J6I4Wd2rVi5xrH8hGqvd77OJuzH8X+tb0PV+Xnu3NL1fmqLIh+XcF6fnyPFPUxteQtbtLyi+gq5zowg1oFj8O/L9oVsoK22a9qUmM/HrJMRsLi1+J9aSd42+X78fDIZgkPh3epzLLvwRmnAbs5z/V+jl3P3gVnlwm9bfwhaFtnhFN2dHYAw7i4QhrXdzc77isXhbvkM5DsEwz5RTVSb4C+N+kIl81Iase/C16XVPKOj9XA==; BDUSS=jYwbDRJZG0yTi1VbDgtMWF6M1BGZ0k0ZG96dm9iOHJGczFMOUYtMFhwYlJmd2hvRVFBQUFBJCQAAAAAAAAAAAEAAAA63UdY2K~Yr8Dksru5~cjL0MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHy4GfR8uBnT; BDUSS_BFESS=jYwbDRJZG0yTi1VbDgtMWF6M1BGZ0k0ZG96dm9iOHJGczFMOUYtMFhwYlJmd2hvRVFBQUFBJCQAAAAAAAAAAAEAAAA63UdY2K~Yr8Dksru5~cjL0MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHy4GfR8uBnT; STOKEN=608a270497995724e6ed69015178372081331f404747f0a8492ee31de1184c41; PANPSC=6332961014215215224%3AAuI6D6iGxsvXU%2FMlrspYA1cS2d9ns3O5g0mIZdLHpdQGbqupDlB1gtH1%2BL8BUDk1coDRJu%2FbTp%2FiLaLUl0KD5De4ZdaW7CoOlL98c8Ccr9ch6uZoP3DwQ9YfJggg9xZJa6gjWHNi7jj6tFSlPcYsyyZWmuM7JILl4szUrnVKA5MNNiO7%2B4TS%2B1QskbZnP5EyWagh%2FyTVtumv9EBTj3cIccvsqRsDSpjMTItbmssa8FDJel1POICqciYu0WtaRbrkbSBvzd4TSG3wk8UVEJrJjetuQFScyIV%2FkrFWWqsgPEw%3D; Hm_lvt_182d6d59474cf78db37e0b2248640ea5=1742788120; ndut_fmt=6F438330EB0B4C594C515F276A3E73E3F2D3A8BB5A3C26DD1E721E98B58ED17B; Hm_lpvt_182d6d59474cf78db37e0b2248640ea5=1742795476; ab_sr=1.0.1_YTI3MjJmMjkwY2Y5MTJhMjc4MGJhNWU2ZGMwNTFiZWZiNmZhMTZkMWRlNWYyMzAxNTA1OTU2YTU4ZjU5M2ZiNWI5NDY2YjYwZWY3Yjc4YTY3MmNiMWVlNWNkNzE2ZGI2YzJmYTY1YTgwM2M1ZDJlYTk1YjAxZTcyMmNkNWRkNzliM2RiOGMzYzUxYmMwZTU4OTJiZmRmNjhiMDIzZDc1OWRhMGIyNGNkMDJhOTMzZjllYmQxMDUzY2ZjYzU4MjVk'; + // $cookie = ''; + $network = new \netdisk\pan\BaiduWork($cookie); + + $res = $network->getDirList('/'); + + return jok('获取成功',$res); + } + + public function delete() + { + $cookie = 'csrfToken=gKesaboeWtJkukG4VNGh5Ljk; BAIDUID=757FBF0C282638B49A59DC7E37C7702B:FG=1; BAIDUID_BFESS=757FBF0C282638B49A59DC7E37C7702B:FG=1; Hm_lvt_7a3960b6f067eb0085b7f96ff5e660b0=1742787964; RT="z=1&dm=baidu.com&si=86a18d7d-4537-4b9b-ac36-06a756df3179&ss=m8mj80dn&sl=0&tt=0&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ul=261&hd=26a"; Hm_lpvt_7a3960b6f067eb0085b7f96ff5e660b0=1742794455; newlogin=1; ppfuid=FOCoIC3q5fKa8fgJnwzbE67EJ49BGJeplOzf+4l4EOvDuu2RXBRv6R3A1AZMa49I27C0gDDLrJyxcIIeAeEhD8JYsoLTpBiaCXhLqvzbzmvy3SeAW17tKgNq/Xx+RgOdb8TWCFe62MVrDTY6lMf2GrfqL8c87KLF2qFER3obJGmxOaJD7Qr04D9rET96PX99GEimjy3MrXEpSuItnI4KD2P5vWa8VVdqKPLBckQ0WyruzFB5pZ7L1GIDHy291nRZSc37WI7hn7N5DEkitWgHVHqxGUGRl1qke9+4QxQVI1jGgLbz7OSojK1zRbqBESR5Pdk2R9IA3lxxOVzA+Iw1TWLSgWjlFVG9Xmh1+20oPSbrzvDjYtVPmZ+9/6evcXmhcO1Y58MgLozKnaQIaLfWRIM4pp9u1B7t2Y8SxQH/XnrgZXt2Kg4R5SS0He7SlWGt42bJBOW2wZKr1YF6Z6VWTM5FjnYxYstXg/9EfB3EVmLB2thKqX6G/zUWgdr9REaklV1Uhhp5FAe6gNJIUptp7EMAaXYKm11G+JVPszQFdp9AJLcm4YSsYUXkaPI2Tl66J246cmjWQDTahAOINR5rXR5r/7VVI1RMZ8gb40q7az7vCK56XLooKT5a+rsFrf5Zu0yyCiiagElhrTEOtNdBJJq8eHwEHuFBni9ahSwpC7lbKkUwaKH69tf0DFV7hJROiLETSFloIVkHdy3+I2JUr1LsplAz0hMkWt/tE4tXVUV7QcTDTZWS/2mCoS/GV3N9awQ6iM6hs/BWjlgnEa1+5hYkkYOBBLZqDwzG9FQyZZJmSCAynpprqnVbhrjcNYdk5FKazXcZ/j40FJv+iLGBn3nkkgHlne61I8I7KhtQgInXjsNS9+mteGCT/vj/pEvkm+ZitcePbf21QMldRrlvw4uFnWmLU84Th29MqUuVR0ujl0ys3zTnxv/D47Q2VFyeFv12nptBFm2PISy0WmJ/Sy3ktTWpm7mcOABi5Gey1FBzkrq/nzqRQID/LRsJJW24e+1N4wlJzhNmFXMQ0YiYVdq7aHN89Oybut+xsc38J6I4Wd2rVi5xrH8hGqvd77OJuzH8X+tb0PV+Xnu3NL1fmqLIh+XcF6fnyPFPUxteQtbtLyi+gq5zowg1oFj8O/L9oVsoK22a9qUmM/HrJMRsLi1+J9aSd42+X78fDIZgkPh3epzLLvwRmnAbs5z/V+jl3P3gVnlwm9bfwhaFtnhFN2dHYAw7i4QhrXdzc77isXhbvkM5DsEwz5RTVSb4C+N+kIl81Iase/C16XVPKOj9XA==; BDUSS=jYwbDRJZG0yTi1VbDgtMWF6M1BGZ0k0ZG96dm9iOHJGczFMOUYtMFhwYlJmd2hvRVFBQUFBJCQAAAAAAAAAAAEAAAA63UdY2K~Yr8Dksru5~cjL0MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHy4GfR8uBnT; BDUSS_BFESS=jYwbDRJZG0yTi1VbDgtMWF6M1BGZ0k0ZG96dm9iOHJGczFMOUYtMFhwYlJmd2hvRVFBQUFBJCQAAAAAAAAAAAEAAAA63UdY2K~Yr8Dksru5~cjL0MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANHy4GfR8uBnT; STOKEN=608a270497995724e6ed69015178372081331f404747f0a8492ee31de1184c41; PANPSC=6332961014215215224%3AAuI6D6iGxsvXU%2FMlrspYA1cS2d9ns3O5g0mIZdLHpdQGbqupDlB1gtH1%2BL8BUDk1coDRJu%2FbTp%2FiLaLUl0KD5De4ZdaW7CoOlL98c8Ccr9ch6uZoP3DwQ9YfJggg9xZJa6gjWHNi7jj6tFSlPcYsyyZWmuM7JILl4szUrnVKA5MNNiO7%2B4TS%2B1QskbZnP5EyWagh%2FyTVtumv9EBTj3cIccvsqRsDSpjMTItbmssa8FDJel1POICqciYu0WtaRbrkbSBvzd4TSG3wk8UVEJrJjetuQFScyIV%2FkrFWWqsgPEw%3D; Hm_lvt_182d6d59474cf78db37e0b2248640ea5=1742788120; ndut_fmt=6F438330EB0B4C594C515F276A3E73E3F2D3A8BB5A3C26DD1E721E98B58ED17B; Hm_lpvt_182d6d59474cf78db37e0b2248640ea5=1742795476; ab_sr=1.0.1_YTI3MjJmMjkwY2Y5MTJhMjc4MGJhNWU2ZGMwNTFiZWZiNmZhMTZkMWRlNWYyMzAxNTA1OTU2YTU4ZjU5M2ZiNWI5NDY2YjYwZWY3Yjc4YTY3MmNiMWVlNWNkNzE2ZGI2YzJmYTY1YTgwM2M1ZDJlYTk1YjAxZTcyMmNkNWRkNzliM2RiOGMzYzUxYmMwZTU4OTJiZmRmNjhiMDIzZDc1OWRhMGIyNGNkMDJhOTMzZjllYmQxMDUzY2ZjYzU4MjVk'; + // $cookie = ''; + $network = new \netdisk\pan\BaiduWork($cookie); + $bdstoken = $network->getBdstoken(); + $network->setBdstoken($bdstoken); + + // 使用固定的文件路径数组 + $filePaths = [ + "//1", + "//2" + ]; + + // 调用批量删除方法 + $result = $network->batchDeleteFiles($filePaths); + + if ($result['errno'] === 0) { + return jok('文件删除成功', [ + 'deletedCount' => $result['deletedCount'], + 'paths' => $result['paths'] + ]); + } else { + return jerr($result['message']); + } + } + public function search() { $fc = new VicWord(); $keywords = input('keywords'); diff --git a/app/api/controller/Open.php b/app/api/controller/Open.php index c207730..02d2d4c 100644 --- a/app/api/controller/Open.php +++ b/app/api/controller/Open.php @@ -5,703 +5,48 @@ namespace app\api\controller; use think\App; use think\facade\Cache; use app\api\QfShop; +use app\model\Source as SourceModel; class Open extends QfShop { - public function __construct(App $app) - { - parent::__construct($app); - $this->url = ""; - $this->is_type = 0; - $this->cookie = ""; //夸克登录凭证 - $this->Authorization = ""; //阿里登录凭证 - $this->expired_type = 1; //1分享永久 2临时 - $this->to_pdir_fid = ""; //存入目标文件 - $this->ad_fid = ""; - $this->code = ""; //提取码 - $this->isType = 0; //等于1时仅校验是否有效并提取资源信息 - $this->urlHeader = array( - 'Accept: application/json, text/plain, */*', - 'Accept-Language: zh-CN,zh;q=0.9', - 'content-type: application/json;charset=UTF-8', - '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', - 'Referer: https://pan.quark.cn/', - 'Referrer-Policy: strict-origin-when-cross-origin', - 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', - ); - } /** - * - * - * @return void - */ - public function index() - { - return jok('Hello World'); - } - - /** - * 获取夸克网盘文件夹 - * - * @return void - */ - public function getFiles() - { - $this->cookie = input('cookie')??''; - $urlData = []; - $queryParams = [ - 'pr' => 'ucpro', - 'fr' => 'pc', - 'uc_param_str' => '', - 'pdir_fid' => 0, - '_page' => 1, - '_size' => 50, - '_fetch_total' => 1, - '_fetch_sub_dirs' => 0, - '_sort' => 'file_type:asc,updated_at:desc', - ]; - - $this->urlHeader[] = 'cookie: ' . $this->cookie; - $res = curlHelper("https://drive-pc.quark.cn/1/clouddrive/file/sort", "GET", json_encode($urlData), $this->urlHeader,$queryParams)['body']; - $res = json_decode($res, true); - if($res['status'] !== 200){ - return jerr($res['message']=='require login [guest]'?'夸克未登录,请检查cookie':$res['message']); - } - - return jok('获取成功',$res['data']['list']); - } - - /** - * 一键转存并分享资源 - * - * type 0 夸克 1阿里 - * * @return void */ public function transfer() { - $url = input("url"); - $this->code = input('code')??''; - $this->isType = input('isType')??0; - - if($this->isType != 1){ //直接入口就不用cookie 防止账号异常 - $this->cookie = input('cookie')??''; - $this->Authorization = input('Authorization')??''; - } - - $this->expired_type = input('expired_type')??1; - $this->to_pdir_fid = input('to_pdir_fid')??""; - $this->ad_fid = input('ad_fid')??""; - - if (strpos($url, '?entry=') !== false) { - $entry = preg_match('/\?entry=([^&]+)/', $url, $matches) ? $matches[1] : ''; - $url = preg_match('/.*(?=\?entry=)/', $url, $matches) ? $matches[0] : ''; - } - - $substring = strstr($url, 's/'); - if ($substring !== false) { - $pwd_id = substr($substring, 2); // 去除 's/' 部分 - } else { - return jerr("资源地址格式有误"); - } - - $this->urlHeader[] = 'cookie: ' . $this->cookie; - - $patterns = [ - 'pan.quark.cn' => 0, - 'www.alipan.com' => 1, - 'www.aliyundrive.com' => 1, - // 'pan.baidu.com' => 2, - 'drive.uc.cn' => 3, - // 'pan.xunlei.com' => 4, + $urlData = [ + 'expired_type' => input('expired_type')??1, // 1正式资源 2临时资源 + 'url' => input("url")?? '', + 'code' => input('code')??'', + 'isType' => input('isType')??0, ]; - - $url_type = -1; // 默认值为 -1 - foreach ($patterns as $pattern => $type) { - if (strpos($url, $pattern) !== false) { - $url_type = $type; - break; // 一旦匹配成功,退出循环 - } - } - - $this->url = $url; - - if ($url_type == 0) { - //夸克 - if(empty($this->cookie) && $this->isType==0){ - jerr("参数有误"); - } - $this->transferQuark(strtok($pwd_id, '#')); - } else if($url_type == 1){ - //阿里 - $this->transferAlipan($pwd_id); - } else if($url_type == 3){ - //UC - $this->transferUc($pwd_id); - } else { - return jerr("资源地址格式有误"); - } - } - - /** - * 夸克 - 一键转存并分享资源 - * - * @return void - */ - public function transferQuark($pwd_id){ - //获取要转存夸克资源的stoken - $infoData = $this->getStoken($pwd_id); - - if($this->isType == 1){ - $urls['title'] = $infoData['title']; - $urls['share_url'] = $this->url; - return jok('检验成功', $urls); - } - - - $stoken = $infoData['stoken']; - - - //获取要转存夸克资源的详细内容 - $detail = $this->getShare($pwd_id,$stoken); - - $fid_list = []; - $fid_token_list = []; - $title = $detail['share']['title']; //资源名称 - foreach ($detail['list'] as $key => $value) { - $fid_list[] = $value['fid']; - $fid_token_list[] = $value['share_fid_token']; + if(empty($urlData['url'])){ + return jerr('资源地址不能为空'); } - //转存资源到指定文件夹 - $task_id = $this->getShareSave($pwd_id,$stoken,$fid_list,$fid_token_list); + $transfer = new \netdisk\Transfer(); + $res = $transfer->transfer($urlData); - //转存后根据task_id获取转存到自己网盘后的信息 - $retry_index = 0; - $myData = ''; - while ($myData=='' || $myData['status'] != 2) { - $myData = $this->getShareTask($task_id, $retry_index); - $retry_index++; - // 可以添加一个最大重试次数的限制,防止无限循环 - if ($retry_index > 50) { - break; - } - } - - - try { - //删除转存后可能有的广告 - $banned = Config('qfshop.quark_banned')??''; //如果出现这些字样就删除 - if(!empty($banned)){ - $bannedList = explode(',', $banned); - $pdir_fid = $myData['save_as']['save_as_top_fids'][0]; - $dellist = []; - $plist = $this->getPdirFid($pdir_fid); - if(!empty($plist)){ - foreach ($plist as $key => $value) { - // 检查$value['file_name']是否包含$bannedList中的任何一项 - $contains = false; - foreach ($bannedList as $item) { - if (strpos($value['file_name'], $item) !== false) { - $contains = true; - break; - } - } - if ($contains) { - $dellist[] = $value['fid']; - } - } - if(count($plist) === count($dellist)){ - //要删除的资源数如果和原数据资源数一样 就全部删除并终止下面的分享 - $this->deletepdirFid([$pdir_fid]); - return jerr("资源内容为空"); - }else{ - if (!empty($dellist)) { - $this->deletepdirFid($dellist); - } - } - - } - } - } catch (Exception $e) { - } - - $shareFid = $myData['save_as']['save_as_top_fids']; - //分享资源并拿到更新后的task_id - $task_id = $this->getShareBtn($myData['save_as']['save_as_top_fids'],$title); - - //根据task_id拿到share_id - $retry_index = 0; - $myData = ''; - while ($myData=='' || $myData['status'] != 2) { - $myData = $this->getShareTask($task_id, $retry_index); - $retry_index++; - // 可以添加一个最大重试次数的限制,防止无限循环 - if ($retry_index > 50) { - break; - } - } - - - //根据share_id 获取到分享链接 - $share = $this->getSharePassword($myData['share_id']); - // $share['fid'] = $share['first_file']['fid']; - $share['fid'] = (is_array($shareFid) && count($shareFid) > 1) ? $shareFid : $share['first_file']['fid']; - - return jok('转存成功', $share); - } - - /** - * 阿里 - 一键转存并分享资源 - * - * @return void - */ - public function transferAlipan($share_id) - { - $data = []; - $infos = $this->getAlipan1($share_id); - - if($this->isType == 1){ - $urls['title'] = $infos['share_name']; - $urls['share_url'] = $this->url; - return jok('检验成功', $urls); - }else{ - return jerr('阿里暂不支持转存'); - } - - - //通过分享id获取file_id - $file_infos = $infos['file_infos']; - - //通过分享id获取X-Share-Token - $share_token = $this->getAlipan2($share_id); - - $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'] = '66a20824c3846d890f6542c6aac2c79822d2a64f'; - $data3['requests'][$key]['headers']['Content-Type'] = 'application/json'; - $data3['requests'][$key]['id'] = $key.''; - $data3['requests'][$key]['method'] = 'POST'; - $data3['requests'][$key]['url'] = '/file/copy'; - } - - //保存 - $responses = $this->getAlipan3($data3,$share_token); - $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']; - } - - //分享 - $share = $this->getAlipan4($data4); - - $data['share_url'] = $share['share_url']; - $data['title'] = $share['share_title']; - - return jok('转存成功', $data); - } - - /** - * UC- 一键转存并分享资源 - * - * @return void - */ - public function transferUc($pwd_id){ - $infoData = $this->getStokenUc($pwd_id); - - if($this->isType == 1){ - $urls['title'] = $infoData['title']; - $urls['share_url'] = $this->url; - return jok('检验成功', $urls); - }else{ - return jerr('UC暂不支持转存'); - } - } - - - /** - * 获取要转存资源的stoken - * - * @return void - */ - public function getStoken($pwd_id) - { - $urlData = array( - 'passcode' => '', - 'pwd_id' => $pwd_id, - ); - $res = curlHelper("https://drive-pc.quark.cn/1/clouddrive/share/sharepage/token?pr=ucpro&fr=pc&uc_param_str=", "POST",json_encode($urlData), $this->urlHeader)['body']; - $res = json_decode($res, true); - if($res['status'] !== 200){ + if($res['code'] !== 200){ return jerr($res['message']); } - $data = $res['data']; - return $data; + + $isSave = input('isSave')??0; + if($isSave == 1){ + $data = [ + "title" => $res['data']['title'], + "url" => $res['data']['share_url'], + "is_type" => determineIsType($res['data']['share_url']), + "code" => $res['data']['code'] ?? $urlData['code'] ?? '', + "is_time" => $urlData['expired_type']==2 ? 1 : 0, + "update_time" => time(), + "create_time" => time(), + "fid" => is_array($res['data']['fid'] ?? '') ? json_encode($res['data']['fid']) : ($res['data']['fid'] ?? '') + ]; + $SourceModel = new SourceModel(); + $SourceModel->insertGetId($data); + } + return jok("获取成功",$res['data']); } - - /** - * 获取要转存资源的详细内容 - * - * @return void - */ - public function getShare($pwd_id,$stoken) - { - $urlData = array(); - $queryParams = [ - "pr" => "ucpro", - "fr" => "pc", - "uc_param_str" => "", - "pwd_id" => $pwd_id, - "stoken" => $stoken, - "pdir_fid" => "0", - "force" => "0", - "_page" => "1", - "_size" => "100", - "_fetch_banner" => "1", - "_fetch_share" => "1", - "_fetch_total" => "1", - "_sort" => "file_type:asc,updated_at:desc" - ]; - $res = curlHelper("https://drive-pc.quark.cn/1/clouddrive/share/sharepage/detail", "GET", json_encode($urlData), $this->urlHeader,$queryParams)['body']; - $res = json_decode($res, true); - if($res['status'] !== 200){ - return jerr($res['message']); - } - return $res['data']; - } - - - /** - * 转存资源到指定文件夹 - * - * @return void - */ - public function getShareSave($pwd_id,$stoken,$fid_list,$fid_token_list) - { - $to_pdir_fid = $this->to_pdir_fid??""; - $urlData = array( - 'fid_list' => $fid_list, - 'fid_token_list' => $fid_token_list, - 'to_pdir_fid' => $to_pdir_fid, - 'pwd_id' => $pwd_id, - 'stoken' => $stoken, - 'pdir_fid' => "0", - 'scene' => "link", - ); - $queryParams = [ - "entry" => "update_share", - "pr" => "ucpro", - "fr" => "pc", - "uc_param_str" => "" - ]; - $res = curlHelper("https://drive-pc.quark.cn/1/clouddrive/share/sharepage/save", "POST", json_encode($urlData), $this->urlHeader,$queryParams)['body']; - $res = json_decode($res, true); - if($res['status'] !== 200){ - return jerr($res['message']=='require login [guest]'?'夸克未登录,请检查cookie':$res['message']); - } - return $res['data']['task_id']; - } - - /** - * 分享资源拿到task_id - * - * @return void - */ - public function getShareBtn($fid_list,$title) - { - if(!empty($this->ad_fid)){ - $fid_list[] = $this->ad_fid; - } - $urlData = array( - 'fid_list' => $fid_list, - 'expired_type' => $this->expired_type, - 'title' => $title, - 'url_type' => 1, - ); - $queryParams = [ - "pr" => "ucpro", - "fr" => "pc", - "uc_param_str" => "" - ]; - $res = curlHelper("https://drive-pc.quark.cn/1/clouddrive/share", "POST", json_encode($urlData), $this->urlHeader,$queryParams)['body']; - $res = json_decode($res, true); - if($res['status'] !== 200){ - return jerr($res['message']); - } - return $res['data']['task_id']; - } - - - /** - * 根据task_id拿到自己的资源信息 - * - * @return void - */ - public function getShareTask($task_id,$retry_index) - { - $urlData = array(); - $queryParams = [ - "pr" => "ucpro", - "fr" => "pc", - "uc_param_str" => "", - "task_id" => $task_id, - "retry_index" => $retry_index - ]; - $res = curlHelper("https://drive-pc.quark.cn/1/clouddrive/task", "GET", json_encode($urlData), $this->urlHeader, $queryParams)['body']; - $res = json_decode($res, true); - if($res['status'] !== 200){ - return jerr($res['message']); - } - return $res['data']; - } - - /** - * 根据share_id 获取到分享链接 - * - * @return void - */ - public function getSharePassword($share_id) - { - $urlData = array( - 'share_id' => $share_id, - ); - $queryParams = [ - "pr" => "ucpro", - "fr" => "pc", - "uc_param_str" => "" - ]; - $res = curlHelper("https://drive-pc.quark.cn/1/clouddrive/share/password", "POST", json_encode($urlData), $this->urlHeader,$queryParams)['body']; - $res = json_decode($res, true); - if($res['status'] !== 200){ - return jerr($res['message']); - } - return $res['data']; - } - - - /** - * 删除指定资源 - * - * @return void - */ - public function deletepdirFid($filelist) - { - $urlData = array( - 'action_type' => 2, - 'exclude_fids' => [], - 'filelist' => $filelist, - ); - $queryParams = [ - "pr" => "ucpro", - "fr" => "pc", - "uc_param_str" => "" - ]; - curlHelper("https://drive-pc.quark.cn/1/clouddrive/file/delete", "POST", json_encode($urlData), $this->urlHeader,$queryParams)['body']; - } - - /** - * 获取夸克网盘指定文件夹内容 - * - * @return void - */ - public function getPdirFid($pdir_fid) - { - $urlData = []; - $queryParams = [ - 'pr' => 'ucpro', - 'fr' => 'pc', - 'uc_param_str' => '', - 'pdir_fid' => $pdir_fid, - '_page' => 1, - '_size' => 200, - '_fetch_total' => 1, - '_fetch_sub_dirs' => 0, - '_sort' => 'file_type:asc,updated_at:desc', - ]; - $res = curlHelper("https://drive-pc.quark.cn/1/clouddrive/file/sort", "GET", json_encode($urlData), $this->urlHeader,$queryParams)['body']; - $res = json_decode($res, true); - if($res['status'] !== 200){ - return []; - } - return $res['data']['list']; - } - - - - /** - * 阿里-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']; - $res = json_decode($res, true); - if(!isset($res['file_infos'])){ - return jerr($res['message']??'转存失败1'); - } - return $res; - } - - /** - * 阿里-0-通过分享id获取X-Share-Token - * - * @return void - */ - public function getAlipan2($share_id) - { - $urlData = array( - 'share_id' => $share_id, - ); - $urlHeader = array( - 'Accept: application/json, text/plain, */*', - 'Accept-Encoding: gzip, deflate, br, zstd', - 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', - 'Authorization: '.$this->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' - ); - $res = curlHelper("https://api.aliyundrive.com/v2/share_link/get_share_token", "POST", json_encode($urlData), $urlHeader)['body']; - $res = json_decode($res, true); - if(!isset($res['share_token'])){ - return jerr($res['message']??'转存失败2'); - } - return $res['share_token']; - } - - /** - * 阿里-1-保存 - * - * @return void - */ - public function getAlipan3($urlData,$share_token) - { - $urlHeader = array( - 'Accept: application/json, text/plain, */*', - 'Accept-Encoding: gzip, deflate, br, zstd', - 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6', - 'Authorization: '.$this->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', - 'X-Share-Token: '.$share_token - ); - $res = curlHelper("https://api.aliyundrive.com/adrive/v4/batch", "POST", json_encode($urlData), $urlHeader)['body']; - $res = json_decode($res, true); - if(!isset($res['responses'])){ - return jerr($res['message']??'转存失败3'); - } - return $res['responses']; - } - - /** - * 阿里-2-分享 - * - * @return void - */ - public function getAlipan4($urlData) - { - $urlHeader = array( - '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: '.$this->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' - ); - $res = curlHelper("https://api.aliyundrive.com/adrive/v2/share_link/create", "POST", json_encode($urlData), $urlHeader)['body']; - $res = json_decode($res, true); - return jerr($res); - if(!isset($res['share_url'])){ - return jerr($res['message']??'转存失败4'); - } - return $res; - } - - - /** - * UC 00000 - * - * @return void - */ - public function getStokenUc($pwd_id) - { - $urlData = array( - 'passcode' => '', - 'pwd_id' => $pwd_id, - ); - $urlHeader = array( - 'Accept: application/json, text/plain, */*', - 'Accept-Language: zh-CN,zh;q=0.9', - 'content-type: application/json;charset=UTF-8', - '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', - 'Referer: https://drive.uc.cn/', - 'Referrer-Policy: strict-origin-when-cross-origin', - 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', - ); - - $res = curlHelper("https://pc-api.uc.cn/1/clouddrive/share/sharepage/token?pr=UCBrowser&fr=pc", "POST",json_encode($urlData),$urlHeader)['body']; - $res = json_decode($res, true); - if($res['status'] !== 200){ - return jerr($res['message']); - } - $data = $res['data']; - return $data; - } - } diff --git a/app/api/controller/Other.php b/app/api/controller/Other.php index 5dea9d9..24b1746 100644 --- a/app/api/controller/Other.php +++ b/app/api/controller/Other.php @@ -15,7 +15,6 @@ class Other extends QfShop { parent::__construct($app); $this->model = new SourceModel(); - $this->cookie = Config('qfshop.quark_cookie'); } /** @@ -25,14 +24,9 @@ class Other extends QfShop */ public function all_search($param='') { - if(empty($param)){ - $searchdata = input('post.'); - if (empty($searchdata['title'])) { - return jerr("请输入要看的内容"); - } - $title = $searchdata['title']; - }else{ - $title = $param; + $title = $param ?: input('post.title', ''); + if (empty($title)) { + return jerr("请输入要看的内容"); } $map[] = ['status', '=', 1]; @@ -42,29 +36,17 @@ class Other extends QfShop $urls = $this->model->where($map)->field('source_id as id, title, url,is_time')->order('update_time', 'desc')->limit(5)->select()->toArray(); if (!empty($urls)) { - - // 获取所有需要更新的ID - $ids = []; - foreach ($urls as $item) { - $ids[] = $item['id']; - } - - // 更新数据库中的 update_time 字段 - if (!empty($ids)) { - $this->model->whereIn('source_id', $ids)->update(['update_time' => time()]); - } - + $ids = array_column($urls, 'id'); + $this->model->whereIn('source_id', $ids)->update(['update_time' => time()]); return !empty($param) ? $urls : jok('临时资源获取成功', $urls); } - - //同一个搜索内容锁机 - if (Cache::has($title)) { + //同一个搜索内容锁机 + if (Cache::has($title)) { // 检查缓存中是否已有结果 return !empty($param) ? Cache::get($title) : jok('临时资源获取成功', Cache::get($title)); } - // 检查是否有正在处理的请求 if (Cache::has($title . '_processing')) { // 如果当前正在处理相同关键词的请求,等待结果 @@ -89,41 +71,19 @@ class Other extends QfShop $num_total = 2; //最多想要几条结果 $num_success = 0; - // 处理第2个源 - foreach (source2($title) as $value) { + // 定义源的顺序 + $sources = ['source2', 'source4', 'source5', 'source3', 'source1']; + + foreach ($sources as $source) { if ($num_success >= $num_total) { - break; // 有效结果数量已达到,则跳出循环 + break; } - // 如果 URL 不存在则新增 $value - if (!$this->urlExists($searchList, $value['url'])) { - $searchList[] = $value; - $this->processUrl($value, $num_success, $datas); - } - } - - - - // 处理第4个源 - if ($num_success < $num_total) { - foreach (source4($title) as $value) { + + foreach ($source($title) as $value) { if ($num_success >= $num_total) { - break; // 有效结果数量已达到,则跳出循环 + break; } - // 如果 URL 不存在则新增 $value - if (!$this->urlExists($searchList, $value['url'])) { - $searchList[] = $value; - $this->processUrl($value, $num_success, $datas); - } - } - } - - // 处理第5个源 - if ($num_success < $num_total) { - foreach (source5($title) as $value) { - if ($num_success >= $num_total) { - break; // 有效结果数量已达到,则跳出循环 - } - // 如果 URL 不存在则新增 $value + if (!$this->urlExists($searchList, $value['url'])) { $searchList[] = $value; $this->processUrl($value, $num_success, $datas); @@ -131,36 +91,6 @@ class Other extends QfShop } } - - // 处理第3个源 - if ($num_success < $num_total) { - foreach (source3($title) as $value) { - if ($num_success >= $num_total) { - break; // 有效结果数量已达到,则跳出循环 - } - // 如果 URL 不存在则新增 $value - if (!$this->urlExists($searchList, $value['url'])) { - $searchList[] = $value; - $this->processUrl($value, $num_success, $datas); - } - } - } - - - // 处理第1个源 第一个源放最后 - if ($num_success < $num_total) { - foreach (source1($title) as $value) { - if ($num_success >= $num_total) { - break; // 有效结果数量已达到,则跳出循环 - } - // 如果 URL 不存在则新增 $value - if (!$this->urlExists($searchList, $value['url'])) { - $searchList[] = $value; - $this->processUrl($value, $num_success, $datas); - } - } - } - Cache::set($title, $datas, 60); // 缓存结果60秒 Cache::delete($title . '_processing'); // 解锁 @@ -201,15 +131,14 @@ class Other extends QfShop $pwd_id = substr($substring, 2); // 去除 's/' 部分 $urlData = array( - 'cookie' => $this->cookie, 'url' => $value['url'], 'expired_type' => 2, - 'to_pdir_fid' => '', //存入目标文件 'ad_fid' => '', //分享时带上这个文件 ); - $res = curlHelper(Request::domain()."/api/open/transfer", "POST", $urlData)['body']; - $res = json_decode($res, true); - + + $transfer = new \netdisk\Transfer(); + $res = $transfer->transfer($urlData); + if($res['code'] !== 200){ return; // 模拟 continue 行为 } @@ -247,40 +176,15 @@ class Other extends QfShop $this->model->where($map)->chunk(100, function ($order) { foreach ($order as $value) { $deles = $value->toArray(); - // $filelist = []; - // $filelist[] = $deles['fid']; $fid = $deles['fid']; // 尝试解码,如果是有效的 JSON 数组则使用,否则转为单元素数组 $filelist = (is_string($fid) && ($decodedFid = json_decode($fid, true)) && is_array($decodedFid)) ? $decodedFid : (array)$fid; - - - $urlData = array( - 'action_type' => 2, - 'exclude_fids' => [], - 'filelist' => $filelist, - ); - $urlHeader = array( - 'Accept: application/json, text/plain, */*', - 'Accept-Language: zh-CN,zh;q=0.9', - 'content-type: application/json;charset=UTF-8', - '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', - 'Referer: https://pan.quark.cn/', - 'Referrer-Policy: strict-origin-when-cross-origin', - 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', - 'cookie: '.$this->cookie, - ); - $res = curlHelper("https://drive-pc.quark.cn/1/clouddrive/file/delete?pr=ucpro&fr=pc&uc_param_str=", "POST", json_encode($urlData), $urlHeader)['body']; - $res = json_decode($res, true); - if($res['status'] == 200){ - $this->model->where('fid', $deles['fid'])->delete(); - } + + $this->model->where('fid', $deles['fid'])->delete(); + $transfer = new \netdisk\Transfer(); + $transfer->deletepdirFid($deles['is_type'],$filelist); } }); diff --git a/app/common.php b/app/common.php index 43e25b3..7b0919a 100644 --- a/app/common.php +++ b/app/common.php @@ -17,6 +17,14 @@ function jok($message = 'success', $data = null) } die; } +function jok2($message = 'success', $data = null) +{ + if ($data) { + return ["code" => 200, "message" => $message, 'data' => $data]; + } else { + return ["code" => 200, "message" => $message, 'data' => $data??'']; + } +} /** * 输出错误JSON * @@ -30,6 +38,10 @@ function jerr($message = 'error', $code = 500) echo json_encode(["code" => $code, "message" => $message]); die; } +function jerr2($message = 'error', $code = 500) +{ + return ["code" => $code, "message" => $message]; +} /** * 密码+盐 加密 * @@ -789,6 +801,85 @@ function determineIsType($url) { } } +/** + * 解析网盘分享链接 + * + * @param string $input 输入的链接文本,可以是多行 + * @return array 解析后的链接数组,每个元素包含url、title和code + */ +function parsePanLinks($input) +{ + // 分割多行输入 + $links = explode("\n", $input); + + // 去掉数组元素中的空白字符 + $links = array_map('trim', $links); + + // 过滤掉空值的数组元素 + $links = array_filter($links); + + $parsedLinks = array_values(array_filter(array_map(function ($item) { + // 统一处理百度网盘分享格式,同时匹配两种格式 + if (preg_match('/链接:?\s*(https?:\/\/[^\s]+)\s*提取码:?\s*([a-zA-Z0-9]{4})/i', $item, $matches)) { + $url = trim($matches[1]); + $code = trim($matches[2]); + // 确保URL中包含提取码 + if (!empty($code) && strpos($url, '?pwd=') === false) { + $url .= (strpos($url, '?') === false ? '?' : '&') . 'pwd=' . $code; + } + return [ + 'url' => $url, + 'title' => '', + 'code' => $code + ]; + } + + // 提取 URL + if (!preg_match('/https?:\/\/[^\s]+/', $item, $matches)) { + return null; // 没有匹配到 URL,直接丢弃 + } + + $url = trim($matches[0]); + $code = ''; + + // 提取提取码(?pwd= 或 , 分割) + if (preg_match('/\?pwd=([^,\s&]+)/', $item, $pwdMatch)) { + $code = trim($pwdMatch[1]); + } elseif (preg_match('/,\s*([a-zA-Z0-9]{4})\s*$/', $item, $commaMatch)) { + $code = trim($commaMatch[1]); + // 添加提取码到URL + if (!empty($code)) { + $url .= (strpos($url, '?') === false ? '?' : '&') . 'pwd=' . $code; + } + } elseif (preg_match('/提取码:?\s*([a-zA-Z0-9]{4})/i', $item, $codeMatch)) { + $code = trim($codeMatch[1]); + // 添加提取码到URL + if (!empty($code)) { + $url .= (strpos($url, '?') === false ? '?' : '&') . 'pwd=' . $code; + } + } + + // 返回结果时,确保 title 保持为空字符串 + return [ + 'url' => $url, + 'title' => '', + 'code' => $code + ]; + }, $links))); + + // 去重,使用 'url' 字段来去重 + $uniqueUrls = []; + $result = array_filter($parsedLinks, function($item) use (&$uniqueUrls) { + if (!in_array($item['url'], $uniqueUrls)) { + $uniqueUrls[] = $item['url']; // 添加到已处理的 URL 列表 + return true; // 保留此项目 + } + return false; // 去掉重复的项目 + }); + + return array_values($result); +} + /** * 网络资源搜索源一 diff --git a/app/model/Source.php b/app/model/Source.php index e935f46..f78d5da 100644 --- a/app/model/Source.php +++ b/app/model/Source.php @@ -60,6 +60,9 @@ class Source extends QfShop */ public function getDetail(array $data) { + if(empty($data['id'])){ + return jerr('参数错误'); + } $map[] = ['status', '=', 1]; $map[] = ['is_delete', '=', 0]; $map[] = ['source_id', '=', $data['id']]; diff --git a/app/qfadmin/view/common/menu.html b/app/qfadmin/view/common/menu.html index 4602037..13593e3 100644 --- a/app/qfadmin/view/common/menu.html +++ b/app/qfadmin/view/common/menu.html @@ -34,7 +34,7 @@ {/volist}
-Tips:夸克云盘网页版的cookie,不懂如何获取请百度;填写并保存后才能使用下面功能
-请选择
+请选择
+请选择
+请选择
+Tips:转存目录不能为空,为空将无法转存; 阿里网盘禁止香港及海外服务器调用分享接口
+请选择
+请选择
+请选择
+请选择
+Tips:迅雷云盘暂不支持
+| 环境检测 | +推荐配置 | +当前状态 | +最低要求 | +
| 操作系统 | +类UNIX | +√ | +不限制 | +
| PHP版本 | ++ | + | + |
| 附件上传 | +>2M | ++ | 不限制 | +
| session | +开启 | ++ | 开启 | +
| 目录、文件权限检查 | +写入 | +读取 | +
| + | + | + |
正在安装...
+
+