diff --git a/build.py b/build.py index 07e71dc..fc0f967 100755 --- a/build.py +++ b/build.py @@ -8,14 +8,16 @@ from requests.exceptions import RequestException, HTTPError import gfwlist - -SOURCES = { +SOURCES_4 = { 'ipdeny.com': 'http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone', '17mon': 'https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt', } -SOURCES2 = { +SOURCES_6 = { 'gaoyifan': 'https://gaoyifan.github.io/china-operator-ip/china6.txt', } +SOURCES_46 = { + 'maxmind': 'https://github.com/v2fly/geoip/raw/release/text/cn.txt', +} OUT_DIR = "dist" # Stub content to disable GFWList check @@ -28,6 +30,8 @@ def fetch_and_convert(src): template = "var CHINA = [\n{}\n];\n" lines = [] for iprange in response.text.strip().split("\n"): + if iprange.find(":") != -1: + break ipnet = ipaddress.IPv4Network(iprange) netaddr = int(ipnet.network_address) netmask = int(ipnet.netmask) @@ -57,6 +61,8 @@ def fetch_and_convert_ip6(src): fixlen = len(f" [0xFFFFFFFF, -1, 0xFFFFFFFF],") for iprange in text.strip().split("\n"): + if iprange.find(":") == -1: + continue ipnet = ipaddress.IPv6Network(iprange) prefixlen = ipnet.prefixlen fulladdr = str(ipnet.exploded).replace(':', '') @@ -131,34 +137,62 @@ def main(): gfwlist_stub = GFWLIST_STUB os.makedirs(OUT_DIR, mode=0o755, exist_ok=True) - for key in SOURCES: - print(f"Generating PAC script from source {key}") + for key in SOURCES_4: + key_6 = list(SOURCES_6)[0] + print(f"Generating PAC script from source {key}(IPv4) & {key_6}(IPv6)") try: - data = fetch_and_convert(SOURCES[key]) - key2 = list(SOURCES2)[0] - data2 = fetch_and_convert_ip6(SOURCES2[key2]) + data = fetch_and_convert(SOURCES_4[key]) + data_6 = fetch_and_convert_ip6(SOURCES_6[key_6]) except RequestException: continue except HTTPError: continue - filename = f"pac-{key}-{key2}.txt" - filename_gfwlist = f"pac-gfwlist-{key}-{key2}.txt" + filename = f"pac-IPv4_{key}--IPv6_{key_6}.txt" + filename_gfwlist = f"pac-gfwlist-IPv4_{key}--IPv6_{key_6}.txt" with open(os.path.join(OUT_DIR, filename), "w") as f: f.write(code) f.write(data) f.write("\n") - f.write(data2) + f.write(data_6) f.write("\n") f.write(gfwlist_stub) with open(os.path.join(OUT_DIR, filename_gfwlist), "w") as f: f.write(code) f.write(data) f.write("\n") - f.write(data2) + f.write(data_6) + f.write("\n") + f.write(gfwlist_part) + + for key in SOURCES_46: + print(f"Generating PAC script from source {key}(IPv4v6)") + try: + data = fetch_and_convert(SOURCES_46[key]) + data_6 = fetch_and_convert_ip6(SOURCES_46[key]) + except RequestException: + continue + except HTTPError: + continue + + filename = f"pac-IPv4v6_{key}.txt" + filename_gfwlist = f"pac-gfwlist-IPv4v6_{key}.txt" + with open(os.path.join(OUT_DIR, filename), "w") as f: + f.write(code) + f.write(data) + f.write("\n") + f.write(data_6) + f.write("\n") + f.write(gfwlist_stub) + with open(os.path.join(OUT_DIR, filename_gfwlist), "w") as f: + f.write(code) + f.write(data) + f.write("\n") + f.write(data_6) f.write("\n") f.write(gfwlist_part) + if __name__ == '__main__': main() diff --git a/code.js b/code.js index 452761b..66f1d57 100644 --- a/code.js +++ b/code.js @@ -19,14 +19,14 @@ function binarySearch(list, num, lower, upper) { return x; } -function convertToInt6(high, low) { +function convertToUInt6(high, low) { var num1 = parseInt(high, 16) & 0xFFFF; var num2 = parseInt(low, 16) & 0xFFFF; return (((num1 << 16) | num2) >>> 0); } function isInNet6(parts, list, list2) { - var num = convertToInt6(parts[0], parts[1]); + var num = convertToUInt6(parts[0], parts[1]); var x = binarySearch(list, num, 0, list.length); if (list[x][1] == -1) @@ -36,7 +36,7 @@ function isInNet6(parts, list, list2) { if (num !== list[x][0]) return false; - var num2 = convertToInt6(parts[2], parts[3]); + var num2 = convertToUInt6(parts[2], parts[3]); var x2 = binarySearch(list2, num2, list[x][1], list[x][2] + 1); return (((num2 & list2[x2][1]) ^ list2[x2][0]) === 0); @@ -91,14 +91,14 @@ function isLanOrChina6(host) { return isInNet6(parts, CHINA6_F, CHINA6_S) || isInNet6(parts, LAN6_F, LAN6_S); } -function convertToInt(host) { +function convertToUInt(host) { var bytes = host.split("."); var result = ((bytes[0] & 0xFF) << 24) | ((bytes[1] & 0xFF) << 16) | ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF); return (result >>> 0); } function belongsToSubnet(host, list) { - var ip = convertToInt(host); + var ip = convertToUInt(host); if (list.length === 0 || ip < list[0][0]) return false;