From 9962eb0947e9503ae2110b343a0c11ce7540fd76 Mon Sep 17 00:00:00 2001 From: Eric Moore Date: Mon, 22 Apr 2024 12:59:06 +0800 Subject: [PATCH] feat: script ip-flag for node --- scripts/ip-flag-node.js | 79 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 scripts/ip-flag-node.js diff --git a/scripts/ip-flag-node.js b/scripts/ip-flag-node.js new file mode 100644 index 0000000..650ded1 --- /dev/null +++ b/scripts/ip-flag-node.js @@ -0,0 +1,79 @@ +const $ = $substore; + +const {onlyFlagIP = true} = $arguments + +async function operator(proxies) { + const BATCH_SIZE = 10; + + let i = 0; + while (i < proxies.length) { + const batch = proxies.slice(i, i + BATCH_SIZE); + await Promise.all(batch.map(async proxy => { + if (onlyFlagIP && !ProxyUtils.isIP(proxy.server)) return; + try { + // remove the original flag + let proxyName = removeFlag(proxy.name); + + // query ip-api + const countryCode = await queryIpApi(proxy); + + proxyName = getFlagEmoji(countryCode) + ' ' + proxyName; + proxy.name = proxyName; + } catch (err) { + // TODO: + } + })); + + await sleep(1000); + i += BATCH_SIZE; + } + return proxies; +} + + +async function queryIpApi(proxy) { + const ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:78.0) Gecko/20100101 Firefox/78.0"; + const headers = { + "User-Agent": ua + }; + const result = new Promise((resolve, reject) => { + const url = + `http://ip-api.com/json/${encodeURIComponent(proxy.server)}?lang=zh-CN`; + $.http.get({ + url, + headers, + }).then(resp => { + const data = JSON.parse(resp.body); + if (data.status === "success") { + resolve(data.countryCode); + } else { + reject(new Error(data.message)); + } + }).catch(err => { + console.log(err); + reject(err); + }); + }); + return result; +} + +function getFlagEmoji(countryCode) { + const codePoints = countryCode + .toUpperCase() + .split('') + .map(char => 127397 + char.charCodeAt()); + return String + .fromCodePoint(...codePoints) + .replace(/🇹🇼/g, '🇨🇳'); +} + +function removeFlag(str) { + return str + .replace(/[\uD83C][\uDDE6-\uDDFF][\uD83C][\uDDE6-\uDDFF]/g, '') + .trim(); +} + +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} +