This commit is contained in:
杨志
2026-01-20 16:26:56 +08:00
parent 76cdf86414
commit bb19a1d47c
3 changed files with 22 additions and 44 deletions

View File

@@ -127,42 +127,37 @@ class Crawler extends BaseController
*/ */
private function buildCookieString(array|string $cookies): string private function buildCookieString(array|string $cookies): string
{ {
// 如果直接传入原始Cookie字符串优先使用(支持多重同名键) // 如果直接传入原始Cookie字符串优先使用
if (is_string($cookies)) { if (is_string($cookies)) {
return trim($cookies); return trim($cookies);
} }
// 只保留用户填写的Cookie去重并优先保留后者(防止重复JSESSIONID // 只保留用户填写的Cookie若同名键多值则取最后一个(单JSESSIONID场景
$cookieData = $cookies['请求 Cookie'] ?? $cookies; $cookieData = $cookies['请求 Cookie'] ?? $cookies;
$normalized = []; // 同名键保留多值 $normalized = [];
foreach ($cookieData as $key => $value) { foreach ($cookieData as $key => $value) {
$k = trim((string)$key); $k = trim((string)$key);
if ($k === '') { if ($k === '') {
continue; continue;
} }
$vals = is_array($value) ? $value : [$value]; $v = is_array($value) ? end($value) : $value;
foreach ($vals as $v) { $v = trim((string)$v);
$v = trim((string)$v); if ($v === '') {
if ($v === '') { continue;
continue;
}
$normalized[$k][] = $v; // 多值按输入顺序保留
} }
// 后面的值覆盖前面的值,确保单值
$normalized[$k] = $v;
} }
// 将 JSESSIONID 放在最前(如果存在),其余按键名顺序 // 将 JSESSIONID 放在最前(如果存在),其余按键名顺序
$parts = []; $parts = [];
if (isset($normalized['JSESSIONID'])) { if (isset($normalized['JSESSIONID'])) {
foreach ($normalized['JSESSIONID'] as $v) { $parts[] = 'JSESSIONID=' . $normalized['JSESSIONID'];
$parts[] = 'JSESSIONID=' . $v;
}
unset($normalized['JSESSIONID']); unset($normalized['JSESSIONID']);
} }
foreach ($normalized as $k => $vArr) { foreach ($normalized as $k => $v) {
foreach ($vArr as $v) { $parts[] = $k . '=' . $v;
$parts[] = $k . '=' . $v;
}
} }
return implode('; ', $parts); return implode('; ', $parts);

View File

@@ -194,12 +194,12 @@ class CrawlerService
*/ */
private function buildCookieString(array|string $cookies): string private function buildCookieString(array|string $cookies): string
{ {
// 如果直接传入原始Cookie字符串优先使用(支持多重同名键) // 如果直接传入原始Cookie字符串优先使用
if (is_string($cookies)) { if (is_string($cookies)) {
return trim($cookies); return trim($cookies);
} }
// 只保留用户填写的Cookie支持同名键多值 // 只保留用户填写的Cookie同名键多值则取最后一个单JSESSIONID场景
$cookieData = $cookies['请求 Cookie'] ?? $cookies; $cookieData = $cookies['请求 Cookie'] ?? $cookies;
$normalized = []; $normalized = [];
@@ -208,28 +208,22 @@ class CrawlerService
if ($k === '') { if ($k === '') {
continue; continue;
} }
$vals = is_array($value) ? $value : [$value]; $v = is_array($value) ? end($value) : $value;
foreach ($vals as $v) { $v = trim((string)$v);
$v = trim((string)$v); if ($v === '') {
if ($v === '') { continue;
continue;
}
$normalized[$k][] = $v;
} }
$normalized[$k] = $v;
} }
// 将 JSESSIONID 放在最前(如果存在),其余按键名顺序 // 将 JSESSIONID 放在最前(如果存在),其余按键名顺序
$parts = []; $parts = [];
if (isset($normalized['JSESSIONID'])) { if (isset($normalized['JSESSIONID'])) {
foreach ($normalized['JSESSIONID'] as $v) { $parts[] = 'JSESSIONID=' . $normalized['JSESSIONID'];
$parts[] = 'JSESSIONID=' . $v;
}
unset($normalized['JSESSIONID']); unset($normalized['JSESSIONID']);
} }
foreach ($normalized as $k => $vArr) { foreach ($normalized as $k => $v) {
foreach ($vArr as $v) { $parts[] = $k . '=' . $v;
$parts[] = $k . '=' . $v;
}
} }
return implode('; ', $parts); return implode('; ', $parts);

View File

@@ -255,12 +255,6 @@
<small>从浏览器开发者工具中复制SERVERID的值</small> <small>从浏览器开发者工具中复制SERVERID的值</small>
</div> </div>
<div class="form-group">
<label for="cookie-raw">整行 Cookie可选直接粘贴浏览器抓到的整行 Cookie会优先使用</label>
<textarea id="cookie-raw" placeholder="JSESSIONID=...; JSESSIONID=...; SERVERID=..."></textarea>
<small>如果填写本项,将优先使用整行 Cookie支持多个JSESSIONID</small>
</div>
<div class="form-group"> <div class="form-group">
<label for="examid">examid</label> <label for="examid">examid</label>
<input type="text" id="examid" placeholder="796a0fa25f7c9ffb"> <input type="text" id="examid" placeholder="796a0fa25f7c9ffb">
@@ -450,11 +444,6 @@
// 组装Cookie数据 // 组装Cookie数据
function buildCookiesPayload(messageContainerId) { function buildCookiesPayload(messageContainerId) {
const rawLine = document.getElementById('cookie-raw').value.trim();
if (rawLine) {
return rawLine;
}
const jsessionid = document.getElementById('cookie-jsessionid').value.trim(); const jsessionid = document.getElementById('cookie-jsessionid').value.trim();
const serverid = document.getElementById('cookie-serverid').value.trim(); const serverid = document.getElementById('cookie-serverid').value.trim();