|
1 | 1 | async function operator(proxies = [], targetPlatform, context) { |
2 | 2 | let args = $arguments || {} |
3 | | - const { parseFlowHeaders, getFlowHeaders, flowTransfer, getRmainingDays } = flowUtils |
| 3 | + const $ = $substore |
| 4 | + const { parseFlowHeaders, getFlowHeaders, flowTransfer, getRmainingDays, normalizeFlowHeader } = flowUtils |
4 | 5 | const sub = context.source[proxies?.[0]?._subName || proxies?.[0]?.subName] |
5 | 6 | let subInfo |
6 | | - if (sub.source === 'local' && !['localFirst', 'remoteFirst'].includes(sub.mergeSources)) { |
7 | | - if (sub.subUserinfo) { |
8 | | - if (/^https?:\/\//.test(sub.subUserinfo)) { |
9 | | - subInfo = await getFlowHeaders(undefined, undefined, undefined, sub.proxy, sub.subUserinfo) |
10 | | - } else { |
11 | | - subInfo = sub.subUserinfo |
| 7 | + let flowInfo |
| 8 | + if (sub.source !== 'local' || ['localFirst', 'remoteFirst'].includes(sub.mergeSources)) { |
| 9 | + try { |
| 10 | + let url = |
| 11 | + `${sub.url}` |
| 12 | + .split(/[\r\n]+/) |
| 13 | + .map(i => i.trim()) |
| 14 | + .filter(i => i.length)?.[0] || '' |
| 15 | + |
| 16 | + let $arguments = {} |
| 17 | + const rawArgs = url.split('#') |
| 18 | + url = url.split('#')[0] |
| 19 | + if (rawArgs.length > 1) { |
| 20 | + try { |
| 21 | + // 支持 `#${encodeURIComponent(JSON.stringify({arg1: "1"}))}` |
| 22 | + $arguments = JSON.parse(decodeURIComponent(rawArgs[1])) |
| 23 | + } catch (e) { |
| 24 | + for (const pair of rawArgs[1].split('&')) { |
| 25 | + const key = pair.split('=')[0] |
| 26 | + const value = pair.split('=')[1] |
| 27 | + // 部分兼容之前的逻辑 const value = pair.split('=')[1] || true; |
| 28 | + $arguments[key] = value == null || value === '' ? true : decodeURIComponent(value) |
| 29 | + } |
| 30 | + } |
12 | 31 | } |
| 32 | + if (!$arguments.noFlow && /^https?/.test(url)) { |
| 33 | + // forward flow headers |
| 34 | + flowInfo = await getFlowHeaders( |
| 35 | + $arguments?.insecure ? `${url}#insecure` : url, |
| 36 | + $arguments.flowUserAgent, |
| 37 | + undefined, |
| 38 | + sub.proxy, |
| 39 | + $arguments.flowUrl |
| 40 | + ) |
| 41 | + if (flowInfo) { |
| 42 | + const headers = normalizeFlowHeader(flowInfo, true) |
| 43 | + if (headers?.['subscription-userinfo']) { |
| 44 | + subInfo = headers['subscription-userinfo'] |
| 45 | + } |
| 46 | + } |
| 47 | + } |
| 48 | + } catch (err) { |
| 49 | + $.error(`订阅 ${sub.name} 获取流量信息时发生错误: ${JSON.stringify(err)}`) |
| 50 | + $.error(err?.message) |
| 51 | + $.error(err?.stack) |
13 | 52 | } |
14 | | - } else { |
15 | | - let url = `${sub.url}` |
16 | | - .split(/[\r\n]+/) |
17 | | - .map(i => i.trim()) |
18 | | - .filter(i => i.length)?.[0] |
19 | | - |
20 | | - let urlArgs = {} |
21 | | - const rawArgs = url.split('#') |
22 | | - url = url.split('#')[0] |
23 | | - if (rawArgs.length > 1) { |
| 53 | + } |
| 54 | + if (sub.subUserinfo) { |
| 55 | + let subUserInfo |
| 56 | + if (/^https?:\/\//.test(sub.subUserinfo)) { |
24 | 57 | try { |
25 | | - // 支持 `#${encodeURIComponent(JSON.stringify({arg1: "1"}))}` |
26 | | - urlArgs = JSON.parse(decodeURIComponent(rawArgs[1])) |
| 58 | + subUserInfo = await getFlowHeaders(undefined, undefined, undefined, proxy || sub.proxy, sub.subUserinfo) |
27 | 59 | } catch (e) { |
28 | | - for (const pair of rawArgs[1].split('&')) { |
29 | | - const key = pair.split('=')[0] |
30 | | - const value = pair.split('=')[1] |
31 | | - // 部分兼容之前的逻辑 const value = pair.split('=')[1] || true; |
32 | | - urlArgs[key] = value == null || value === '' ? true : decodeURIComponent(value) |
33 | | - } |
| 60 | + $.error(`订阅 ${sub.name} 使用自定义流量链接 ${sub.subUserinfo} 获取流量信息时发生错误: ${JSON.stringify(e)}`) |
34 | 61 | } |
| 62 | + } else { |
| 63 | + subUserInfo = sub.subUserinfo |
35 | 64 | } |
36 | | - args = { ...urlArgs, ...args } |
37 | | - if (!args.noFlow) { |
38 | | - if (sub.subUserinfo) { |
39 | | - if (/^https?:\/\//.test(sub.subUserinfo)) { |
40 | | - subInfo = await getFlowHeaders(undefined, undefined, undefined, sub.proxy, sub.subUserinfo) |
41 | | - } else { |
42 | | - subInfo = sub.subUserinfo |
43 | | - } |
44 | | - } else { |
45 | | - subInfo = await getFlowHeaders(url) |
46 | | - } |
| 65 | + |
| 66 | + const headers = normalizeFlowHeader([subUserInfo, flowInfo].filter(i => i).join(';'), true) |
| 67 | + if (headers?.['subscription-userinfo']) { |
| 68 | + subInfo = headers['subscription-userinfo'] |
47 | 69 | } |
48 | 70 | } |
49 | 71 |
|
|
0 commit comments