mirror of
https://github.com/SukkaW/Surge.git
synced 2025-12-12 01:00:34 +08:00
Collect speedtest.net endpoint
This commit is contained in:
parent
ae5eb475dd
commit
792fbeda3d
1
.gitignore
vendored
1
.gitignore
vendored
@ -9,6 +9,7 @@ List/domainset/cdn.conf
|
|||||||
List/domainset/reject_phishing.conf
|
List/domainset/reject_phishing.conf
|
||||||
List/domainset/reject_sukka.conf
|
List/domainset/reject_sukka.conf
|
||||||
List/domainset/apple_cdn.conf
|
List/domainset/apple_cdn.conf
|
||||||
|
List/domainset/speedtest.conf
|
||||||
List/non_ip/cdn.conf
|
List/non_ip/cdn.conf
|
||||||
List/non_ip/apple_cdn.conf
|
List/non_ip/apple_cdn.conf
|
||||||
List/ip/telegram.conf
|
List/ip/telegram.conf
|
||||||
|
|||||||
117
Build/build-speedtest-domainset.js
Normal file
117
Build/build-speedtest-domainset.js
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
const { fetch } = require('undici');
|
||||||
|
const { domainDeduper } = require('./lib/domain-deduper');
|
||||||
|
const path = require('path');
|
||||||
|
const { withBannerArray } = require('./lib/with-banner.js');
|
||||||
|
const { compareAndWriteFile } = require('./lib/string-array-compare');
|
||||||
|
|
||||||
|
const { Sema } = require('async-sema');
|
||||||
|
const s = new Sema(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} keyword
|
||||||
|
* @returns {string[]}
|
||||||
|
*/
|
||||||
|
const querySpeedtestApi = async (keyword) => {
|
||||||
|
await s.acquire();
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(`https://www.speedtest.net/api/js/servers?engine=js&search=${keyword}&limit=100`, {
|
||||||
|
headers: {
|
||||||
|
dnt: '1',
|
||||||
|
Referer: 'https://www.speedtest.net/',
|
||||||
|
accept: 'application/json, text/plain, */*',
|
||||||
|
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
|
||||||
|
'Accept-Language': 'en-US,en;q=0.9',
|
||||||
|
'Sec-Ch-Ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"',
|
||||||
|
'Sec-Ch-Ua-Mobile': '?0',
|
||||||
|
'Sec-Fetch-Dest': 'empty',
|
||||||
|
'Sec-Fetch-Mode': 'cors',
|
||||||
|
'Sec-Fetch-Site': 'same-origin',
|
||||||
|
'Sec-Gpc': '1'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (!res.ok) {
|
||||||
|
const text = await res.text();
|
||||||
|
throw new Error(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @type {{ url: string }[]} */
|
||||||
|
const json = await res.json();
|
||||||
|
s.release();
|
||||||
|
return json.map(({ url }) => new URL(url).hostname);
|
||||||
|
} catch (e) {
|
||||||
|
s.release();
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
(async () => {
|
||||||
|
/** @type {Set<string>} */
|
||||||
|
const domains = new Set([
|
||||||
|
'.speedtest.net',
|
||||||
|
'.ooklaserver.net',
|
||||||
|
'.speed.misaka.one',
|
||||||
|
'speed.cloudflare.com',
|
||||||
|
'.speedtest.rt.ru',
|
||||||
|
'.speedtest.aptg.com.tw',
|
||||||
|
'.speedtest.gslnetworks.com',
|
||||||
|
'.speedtest.jsinfo.net',
|
||||||
|
'.speedtest.i3d.net',
|
||||||
|
'.speedtestkorea.com'
|
||||||
|
]);
|
||||||
|
|
||||||
|
const hostnameGroups = await Promise.all([
|
||||||
|
'Hong Kong',
|
||||||
|
'Taiwan',
|
||||||
|
'China Telecom',
|
||||||
|
'China Mobile',
|
||||||
|
'China Unicom',
|
||||||
|
'Japan',
|
||||||
|
'Tokyo',
|
||||||
|
'Singapore',
|
||||||
|
'Korea',
|
||||||
|
'Canada',
|
||||||
|
'Toronto',
|
||||||
|
'Montreal',
|
||||||
|
'Los Ang',
|
||||||
|
'San Jos',
|
||||||
|
'Seattle',
|
||||||
|
'New York',
|
||||||
|
'Dallas',
|
||||||
|
'Miami',
|
||||||
|
'Berlin',
|
||||||
|
'Frankfurt',
|
||||||
|
'London',
|
||||||
|
'Paris',
|
||||||
|
'Amsterdam',
|
||||||
|
'Moscow',
|
||||||
|
'Australia',
|
||||||
|
'Sydney',
|
||||||
|
'Brazil',
|
||||||
|
'Turkey'
|
||||||
|
].map(querySpeedtestApi));
|
||||||
|
|
||||||
|
for (const hostnames of hostnameGroups) {
|
||||||
|
if (Array.isArray(hostnames)) {
|
||||||
|
for (const hostname of hostnames) {
|
||||||
|
domains.add(hostname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const reduped = domainDeduper(Array.from(domains)).sort();
|
||||||
|
|
||||||
|
await compareAndWriteFile(
|
||||||
|
withBannerArray(
|
||||||
|
'Sukka\'s Surge Rules - Speedtest Domains',
|
||||||
|
[
|
||||||
|
'License: AGPL 3.0',
|
||||||
|
'Homepage: https://ruleset.skk.moe',
|
||||||
|
'GitHub: https://github.com/SukkaW/Surge'
|
||||||
|
],
|
||||||
|
new Date(),
|
||||||
|
reduped
|
||||||
|
),
|
||||||
|
path.resolve(__dirname, '../List/domainset/speedtest.conf')
|
||||||
|
);
|
||||||
|
})();
|
||||||
@ -46,11 +46,16 @@ const fileExists = (path) => {
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
await Promise.all(filesList.map(p => fse.copy(
|
await Promise.all(filesList.map(async p => {
|
||||||
join(extractedPath, 'Surge-gh-pages', p),
|
const src = join(extractedPath, 'Surge-gh-pages', p);
|
||||||
|
if (await fileExists(src)) {
|
||||||
|
return fse.copy(
|
||||||
|
src,
|
||||||
join(__dirname, '..', p),
|
join(__dirname, '..', p),
|
||||||
{ overwrite: true }
|
{ overwrite: true }
|
||||||
)));
|
);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
await fs.promises.unlink(extractedPath).catch(() => { });
|
await fs.promises.unlink(extractedPath).catch(() => { });
|
||||||
})();
|
})();
|
||||||
|
|||||||
@ -1,11 +1,13 @@
|
|||||||
// @ts-check
|
// @ts-check
|
||||||
const { promises: fsPromises } = require('fs');
|
const { promises: fsPromises } = require('fs');
|
||||||
|
const fse = require('fs-extra');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string[]} linesA
|
* @param {string[]} linesA
|
||||||
* @param {string} filePath
|
* @param {string} filePath
|
||||||
*/
|
*/
|
||||||
async function compareAndWriteFile(linesA, filePath) {
|
async function compareAndWriteFile(linesA, filePath) {
|
||||||
|
await fse.ensureFile(filePath);
|
||||||
const linesB = (await fsPromises.readFile(filePath, { encoding: 'utf-8' })).split('\n');
|
const linesB = (await fsPromises.readFile(filePath, { encoding: 'utf-8' })).split('\n');
|
||||||
|
|
||||||
if (!stringArrayCompare(linesA, linesB)) {
|
if (!stringArrayCompare(linesA, linesB)) {
|
||||||
|
|||||||
@ -1,8 +1 @@
|
|||||||
DOMAIN-SUFFIX,speedtest.net
|
# Deprecated
|
||||||
DOMAIN-SUFFIX,speed.misaka.one
|
|
||||||
DOMAIN-SUFFIX,speedtest.i3d.net
|
|
||||||
DOMAIN-SUFFIX,lg-hkg.fdcservers.net
|
|
||||||
DOMAIN-SUFFIX,speed.cloudflare.com
|
|
||||||
DOMAIN-SUFFIX,ooklaserver.net
|
|
||||||
DOMAIN-SUFFIX,speedtestbb.hk.chinamobile.com
|
|
||||||
DOMAIN-SUFFIX,ookla-speedtest-central.hgconair.hgc.com.hk
|
|
||||||
|
|||||||
12
package.json
12
package.json
@ -14,6 +14,7 @@
|
|||||||
"build:phishing-domainset": "wireit",
|
"build:phishing-domainset": "wireit",
|
||||||
"build:telegram-cidr": "wireit",
|
"build:telegram-cidr": "wireit",
|
||||||
"build:chn-cidr": "wireit",
|
"build:chn-cidr": "wireit",
|
||||||
|
"build:speedtest-domainset": "wireit",
|
||||||
"build:internal-cdn-rules": "wireit",
|
"build:internal-cdn-rules": "wireit",
|
||||||
"build:internal-reverse-chn-cidr": "wireit",
|
"build:internal-reverse-chn-cidr": "wireit",
|
||||||
"build:internal-chn-domains": "wireit",
|
"build:internal-chn-domains": "wireit",
|
||||||
@ -66,6 +67,12 @@
|
|||||||
"download-previous-build"
|
"download-previous-build"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"build:speedtest-domainset": {
|
||||||
|
"command": "node ./Build/build-speedtest-domainset.js",
|
||||||
|
"dependencies": [
|
||||||
|
"download-previous-build"
|
||||||
|
]
|
||||||
|
},
|
||||||
"build:internal-cdn-rules": {
|
"build:internal-cdn-rules": {
|
||||||
"command": "node ./Build/build-internal-cdn-rules.js",
|
"command": "node ./Build/build-internal-cdn-rules.js",
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
@ -88,7 +95,8 @@
|
|||||||
"build:internal-reverse-chn-cidr",
|
"build:internal-reverse-chn-cidr",
|
||||||
"build:internal-chn-domains",
|
"build:internal-chn-domains",
|
||||||
"build:reject-domainset",
|
"build:reject-domainset",
|
||||||
"build:telegram-cidr"
|
"build:telegram-cidr",
|
||||||
|
"build:speedtest-domainset"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"validate:domainset": {
|
"validate:domainset": {
|
||||||
@ -111,6 +119,7 @@
|
|||||||
"build:internal-cdn-rules",
|
"build:internal-cdn-rules",
|
||||||
"build:internal-reverse-chn-cidr",
|
"build:internal-reverse-chn-cidr",
|
||||||
"build:internal-chn-domains",
|
"build:internal-chn-domains",
|
||||||
|
"build:speedtest-domainset",
|
||||||
"build:public",
|
"build:public",
|
||||||
"validate:domainset"
|
"validate:domainset"
|
||||||
]
|
]
|
||||||
@ -126,6 +135,7 @@
|
|||||||
"@cliqz/adblocker": "^1.26.6",
|
"@cliqz/adblocker": "^1.26.6",
|
||||||
"@sukka/listdir": "^0.2.0",
|
"@sukka/listdir": "^0.2.0",
|
||||||
"@vercel/fetch-retry": "^5.1.3",
|
"@vercel/fetch-retry": "^5.1.3",
|
||||||
|
"async-sema": "^3.1.1",
|
||||||
"ci-info": "^3.8.0",
|
"ci-info": "^3.8.0",
|
||||||
"cidr-tools-wasm": "^0.0.11",
|
"cidr-tools-wasm": "^0.0.11",
|
||||||
"fs-extra": "^11.1.1",
|
"fs-extra": "^11.1.1",
|
||||||
|
|||||||
7
pnpm-lock.yaml
generated
7
pnpm-lock.yaml
generated
@ -19,6 +19,9 @@ dependencies:
|
|||||||
'@vercel/fetch-retry':
|
'@vercel/fetch-retry':
|
||||||
specifier: ^5.1.3
|
specifier: ^5.1.3
|
||||||
version: 5.1.3(patch_hash=jczsp2gadg65vd4ekschpibzda)(node-fetch@2.6.11)
|
version: 5.1.3(patch_hash=jczsp2gadg65vd4ekschpibzda)(node-fetch@2.6.11)
|
||||||
|
async-sema:
|
||||||
|
specifier: ^3.1.1
|
||||||
|
version: 3.1.1
|
||||||
ci-info:
|
ci-info:
|
||||||
specifier: ^3.8.0
|
specifier: ^3.8.0
|
||||||
version: 3.8.0
|
version: 3.8.0
|
||||||
@ -333,6 +336,10 @@ packages:
|
|||||||
retry: 0.13.1
|
retry: 0.13.1
|
||||||
dev: false
|
dev: false
|
||||||
|
|
||||||
|
/async-sema@3.1.1:
|
||||||
|
resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==}
|
||||||
|
dev: false
|
||||||
|
|
||||||
/balanced-match@1.0.2:
|
/balanced-match@1.0.2:
|
||||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user