|
1 |
| -// import axios from 'axios'; |
2 |
| -// import QRCode from 'qrcode'; |
3 |
| -// import { Buffer } from 'buffer'; |
4 |
| -// import { v4 as uuidv4 } from 'uuid'; |
5 |
| - |
6 | 1 | class QRCodeHandler {
|
7 | 2 | // 状态常量
|
8 | 3 | static STATUS_NEW = "NEW"; // 待扫描
|
@@ -46,6 +41,52 @@ class QRCodeHandler {
|
46 | 41 | });
|
47 | 42 | }
|
48 | 43 |
|
| 44 | + formatCookiesToList(cookieString) { |
| 45 | + const result = []; |
| 46 | + let currentCookie = ''; |
| 47 | + let inExpires = false; |
| 48 | + |
| 49 | + for (let i = 0; i < cookieString.length; i++) { |
| 50 | + const char = cookieString[i]; |
| 51 | + |
| 52 | + // 判断是否进入或退出 `expires` 属性 |
| 53 | + if (cookieString.slice(i, i + 8).toLowerCase() === 'expires=') { |
| 54 | + inExpires = true; |
| 55 | + } |
| 56 | + if (inExpires && char === ';') { |
| 57 | + inExpires = false; |
| 58 | + } |
| 59 | + |
| 60 | + // 检测到逗号分隔符并且不在 `expires` 属性中,表示一个 Cookie 条目结束 |
| 61 | + if (char === ',' && !inExpires) { |
| 62 | + result.push(currentCookie.trim()); |
| 63 | + currentCookie = ''; |
| 64 | + } else { |
| 65 | + currentCookie += char; |
| 66 | + } |
| 67 | + } |
| 68 | + |
| 69 | + // 添加最后一个 Cookie 条目 |
| 70 | + if (currentCookie.trim()) { |
| 71 | + result.push(currentCookie.trim()); |
| 72 | + } |
| 73 | + |
| 74 | + return result; |
| 75 | + }; |
| 76 | + |
| 77 | + formatCookie(cookies) { |
| 78 | + if (!Array.isArray(cookies)) cookies = [cookies]; |
| 79 | + if (cookies.length === 0) return ''; |
| 80 | + |
| 81 | + let mainCookies = []; |
| 82 | + for (const cookie of cookies) { |
| 83 | + if (cookie && typeof cookie === 'string' && cookie.trim()) { |
| 84 | + mainCookies.push(cookie.split('; ')[0]); |
| 85 | + } |
| 86 | + } |
| 87 | + return mainCookies.join(';'); |
| 88 | + } |
| 89 | + |
49 | 90 | async startScan(platform) {
|
50 | 91 | switch (platform) {
|
51 | 92 | case QRCodeHandler.PLATFORM_QUARK:
|
@@ -158,10 +199,30 @@ class QRCodeHandler {
|
158 | 199 | }
|
159 | 200 | });
|
160 | 201 | const cookieResData = cookieRes.data;
|
161 |
| - const cookies = Array.isArray(cookieResData.headers['set-cookie']) ? cookieResData.headers['set-cookie'].join('; '):cookieResData.headers['set-cookie']; |
| 202 | + const cookies = Array.isArray(cookieResData.headers['set-cookie']) ? cookieResData.headers['set-cookie'].join('; ') : cookieResData.headers['set-cookie']; |
| 203 | + const cookies2array = this.formatCookiesToList(cookies); |
| 204 | + let mainCookies = this.formatCookie(cookies2array); |
| 205 | + const cookieSelfRes = await axios({ |
| 206 | + url: "/http", |
| 207 | + method: "POST", |
| 208 | + data: { |
| 209 | + url: "https://drive-pc.quark.cn/1/clouddrive/file/sort?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", |
| 210 | + headers: { |
| 211 | + ...QRCodeHandler.HEADERS, |
| 212 | + Origin: 'https://pan.quark.cn', |
| 213 | + Referer: 'https://pan.quark.cn/', |
| 214 | + Cookie: mainCookies |
| 215 | + } |
| 216 | + } |
| 217 | + }); |
| 218 | + const cookieResDataSelf = cookieSelfRes.data; |
| 219 | + const cookiesSelf = Array.isArray(cookieResDataSelf.headers['set-cookie']) ? cookieResDataSelf.headers['set-cookie'].join('; ') : cookieResDataSelf.headers['set-cookie']; |
| 220 | + const cookies2arraySelf = this.formatCookiesToList(cookiesSelf); |
| 221 | + const mainCookiesSelf = this.formatCookie(cookies2arraySelf); |
| 222 | + if (mainCookiesSelf) mainCookies += ';' + mainCookiesSelf; |
162 | 223 | return {
|
163 | 224 | status: QRCodeHandler.STATUS_CONFIRMED,
|
164 |
| - cookie: cookies |
| 225 | + cookie: mainCookies |
165 | 226 | };
|
166 | 227 | } else if (resData.data.status === 50004002) { // token过期
|
167 | 228 | this.platformStates[QRCodeHandler.PLATFORM_QUARK] = null;
|
@@ -370,11 +431,13 @@ class QRCodeHandler {
|
370 | 431 | }
|
371 | 432 | });
|
372 | 433 | const cookieResData = cookieRes.data;
|
373 |
| - const cookies = Array.isArray(cookieResData.headers['set-cookie']) ? cookieResData.headers['set-cookie'].join('; '):cookieResData.headers['set-cookie']; |
| 434 | + const cookies = cookieResData.headers['set-cookie']; |
| 435 | + const cookies2array = this.formatCookiesToList(cookies); |
| 436 | + const mainCookies = this.formatCookie(cookies2array); |
374 | 437 | this.platformStates[QRCodeHandler.PLATFORM_UC] = null;
|
375 | 438 | return {
|
376 | 439 | status: QRCodeHandler.STATUS_CONFIRMED,
|
377 |
| - cookie: cookies |
| 440 | + cookie: mainCookies |
378 | 441 | };
|
379 | 442 | } else if (resData.data.status === 50004002) { // token过期
|
380 | 443 | this.platformStates[QRCodeHandler.PLATFORM_UC] = null;
|
|
0 commit comments