Skip to content

Commit 0d7bda0

Browse files
committed
feat: Sub-Store 订阅添加流量/过期信息节点脚本同步最新获取订阅流量信息逻辑
1 parent f80da01 commit 0d7bda0

1 file changed

Lines changed: 58 additions & 36 deletions

File tree

  • surge/modules/sub-store-scripts/sub-info

surge/modules/sub-store-scripts/sub-info/node.js

Lines changed: 58 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,71 @@
11
async function operator(proxies = [], targetPlatform, context) {
22
let args = $arguments || {}
3-
const { parseFlowHeaders, getFlowHeaders, flowTransfer, getRmainingDays } = flowUtils
3+
const $ = $substore
4+
const { parseFlowHeaders, getFlowHeaders, flowTransfer, getRmainingDays, normalizeFlowHeader } = flowUtils
45
const sub = context.source[proxies?.[0]?._subName || proxies?.[0]?.subName]
56
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+
}
1231
}
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)
1352
}
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)) {
2457
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)
2759
} 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)}`)
3461
}
62+
} else {
63+
subUserInfo = sub.subUserinfo
3564
}
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']
4769
}
4870
}
4971

0 commit comments

Comments
 (0)