diff --git a/AutoBuild/builder.py b/AutoBuild/builder.py index fbb4680..87f5dec 100644 --- a/AutoBuild/builder.py +++ b/AutoBuild/builder.py @@ -2,6 +2,8 @@ import re from datetime import datetime, timedelta, timezone import requests from glob import glob +import asyncio +import time filterlist = { "abp": [ @@ -16,9 +18,8 @@ url = "https://filter.futa.gg/" tz = timezone(timedelta(hours=+8)) today = datetime.now(tz).date() - # 新增 nrd 清單 -for files in glob("nrd/past-*.txt"): +for files in glob("AutoBuild/nrd/past-*.txt"): filterlist["hosts"].append(files) @@ -67,110 +68,115 @@ def update_version(filename: str) -> str: return newversion -for category in filterlist: - for filename in filterlist[category]: - newversion = update_version(filename) +# make hosts formats +async def to_hosts(filename: str, data: str, newversion: str): + data = data.splitlines() + newdata = "\n".join(data) + name = filename.split(".txt")[0].split("_")[0] + heads: str = HEAD().__getattribute__("hosts") + newhead = heads.format(name=name + " hosts", version=newversion) + newfilename = name + "_hosts.txt" if name != "hosts" else "hosts.txt" + with open(newfilename, "w") as output: + if name == "hosts": + pattern = r"(?<=^\|\|)\S+\.\S{2,}(?=\^)" + newoutput = "\n".join( + "0.0.0.0 " + e for e in re.findall(pattern, newdata, re.MULTILINE) + ) + else: + newoutput = "\n".join("0.0.0.0 " + e for e in data) + output.write(newhead) + output.write(newoutput) - with open(f"{filename}", "r") as files: - data = files.read() - with open(f"{filename}", "w") as output: - heads: str = HEAD().__getattribute__(category) - newhead = heads.format( - name=filename.split(".")[0] - .replace("_", " ") - .replace("/", " ") - .title(), - version=newversion, - ) - output.write(newhead + data) - # hide farm site from google 轉換 abp - if filename == "nofarm.txt": - domain_list = "" - for domains in data.splitlines(): - if not domains.startswith("!"): - domain = domains[2:-1] - domain_list += 'google.*##div.g:has(div[data-hveid] a[href*="{domain}"])\n'.format( - domain=domain - ) - heads: str = HEAD().__getattribute__("abp") - newhead = heads.format( - name="hide farm content from google", version=newversion - ) - with open("hide_farm_from_search.txt", "w") as f: - f.write(newhead + domain_list) +async def to_abp(filename: str, data: str, newversion: str): + data = data.splitlines() + newdata = "\n".join(data) + name = filename.split(".txt")[0].split("_")[0] + heads: str = HEAD().__getattribute__("abp") + newhead = heads.format(name=name + " abp", version=newversion) - if filename == "TW165.txt": - newfilename = "TW165-redirect.txt" - heads: str = HEAD().__getattribute__("abp") - newhead = heads.format(name="TW165 redirect", version=newversion) - with open(newfilename, "w") as f: - f.write(newhead) - f.write( - "".join( - f"||{e}^$dnsrewrite=NOERROR;A;34.102.218.71\n" - for e in data.splitlines() - ) + with open(name + "_abp.txt", "w") as output: + if name == "hosts": + output.write(newhead + newdata) + + else: + newoutput = "\n".join(f"||{e}^" for e in data) + output.write(newhead) + output.write(newoutput) + + +async def to_pure_domain(filename: str, data: str): + data = data.splitlines() + newdata = "\n".join(data) + name = filename.split(".txt")[0].split("_")[0] + with open(name + "_domains.txt", "w") as output: + if name == "hosts": + pattern = r"(?<=^\|\|)\S+\.\S{2,}(?=\^)" + newoutput = "\n".join(re.findall(pattern, newdata, re.MULTILINE)) + else: + newoutput = "\n".join(data) + output.write(newoutput) + + +async def run(): + import time + # task = [] + + for category in filterlist: + for filename in filterlist[category]: + newversion = update_version(filename) + + with open(f"{filename}", "r") as files: + data = files.read() + with open(f"{filename}", "w") as output: + heads: str = HEAD().__getattribute__(category) + newhead = heads.format( + name=filename.split(".")[0] + .replace("_", " ") + .replace("/", " ") + .title(), + version=newversion, ) + output.write(newhead + data) - # hosts to domains - def to_pure_domain(filename: str, data: str): - data = data.splitlines() - newdata = "\n".join(data) - name = filename.split(".txt")[0].split("_")[0] - with open(name + "_domains.txt", "w") as output: - if name == "hosts": - pattern = r"(?<=^\|\|)\S+\.\S{2,}(?=\^)" - newoutput = "\n".join( - re.findall(pattern, newdata, re.MULTILINE) + # hide farm site from google 轉換 abp + if filename == "nofarm.txt": + domain_list = "" + for domains in data.splitlines(): + if not domains.startswith("!"): + domain = domains[2:-1] + domain_list += 'google.*##div.g:has(div[data-hveid] a[href*="{domain}"])\n'.format( + domain=domain + ) + heads: str = HEAD().__getattribute__("abp") + newhead = heads.format( + name="hide farm content from google", version=newversion + ) + with open("hide_farm_from_search.txt", "w") as f: + f.write(newhead + domain_list) + + if filename == "TW165.txt": + newfilename = "TW165-redirect.txt" + heads: str = HEAD().__getattribute__("abp") + newhead = heads.format(name="TW165 redirect", version=newversion) + with open(newfilename, "w") as f: + f.write(newhead) + f.write( + "".join( + f"||{e}^$dnsrewrite=NOERROR;A;34.102.218.71\n" + for e in data.splitlines() + ) ) - else: - newoutput = "\n".join(data) - output.write(newoutput) - if filename in filterlist["hosts"]: - to_pure_domain(filename, data) + if category == "hosts": + task = [ + asyncio.create_task(to_pure_domain(filename, data)), + asyncio.create_task(to_abp(filename, data, newversion)), + asyncio.create_task(to_hosts(filename, data, newversion)), + ] - # make hosts formats - def to_hosts(filename: str, data: str): - data = data.splitlines() - newdata = "\n".join(data) - name = filename.split(".txt")[0].split("_")[0] - heads: str = HEAD().__getattribute__("hosts") - newhead = heads.format(name=name + " hosts", version=newversion) - newfilename = name + "_hosts.txt" if name != "hosts" else "hosts.txt" - with open(newfilename, "w") as output: - if name == "hosts": - pattern = r"(?<=^\|\|)\S+\.\S{2,}(?=\^)" - newoutput = "\n".join( - "0.0.0.0 " + e - for e in re.findall(pattern, newdata, re.MULTILINE) - ) - else: - newoutput = "\n".join("0.0.0.0 " + e for e in data) - output.write(newhead) - output.write(newoutput) + await asyncio.gather(*task) - # if filename in filterlist['hosts']: - # to_hosts(filename, data) - # 轉換為 abp 格式 - def to_abp(filename: str, data: str): - data = data.splitlines() - newdata = "\n".join(data) - name = filename.split(".txt")[0].split("_")[0] - heads: str = HEAD().__getattribute__("abp") - newhead = heads.format(name=name + " abp", version=newversion) - - with open(name + "_abp.txt", "w") as output: - if name == "hosts": - output.write(newhead + newdata) - - else: - newoutput = "\n".join(f"||{e}^" for e in data) - output.write(newhead) - output.write(newoutput) - - if filename in filterlist["hosts"]: - to_abp(filename, data) - to_hosts(filename, data) +if __name__ == "__main__": + asyncio.run(run())