2024-02-24 00:07:55 +08:00

164 lines
6.4 KiB
Python

import re
from datetime import datetime, timedelta, timezone
from shutil import copyfile
import requests
filterlist = {
'abp': ['experimental.txt', 'filter.txt', 'PureView/news.txt', 'PureView/news_mobile.txt'],
'hosts': ['hosts.txt', 'nofarm.txt', 'TW165.txt', 'TWNIC-RPZ.txt']
}
url = 'https://filter.futa.gg/'
tz = timezone(timedelta(hours=+8))
today = datetime.now(tz).date()
class HEAD:
abp: str = '[Adblock Plus]\n' \
'! Title: LowTechFilter {name}\n' \
'! Version: {version}\n' \
'! Expires: 1 hour\n' \
'! Homepage: https://t.me/AdBlock_TW\n' \
'! ----------------------------------------------------------------------\n'
hosts: str = '! FutaHosts\n' \
'! Title: LowTechFilter {name}\n' \
'! URL: <https://github.com/FutaGuard/LowTechFilter>\n' \
'! Version: {version}\n' \
'! --------------------------------------------------\n'
def update_version(filename: str) -> str:
pattern = r'(?<=Version: )(\d+\.\d+\.)(\d+)'
newversion = ''
r = requests.get(url + filename)
first = None
version = None
if r.status_code != 200:
pass
else:
first = '\n'.join(r.text.splitlines()[:5])
try:
version = re.findall(pattern, first, re.MULTILINE)[0]
except:
# https://www.ptt.cc/bbs/Battlegirlhs/M.1506615677.A.1A4.html
version = ('2017.0929.', '1')
dt = datetime.strptime(version[0], '%Y.%m%d.').date()
newversion = today.strftime('%Y.%m%d.')
if dt != today:
newversion += '1'
else:
newversion += str(int(version[1]) + 1)
return newversion
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)
# 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()))
# 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]
heads: str = HEAD().__getattribute__('abp')
newhead = heads.format(
name=name + ' domains',
version=newversion
)
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(newhead)
output.write(newoutput)
if filename in filterlist['hosts']:
to_pure_domain(filename, data)
# 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)
# 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)