feat: 支持使用代理/节点获取订阅

This commit is contained in:
xream 2024-03-13 01:55:16 +08:00
parent ca65e4209e
commit cd352cd574
No known key found for this signature in database
GPG Key ID: 1D2C5225471789F9
7 changed files with 67 additions and 15 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "sub-store", "name": "sub-store",
"version": "2.14.249", "version": "2.14.250",
"description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.", "description": "Advanced Subscription Manager for QX, Loon, Surge, Stash and ShadowRocket.",
"main": "src/main.js", "main": "src/main.js",
"scripts": { "scripts": {

View File

@ -111,7 +111,12 @@ async function downloadSubscription(req, res) {
} }
if (!$arguments.noFlow) { if (!$arguments.noFlow) {
// forward flow headers // forward flow headers
const flowInfo = await getFlowHeaders(url); const flowInfo = await getFlowHeaders(
url,
undefined,
undefined,
sub.proxy,
);
if (flowInfo) { if (flowInfo) {
res.set('subscription-userinfo', flowInfo); res.set('subscription-userinfo', flowInfo);
} }
@ -243,7 +248,12 @@ async function downloadCollection(req, res) {
} }
} }
if (!$arguments.noFlow) { if (!$arguments.noFlow) {
const flowInfo = await getFlowHeaders(url); const flowInfo = await getFlowHeaders(
url,
undefined,
undefined,
sub.proxy,
);
if (flowInfo) { if (flowInfo) {
res.set('subscription-userinfo', flowInfo); res.set('subscription-userinfo', flowInfo);
} }

View File

@ -109,7 +109,12 @@ async function compareSub(req, res) {
.filter((i) => i.length) .filter((i) => i.length)
.map(async (url) => { .map(async (url) => {
try { try {
return await download(url, sub.ua); return await download(
url,
sub.ua,
undefined,
sub.proxy,
);
} catch (err) { } catch (err) {
errors[url] = err; errors[url] = err;
$.error( $.error(
@ -195,7 +200,12 @@ async function compareCollection(req, res) {
.filter((i) => i.length) .filter((i) => i.length)
.map(async (url) => { .map(async (url) => {
try { try {
return await download(url, sub.ua); return await download(
url,
sub.ua,
undefined,
sub.proxy,
);
} catch (err) { } catch (err) {
errors[url] = err; errors[url] = err;
$.error( $.error(

View File

@ -113,7 +113,12 @@ async function getFlowInfo(req, res) {
}), }),
}); });
} else { } else {
const flowHeaders = await getFlowHeaders(url); const flowHeaders = await getFlowHeaders(
url,
undefined,
undefined,
sub.proxy,
);
if (!flowHeaders) { if (!flowHeaders) {
failed( failed(
res, res,

View File

@ -62,7 +62,12 @@ async function produceArtifact({
.filter((i) => i.length) .filter((i) => i.length)
.map(async (url) => { .map(async (url) => {
try { try {
return await download(url, ua || sub.ua); return await download(
url,
ua || sub.ua,
undefined,
sub.proxy,
);
} catch (err) { } catch (err) {
errors[url] = err; errors[url] = err;
$.error( $.error(
@ -102,7 +107,12 @@ async function produceArtifact({
.filter((i) => i.length) .filter((i) => i.length)
.map(async (url) => { .map(async (url) => {
try { try {
return await download(url, ua || sub.ua); return await download(
url,
ua || sub.ua,
undefined,
sub.proxy,
);
} catch (err) { } catch (err) {
errors[url] = err; errors[url] = err;
$.error( $.error(
@ -198,7 +208,12 @@ async function produceArtifact({
.filter((i) => i.length) .filter((i) => i.length)
.map(async (url) => { .map(async (url) => {
try { try {
return await download(url, sub.ua); return await download(
url,
sub.ua,
undefined,
sub.proxy,
);
} catch (err) { } catch (err) {
errors[url] = err; errors[url] = err;
$.error( $.error(

View File

@ -13,7 +13,7 @@ import $ from '@/core/app';
const tasks = new Map(); const tasks = new Map();
export default async function download(rawUrl, ua, timeout) { export default async function download(rawUrl, ua, timeout, proxy) {
let $arguments = {}; let $arguments = {};
let url = rawUrl.replace(/#noFlow$/, ''); let url = rawUrl.replace(/#noFlow$/, '');
const rawArgs = url.split('#'); const rawArgs = url.split('#');
@ -78,10 +78,15 @@ export default async function download(rawUrl, ua, timeout) {
result = cached; result = cached;
} else { } else {
$.info( $.info(
`Downloading...\nUser-Agent: ${userAgent}\nTimeout: ${requestTimeout}\nURL: ${url}`, `Downloading...\nUser-Agent: ${userAgent}\nTimeout: ${requestTimeout}\nProxy: ${proxy}\nURL: ${url}`,
); );
try { try {
const { body, headers } = await http.get(url); const { body, headers } = await http.get({
url,
proxy,
node: proxy,
'policy-descriptor': proxy,
});
if (headers) { if (headers) {
const flowInfo = getFlowField(headers); const flowInfo = getFlowField(headers);
@ -116,7 +121,11 @@ export default async function download(rawUrl, ua, timeout) {
// 检查订阅有效性 // 检查订阅有效性
if ($arguments?.validCheck) { if ($arguments?.validCheck) {
await validCheck(parseFlowHeaders(await getFlowHeaders(url))); await validCheck(
parseFlowHeaders(
await getFlowHeaders(url, undefined, undefined, proxy),
),
);
} }
if (!isNode) { if (!isNode) {

View File

@ -9,7 +9,7 @@ export function getFlowField(headers) {
)[0]; )[0];
return headers[subkey]; return headers[subkey];
} }
export async function getFlowHeaders(rawUrl, ua, timeout) { export async function getFlowHeaders(rawUrl, ua, timeout, proxy) {
let url = rawUrl; let url = rawUrl;
let $arguments = {}; let $arguments = {};
const rawArgs = url.split('#'); const rawArgs = url.split('#');
@ -57,6 +57,9 @@ export async function getFlowHeaders(rawUrl, ua, timeout) {
'User-Agent': userAgent, 'User-Agent': userAgent,
}, },
timeout: requestTimeout, timeout: requestTimeout,
proxy,
node: proxy,
'policy-descriptor': proxy,
}); });
flowInfo = getFlowField(headers); flowInfo = getFlowField(headers);
} catch (e) { } catch (e) {
@ -178,7 +181,7 @@ export function getRmainingDays(opt = {}) {
return daysDiff; return daysDiff;
} else { } else {
if (!resetDay) throw new Error('未提供月重置日 resetDay'); if (!resetDay) return;
resetDay = parseInt(resetDay); resetDay = parseInt(resetDay);
if (isNaN(resetDay) || resetDay <= 0 || resetDay > 31) if (isNaN(resetDay) || resetDay <= 0 || resetDay > 31)
throw new Error('月重置日应为 1-31 之间的整数'); throw new Error('月重置日应为 1-31 之间的整数');