Redirect + trackers + php upload api + binary tree search + uuids
This commit is contained in:
95
api/v1/contribute/index.php
Normal file
95
api/v1/contribute/index.php
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
<?php
|
||||||
|
$proj_root = dirname(dirname(dirname(__DIR__)));
|
||||||
|
|
||||||
|
function is_valid_bundle($bundle_id) {
|
||||||
|
return preg_match('/^[A-Za-z0-9\.\-]{1,155}$/', $bundle_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
function normalize_bundle($bundle_id) {
|
||||||
|
$valid = is_valid_bundle($bundle_id);
|
||||||
|
return [$valid ? $bundle_id : '_manually', $valid];
|
||||||
|
}
|
||||||
|
|
||||||
|
function path_for($parts) { return implode(DIRECTORY_SEPARATOR, $parts); }
|
||||||
|
|
||||||
|
function mark_needs_update($norm_bundle) {
|
||||||
|
global $proj_root;
|
||||||
|
$pth = path_for([$proj_root, 'data', '_in']);
|
||||||
|
@mkdir($pth, 0755, true);
|
||||||
|
file_put_contents(path_for([$pth, 'in_'.$norm_bundle]), '.');
|
||||||
|
}
|
||||||
|
|
||||||
|
function random_filename($norm_bundle) {
|
||||||
|
global $proj_root;
|
||||||
|
$dir = path_for(array_merge([$proj_root, 'data'], explode('.', $norm_bundle)));
|
||||||
|
@mkdir($dir, 0755, true);
|
||||||
|
do {
|
||||||
|
$key = '';
|
||||||
|
$keys = array_merge(range(0, 9), range('a', 'z'));
|
||||||
|
for ($i = 0; $i < 48; $i++) {
|
||||||
|
$key .= $keys[array_rand($keys)];
|
||||||
|
}
|
||||||
|
$full = path_for([$dir, "id_$key.json"]);
|
||||||
|
} while (file_exists($full));
|
||||||
|
return [$full, $key];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate response
|
||||||
|
|
||||||
|
function make_output($msg, $url=null, $when=null, $key=null) {
|
||||||
|
$obj = [ 'v' => 1, 'status' => $msg ];
|
||||||
|
if ($url) {
|
||||||
|
$obj['url'] = $url;
|
||||||
|
if ($when) {
|
||||||
|
$obj['when'] = $when; # date('Y-m-d H:i:s', )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($key) { $obj['key'] = $key; }
|
||||||
|
echo json_encode($obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
function response_success($bundle_id, $key) {
|
||||||
|
# check valid bundle id, same regex as in `common_lib.py`
|
||||||
|
if ($bundle_id) {
|
||||||
|
$url = 'https://appchk.de/app/'.$bundle_id.'/index.html';
|
||||||
|
}
|
||||||
|
# next update will be in ... X seconds (up to 1 min)
|
||||||
|
make_output('ok', $url, ceil(time()/120)*120 - time(), $key);
|
||||||
|
}
|
||||||
|
|
||||||
|
function response_fail($error) {
|
||||||
|
http_response_code(400);
|
||||||
|
make_output($error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// MAIN
|
||||||
|
|
||||||
|
$err = null;
|
||||||
|
$content = file_get_contents('php://input');
|
||||||
|
// OR: disable json check and store file immediately?
|
||||||
|
$json = json_decode($content);
|
||||||
|
if ($json->v == 1
|
||||||
|
&& $json->duration > 0
|
||||||
|
&& !is_null($json->{'app-bundle'})
|
||||||
|
&& !is_null($json->logs))
|
||||||
|
{
|
||||||
|
[$bundle_id, $valid] = normalize_bundle($json->{'app-bundle'});
|
||||||
|
[$filename, $key] = random_filename($bundle_id);
|
||||||
|
$fp = @fopen($filename, 'w');
|
||||||
|
if ($fp) {
|
||||||
|
@fwrite($fp, $content);
|
||||||
|
@fclose($fp);
|
||||||
|
mark_needs_update($bundle_id);
|
||||||
|
} else {
|
||||||
|
$err = 'could not save.';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$err = 'wrong json format.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($err) {
|
||||||
|
response_fail($err);
|
||||||
|
} else {
|
||||||
|
response_success($valid ? $bundle_id : null, $key);
|
||||||
|
}
|
||||||
|
?>
|
||||||
@@ -17,7 +17,7 @@ header, main, footer > div {
|
|||||||
max-width: 1120px; /*1307px*/
|
max-width: 1120px; /*1307px*/
|
||||||
}
|
}
|
||||||
header { height: 50px; }
|
header { height: 50px; }
|
||||||
header img { vertical-align: top; padding-right: 7px; }
|
header img { vertical-align: top; padding: 0 7px; }
|
||||||
header h1 {
|
header h1 {
|
||||||
line-height: 50px;
|
line-height: 50px;
|
||||||
font-family: "Raleway", sans-serif;
|
font-family: "Raleway", sans-serif;
|
||||||
@@ -69,10 +69,11 @@ td { padding: 0.2em 1em 0.2em 0.1em; }
|
|||||||
#app-toc div {
|
#app-toc div {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 140px;
|
width: 140px;
|
||||||
|
height: 12em;
|
||||||
|
overflow: hidden;
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
padding: 16px;
|
padding: 16px;
|
||||||
vertical-align: top;
|
vertical-align: top;
|
||||||
height: min-content;
|
|
||||||
background: #eee;
|
background: #eee;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
border: 1pt solid #ccc;
|
border: 1pt solid #ccc;
|
||||||
@@ -83,7 +84,7 @@ td { padding: 0.2em 1em 0.2em 0.1em; }
|
|||||||
margin: 0.5em auto 1em;
|
margin: 0.5em auto 1em;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
#app-toc img, #get-appcheck img {
|
#app-toc img, #get-appcheck img, #appicon {
|
||||||
border-radius: 21.5%;
|
border-radius: 21.5%;
|
||||||
border: 0.7px solid #ccc;
|
border: 0.7px solid #ccc;
|
||||||
}
|
}
|
||||||
@@ -94,6 +95,9 @@ td { padding: 0.2em 1em 0.2em 0.1em; }
|
|||||||
#pagination a { margin: 0.5em; padding: 0.2em }
|
#pagination a { margin: 0.5em; padding: 0.2em }
|
||||||
#pagination a.active { border: 1pt solid black; border-radius: 0.2em; }
|
#pagination a.active { border: 1pt solid black; border-radius: 0.2em; }
|
||||||
|
|
||||||
|
@media(min-width: 647px) {
|
||||||
|
#meta #appicon { float: right; }
|
||||||
|
}
|
||||||
#meta td:nth-child(2) { font-weight: bold }
|
#meta td:nth-child(2) { font-weight: bold }
|
||||||
#connections i {
|
#connections i {
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
@@ -106,4 +110,6 @@ td { padding: 0.2em 1em 0.2em 0.1em; }
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin: 0.12em;
|
margin: 0.12em;
|
||||||
}
|
}
|
||||||
|
#connections i.bad { border-color: red; }
|
||||||
|
#connections td { vertical-align: top; }
|
||||||
#connections figure { display: inline-block; }
|
#connections figure { display: inline-block; }
|
||||||
|
|||||||
@@ -2,22 +2,24 @@
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
import common_lib as mylib
|
import common_lib as mylib
|
||||||
|
import tracker_download as tracker
|
||||||
|
|
||||||
|
|
||||||
with open(mylib.path_root('src', '3rd-domains.txt'), 'r') as fp:
|
level3_doms = None
|
||||||
level3_doms = set([x.strip() for x in fp.readlines()])
|
|
||||||
|
|
||||||
|
|
||||||
def dom_in_3rd_domain(needle):
|
def dom_in_3rd_domain(needle):
|
||||||
# TODO: binary tree lookup
|
global level3_doms
|
||||||
return needle in level3_doms
|
if not level3_doms:
|
||||||
|
level3_doms = mylib.read_list('3rd-domains.txt')
|
||||||
|
return mylib.bintree_lookup(level3_doms, needle)
|
||||||
|
|
||||||
|
|
||||||
def get_parent_domain(subdomain):
|
def get_parent_domain(subdomain):
|
||||||
parts = subdomain.split('.')
|
parts = subdomain.split('.')
|
||||||
if len(parts) < 3:
|
if len(parts) < 3:
|
||||||
return x
|
return subdomain
|
||||||
elif dom_in_3rd_domain('.'.join(parts[-2:])):
|
elif dom_in_3rd_domain(parts[-1] + '.' + parts[-2]):
|
||||||
return '.'.join(parts[-3:])
|
return '.'.join(parts[-3:])
|
||||||
else:
|
else:
|
||||||
return '.'.join(parts[-2:])
|
return '.'.join(parts[-2:])
|
||||||
@@ -46,6 +48,7 @@ def json_combine(bundle_id):
|
|||||||
uniq_par = set()
|
uniq_par = set()
|
||||||
for subdomain in logs:
|
for subdomain in logs:
|
||||||
occurs = len(logs[subdomain])
|
occurs = len(logs[subdomain])
|
||||||
|
sub_tracker = tracker.is_tracker(subdomain)
|
||||||
dict_increment(res, '#logs', occurs)
|
dict_increment(res, '#logs', occurs)
|
||||||
dict_increment(domA, subdomain, 1)
|
dict_increment(domA, subdomain, 1)
|
||||||
dict_increment(domB, subdomain, occurs)
|
dict_increment(domB, subdomain, occurs)
|
||||||
@@ -60,17 +63,40 @@ def json_combine(bundle_id):
|
|||||||
res['uniq_pardom'] = domC
|
res['uniq_pardom'] = domC
|
||||||
res['total_subdom'] = domB
|
res['total_subdom'] = domB
|
||||||
res['total_pardom'] = domD
|
res['total_pardom'] = domD
|
||||||
|
sub_tracker = dict()
|
||||||
|
par_tracker = dict()
|
||||||
|
for x in domA:
|
||||||
|
sub_tracker[x] = tracker.is_tracker(x)
|
||||||
|
for x in domC:
|
||||||
|
par_tracker[x] = tracker.is_tracker(x)
|
||||||
|
res['tracker_subdom'] = sub_tracker
|
||||||
|
res['tracker_pardom'] = par_tracker
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
def process(bundle_ids):
|
def process(bundle_ids, where=None):
|
||||||
print('writing combined json ...')
|
print('writing combined json ...')
|
||||||
if bundle_ids == ['*']:
|
if bundle_ids == ['*']:
|
||||||
bundle_ids = list(mylib.enum_appids())
|
bundle_ids = list(mylib.enum_data_appids())
|
||||||
|
|
||||||
|
affected_ids = []
|
||||||
|
haystack = sorted([x[::-1] for x in where]) if where else None
|
||||||
for bid in bundle_ids:
|
for bid in bundle_ids:
|
||||||
print(' ' + bid)
|
obj = json_combine(bid)
|
||||||
mylib.json_write_combined(bid, json_combine(bid))
|
should_update = False
|
||||||
|
if not haystack:
|
||||||
|
should_update = True
|
||||||
|
else:
|
||||||
|
for x in obj['uniq_subdom']:
|
||||||
|
if mylib.bintree_lookup(haystack, x[::-1]):
|
||||||
|
should_update = True
|
||||||
|
break
|
||||||
|
if should_update:
|
||||||
|
print(' ' + bid)
|
||||||
|
mylib.json_write_combined(bid, obj)
|
||||||
|
affected_ids.append(bid)
|
||||||
print('')
|
print('')
|
||||||
|
return affected_ids
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
@@ -27,10 +27,27 @@ def download_icon(bundle_id, force=False, langs=['us', 'de']):
|
|||||||
json = None
|
json = None
|
||||||
for lang in langs:
|
for lang in langs:
|
||||||
if not json:
|
if not json:
|
||||||
json = mylib.json_read_meta(bundle_id, lang)
|
try:
|
||||||
|
json = mylib.json_read_meta(bundle_id, lang)
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
mylib.download_file(json['artworkUrl100'], icon_file)
|
mylib.download_file(json['artworkUrl100'], icon_file)
|
||||||
|
|
||||||
|
|
||||||
|
def download_missing_icons(force=False, langs=['us', 'de']):
|
||||||
|
didAny = False
|
||||||
|
for bid in mylib.enum_appids():
|
||||||
|
if not mylib.file_exists(mylib.path_out_app(bid, 'icon.png')):
|
||||||
|
if not didAny:
|
||||||
|
print('downloading missing icons ...')
|
||||||
|
didAny = True
|
||||||
|
print(' ' + bid)
|
||||||
|
download_icon(bid, force=force, langs=langs)
|
||||||
|
if didAny:
|
||||||
|
print('')
|
||||||
|
return didAny
|
||||||
|
|
||||||
|
|
||||||
def download(bundle_id, force=False):
|
def download(bundle_id, force=False):
|
||||||
if not mylib.valid_bundle_id(bundle_id):
|
if not mylib.valid_bundle_id(bundle_id):
|
||||||
mylib.err('apple-download', 'invalid id: ' + bundle_id)
|
mylib.err('apple-download', 'invalid id: ' + bundle_id)
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
import os
|
|
||||||
import common_lib as mylib
|
|
||||||
|
|
||||||
|
|
||||||
def next_path(path_pattern):
|
|
||||||
i = 1
|
|
||||||
while os.path.exists(path_pattern % i):
|
|
||||||
i = i * 2
|
|
||||||
a, b = (i // 2, i)
|
|
||||||
while a + 1 < b:
|
|
||||||
c = (a + b) // 2 # interval midpoint
|
|
||||||
a, b = (c, b) if os.path.exists(path_pattern % c) else (a, c)
|
|
||||||
return path_pattern % b
|
|
||||||
|
|
||||||
|
|
||||||
def process():
|
|
||||||
print('checking incoming files ...')
|
|
||||||
prefix = mylib.path_len(mylib.path_data())
|
|
||||||
needs_update = set()
|
|
||||||
for fname, jdata in mylib.enum_newly_added():
|
|
||||||
try:
|
|
||||||
bundle_id = jdata['app-bundle'].strip()
|
|
||||||
if mylib.valid_bundle_id(bundle_id):
|
|
||||||
dest = mylib.path_data_app(bundle_id)
|
|
||||||
needs_update.add(bundle_id)
|
|
||||||
else:
|
|
||||||
dest = mylib.path_data('_manually')
|
|
||||||
# needs_update.add('_manually')
|
|
||||||
|
|
||||||
mylib.mkdir(dest)
|
|
||||||
dest_file = next_path(mylib.path_add(dest, 'id_%s.json'))
|
|
||||||
mylib.mv(fname, dest_file, printOmitPrefix=prefix)
|
|
||||||
except KeyError:
|
|
||||||
mylib.err('json-import', 'malformed json: ' + bundle_id)
|
|
||||||
print('done.')
|
|
||||||
print('')
|
|
||||||
return needs_update
|
|
||||||
@@ -60,6 +60,7 @@ def template_with_base(content, title=None):
|
|||||||
|
|
||||||
# Other
|
# Other
|
||||||
|
|
||||||
|
# same regex as in `api/v1/contribute/index.php`
|
||||||
regex_bundle_id = re.compile(r'^[A-Za-z0-9\.\-]{1,155}$')
|
regex_bundle_id = re.compile(r'^[A-Za-z0-9\.\-]{1,155}$')
|
||||||
logging.basicConfig(filename=os.path.join(os.pardir, "error.log"),
|
logging.basicConfig(filename=os.path.join(os.pardir, "error.log"),
|
||||||
format='%(asctime)s %(message)s',
|
format='%(asctime)s %(message)s',
|
||||||
@@ -85,6 +86,32 @@ def printf(msg):
|
|||||||
print(msg, end='', flush=True)
|
print(msg, end='', flush=True)
|
||||||
|
|
||||||
|
|
||||||
|
# Binary Tree Search
|
||||||
|
|
||||||
|
def read_list(list_name):
|
||||||
|
path = path_root('src', 'lists', list_name)
|
||||||
|
if not file_exists(path):
|
||||||
|
return []
|
||||||
|
with open(path, 'r') as fp:
|
||||||
|
return [x.strip() for x in fp.readlines()]
|
||||||
|
|
||||||
|
|
||||||
|
def bintree_lookup(tree, needle):
|
||||||
|
lo = 0
|
||||||
|
hi = len(tree) - 1
|
||||||
|
while lo <= hi:
|
||||||
|
mid = (lo + hi) // 2
|
||||||
|
if tree[mid] < needle:
|
||||||
|
lo = mid + 1
|
||||||
|
elif needle < tree[mid]:
|
||||||
|
hi = mid - 1
|
||||||
|
else:
|
||||||
|
return True # mid
|
||||||
|
if lo > 0 and needle.startswith(tree[lo - 1] + '.'):
|
||||||
|
return True # lo - 1
|
||||||
|
return False # -1
|
||||||
|
|
||||||
|
|
||||||
# Filesystem
|
# Filesystem
|
||||||
|
|
||||||
def mkdir(path):
|
def mkdir(path):
|
||||||
@@ -113,6 +140,46 @@ def meta_json_exists(bundle_id, lang):
|
|||||||
return file_exists(path_data_app(bundle_id, 'info_{}.json'.format(lang)))
|
return file_exists(path_data_app(bundle_id, 'info_{}.json'.format(lang)))
|
||||||
|
|
||||||
|
|
||||||
|
def next_path(path_pattern):
|
||||||
|
i = 1
|
||||||
|
while os.path.exists(path_pattern % i):
|
||||||
|
i = i * 2
|
||||||
|
a, b = (i // 2, i)
|
||||||
|
while a + 1 < b:
|
||||||
|
c = (a + b) // 2 # interval midpoint
|
||||||
|
a, b = (c, b) if os.path.exists(path_pattern % c) else (a, c)
|
||||||
|
return path_pattern % b
|
||||||
|
|
||||||
|
|
||||||
|
def diff_files(fileA, fileB):
|
||||||
|
with open(fileA, 'r') as fpA:
|
||||||
|
with open(fileB, 'r') as fpB:
|
||||||
|
a = '_'
|
||||||
|
b = '_'
|
||||||
|
diff = []
|
||||||
|
while a != '' and b != '':
|
||||||
|
a = fpA.readline()
|
||||||
|
b = fpB.readline()
|
||||||
|
if a == b:
|
||||||
|
continue
|
||||||
|
while a != b:
|
||||||
|
if a == '' or b == '':
|
||||||
|
break
|
||||||
|
if a < b:
|
||||||
|
diff.append(a.strip())
|
||||||
|
a = fpA.readline()
|
||||||
|
elif b < a:
|
||||||
|
diff.append(b.strip())
|
||||||
|
b = fpB.readline()
|
||||||
|
while a != '':
|
||||||
|
a = fpA.readline()
|
||||||
|
diff.append(a.strip())
|
||||||
|
while b != '':
|
||||||
|
b = fpB.readline()
|
||||||
|
diff.append(b.strip())
|
||||||
|
return diff
|
||||||
|
|
||||||
|
|
||||||
# Download
|
# Download
|
||||||
|
|
||||||
def download(url, isJSON=False):
|
def download(url, isJSON=False):
|
||||||
@@ -129,9 +196,8 @@ def download_file(url, path):
|
|||||||
# Enumerator
|
# Enumerator
|
||||||
|
|
||||||
def enum_newly_added():
|
def enum_newly_added():
|
||||||
for fname in glob.glob(path_data('_in', '*.json')):
|
for fname in glob.glob(path_data('_in', 'in_*')):
|
||||||
with open(fname, 'r') as fp:
|
yield fname, os.path.basename(fname)[3:] # del prefix 'in_'
|
||||||
yield fname, json.load(fp)
|
|
||||||
|
|
||||||
|
|
||||||
def enum_appids():
|
def enum_appids():
|
||||||
|
|||||||
@@ -15,7 +15,9 @@ def sort_dict(count_dict):
|
|||||||
return names, sizes
|
return names, sizes
|
||||||
|
|
||||||
|
|
||||||
def gen_graph(count_dict, outfile):
|
def gen_graph(count_dict, outfile, overwrite=False):
|
||||||
|
if mylib.file_exists(outfile) and not overwrite:
|
||||||
|
return
|
||||||
names, sizes = sort_dict(count_dict)
|
names, sizes = sort_dict(count_dict)
|
||||||
pie1, _ = plt.pie(sizes, labels=names)
|
pie1, _ = plt.pie(sizes, labels=names)
|
||||||
plt.setp(pie1, width=0.5, edgecolor='white')
|
plt.setp(pie1, width=0.5, edgecolor='white')
|
||||||
@@ -30,15 +32,23 @@ def seconds_to_time(seconds):
|
|||||||
return '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
|
return '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
|
||||||
|
|
||||||
|
|
||||||
def gen_domain_tags(unsorted_dict):
|
def gen_dom_tags(unsorted_dict, trackers=None):
|
||||||
for x in sorted(unsorted_dict):
|
sorted_arr = sorted(unsorted_dict, key=lambda x: (-x[1], x[0]))
|
||||||
yield '<i>{}</i>'.format(x)
|
res = []
|
||||||
|
for x, y in sorted_arr:
|
||||||
|
clss = ' class="bad"' if trackers and trackers[x] else ''
|
||||||
|
title = x # if y == 1 else '{} ({})'.format(x, y)
|
||||||
|
res.append('<i{}>{}</i>'.format(clss, title))
|
||||||
|
return ' '.join(res)
|
||||||
|
|
||||||
|
|
||||||
def gen_html(bundle_id, obj):
|
def gen_html(bundle_id, obj):
|
||||||
|
track_dom = [(dom, obj['total_subdom'][dom])
|
||||||
|
for dom, known in obj['tracker_subdom'].items() if known]
|
||||||
return mylib.template_with_base(f'''
|
return mylib.template_with_base(f'''
|
||||||
<h2>{obj['name']}</h2>
|
<h2>{obj['name']}</h2>
|
||||||
<div id="meta">
|
<div id="meta">
|
||||||
|
<img id="appicon" src="icon.png" width="100" height="100">
|
||||||
<table>
|
<table>
|
||||||
<tr><td>Bundle-id:</td><td>{
|
<tr><td>Bundle-id:</td><td>{
|
||||||
bundle_id
|
bundle_id
|
||||||
@@ -60,14 +70,14 @@ def gen_html(bundle_id, obj):
|
|||||||
<h3>Connections</h3>
|
<h3>Connections</h3>
|
||||||
<div id="connections">
|
<div id="connections">
|
||||||
<table>
|
<table>
|
||||||
|
<tr><td>Known Trackers ({ len(track_dom) }):</td><td>{
|
||||||
|
gen_dom_tags(track_dom)
|
||||||
|
}</td></tr>
|
||||||
<tr><td>Domains:</td><td>{
|
<tr><td>Domains:</td><td>{
|
||||||
''.join(gen_domain_tags(obj['uniq_pardom']))
|
gen_dom_tags(obj['total_pardom'].items(), obj['tracker_pardom'])
|
||||||
}</td></tr>
|
}</td></tr>
|
||||||
<tr><td>Subdomains:</td><td>{
|
<tr><td>Subdomains:</td><td>{
|
||||||
''.join(gen_domain_tags(obj['uniq_subdom']))
|
gen_dom_tags(obj['total_subdom'].items(), obj['tracker_subdom'])
|
||||||
}</td></tr>
|
|
||||||
<tr><td>Known Trackers:</td><td>{
|
|
||||||
'...'
|
|
||||||
}</td></tr>
|
}</td></tr>
|
||||||
</table>
|
</table>
|
||||||
<figure><img src="par.svg"></figure>
|
<figure><img src="par.svg"></figure>
|
||||||
@@ -75,25 +85,27 @@ def gen_html(bundle_id, obj):
|
|||||||
</div>''', title=obj['name'])
|
</div>''', title=obj['name'])
|
||||||
|
|
||||||
|
|
||||||
def make_bundle_out(bundle_id):
|
def make_bundle_out(bundle_id, forceGraphs=False):
|
||||||
jdata = mylib.json_read_combined(bundle_id)
|
json = mylib.json_read_combined(bundle_id)
|
||||||
out_dir = mylib.path_out_app(bundle_id)
|
out_dir = mylib.path_out_app(bundle_id)
|
||||||
needs_update_index = False
|
needs_update_index = False
|
||||||
if not mylib.dir_exists(out_dir):
|
if not mylib.dir_exists(out_dir):
|
||||||
needs_update_index = True
|
needs_update_index = True
|
||||||
mylib.mkdir(out_dir)
|
mylib.mkdir(out_dir)
|
||||||
try:
|
try:
|
||||||
gen_graph(jdata['total_subdom'], mylib.path_add(out_dir, 'sub.svg'))
|
gen_graph(json['total_subdom'], mylib.path_add(out_dir, 'sub.svg'),
|
||||||
gen_graph(jdata['total_pardom'], mylib.path_add(out_dir, 'par.svg'))
|
overwrite=forceGraphs)
|
||||||
|
gen_graph(json['total_pardom'], mylib.path_add(out_dir, 'par.svg'),
|
||||||
|
overwrite=forceGraphs)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
mylib.err('bundle-generate-page', 'skip: ' + bundle_id)
|
mylib.err('bundle-generate-page', 'skip: ' + bundle_id)
|
||||||
|
|
||||||
with open(mylib.path_add(out_dir, 'index.html'), 'w') as fp:
|
with open(mylib.path_add(out_dir, 'index.html'), 'w') as fp:
|
||||||
fp.write(gen_html(bundle_id, jdata))
|
fp.write(gen_html(bundle_id, json))
|
||||||
return needs_update_index
|
return needs_update_index
|
||||||
|
|
||||||
|
|
||||||
def process(bundle_ids):
|
def process(bundle_ids, forceGraphs=False):
|
||||||
print('generating html pages ...')
|
print('generating html pages ...')
|
||||||
if bundle_ids == ['*']:
|
if bundle_ids == ['*']:
|
||||||
bundle_ids = list(mylib.enum_appids())
|
bundle_ids = list(mylib.enum_appids())
|
||||||
@@ -101,7 +113,7 @@ def process(bundle_ids):
|
|||||||
ids_new_in_index = set()
|
ids_new_in_index = set()
|
||||||
for bid in bundle_ids:
|
for bid in bundle_ids:
|
||||||
print(' ' + bid)
|
print(' ' + bid)
|
||||||
if make_bundle_out(bid):
|
if make_bundle_out(bid, forceGraphs=forceGraphs):
|
||||||
ids_new_in_index.add(bid)
|
ids_new_in_index.add(bid)
|
||||||
print('')
|
print('')
|
||||||
return ids_new_in_index
|
return ids_new_in_index
|
||||||
|
|||||||
@@ -24,9 +24,21 @@ def gen_root():
|
|||||||
</a>{}'''. format('')))
|
</a>{}'''. format('')))
|
||||||
|
|
||||||
|
|
||||||
|
def gen_search():
|
||||||
|
with open(mylib.path_out('redirect.html'), 'w') as fp:
|
||||||
|
fp.write(mylib.template_with_base('''
|
||||||
|
<h2>Redirecting …</h2>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var GET={};
|
||||||
|
window.location.search.substr(1).split("&").forEach(function(x){GET[x.split("=")[0]]=x.split("=")[1]});
|
||||||
|
if (GET["id"]) { window.location = "/app/" + GET["id"] + "/index.html"; }
|
||||||
|
</script>'''))
|
||||||
|
|
||||||
|
|
||||||
def process():
|
def process():
|
||||||
print('generating root html ...')
|
print('generating root html ...')
|
||||||
gen_root() # root index.thml
|
gen_root() # root index.thml
|
||||||
|
gen_search() # root redirect.html?id=my.bundle.id
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
@@ -84,6 +84,31 @@ br.vet
|
|||||||
br.vlog
|
br.vlog
|
||||||
br.wiki
|
br.wiki
|
||||||
br.zlg
|
br.zlg
|
||||||
|
co.a
|
||||||
|
co.b
|
||||||
|
co.com
|
||||||
|
co.edu
|
||||||
|
co.g
|
||||||
|
co.gov
|
||||||
|
co.inf
|
||||||
|
co.m
|
||||||
|
co.mil
|
||||||
|
co.net
|
||||||
|
co.ngo
|
||||||
|
co.nom
|
||||||
|
co.o
|
||||||
|
co.org
|
||||||
|
co.s
|
||||||
|
co.t
|
||||||
|
co.x
|
||||||
|
co.y
|
||||||
|
er.com
|
||||||
|
er.edu
|
||||||
|
er.gov
|
||||||
|
er.mil
|
||||||
|
er.net
|
||||||
|
er.org
|
||||||
|
er.ind
|
||||||
es.com
|
es.com
|
||||||
es.edu
|
es.edu
|
||||||
es.gob
|
es.gob
|
||||||
7763
src/lists/tracker_all.txt
Normal file
7763
src/lists/tracker_all.txt
Normal file
File diff suppressed because it is too large
Load Diff
7
src/lists/tracker_custom.txt
Normal file
7
src/lists/tracker_custom.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
adjust.com
|
||||||
|
app-measurement.com
|
||||||
|
criteo.com
|
||||||
|
firebasedynamiclinks-ipv4.googleapis.com
|
||||||
|
firebasedynamiclinks-ipv6.googleapis.com
|
||||||
|
ioam.de
|
||||||
|
userreport.com
|
||||||
3273
src/lists/tracker_easylist.txt
Normal file
3273
src/lists/tracker_easylist.txt
Normal file
File diff suppressed because it is too large
Load Diff
920
src/lists/tracker_easylist_int.txt
Normal file
920
src/lists/tracker_easylist_int.txt
Normal file
@@ -0,0 +1,920 @@
|
|||||||
|
0stats.com
|
||||||
|
109.169.66.161
|
||||||
|
123-counter.de
|
||||||
|
123compteur.com
|
||||||
|
12mnkys.com
|
||||||
|
180.76.2.18
|
||||||
|
193.197.158.209
|
||||||
|
1dmp.io
|
||||||
|
212.95.32.75
|
||||||
|
24log.de
|
||||||
|
24log.ru
|
||||||
|
24smi.info
|
||||||
|
24smi.net
|
||||||
|
2ip.ua
|
||||||
|
2iui01.com
|
||||||
|
2parale.ro
|
||||||
|
2performant.com
|
||||||
|
3ng6p6m0.de
|
||||||
|
3wnp9.ru
|
||||||
|
4stats.de
|
||||||
|
50bang.org
|
||||||
|
51yes.com
|
||||||
|
7x4.fr
|
||||||
|
7x5.fr
|
||||||
|
99click.com
|
||||||
|
a-counter.com.ua
|
||||||
|
a-counter.kiev.ua
|
||||||
|
abcompteur.com
|
||||||
|
accessi.it
|
||||||
|
accesstrade.net
|
||||||
|
acs86.com
|
||||||
|
actionallocator.com
|
||||||
|
active-tracking.de
|
||||||
|
active24stats.nl
|
||||||
|
ad4m.at
|
||||||
|
ad5track.com
|
||||||
|
ad7.com
|
||||||
|
adblockmetrics.ru
|
||||||
|
adc-serv.net
|
||||||
|
adclear.net
|
||||||
|
adcrowd.com
|
||||||
|
admatrix.jp
|
||||||
|
admeira.ch
|
||||||
|
admile.ru
|
||||||
|
admo.tv
|
||||||
|
adnz.co
|
||||||
|
adop.cc
|
||||||
|
adpick.co.kr
|
||||||
|
adquality.ch
|
||||||
|
adrank24.de
|
||||||
|
adschoom.com
|
||||||
|
adsettings.com
|
||||||
|
adsixmedia.fr
|
||||||
|
adskom.com
|
||||||
|
adstat.4u.pl
|
||||||
|
adten.eu
|
||||||
|
adthletic.com
|
||||||
|
adtimaserver.vn
|
||||||
|
adtive.com
|
||||||
|
adtlgc.com
|
||||||
|
adtr.io
|
||||||
|
adtraxx.de
|
||||||
|
adtriba.com
|
||||||
|
adx.com.ru
|
||||||
|
adxvip.com
|
||||||
|
af-z.jp
|
||||||
|
affclkr.com
|
||||||
|
affilbox.cz
|
||||||
|
affilizr.com
|
||||||
|
agillic.eu
|
||||||
|
aicontents.net
|
||||||
|
aid-ad.jp
|
||||||
|
air360tracker.net
|
||||||
|
algopine.com
|
||||||
|
alkemics.com
|
||||||
|
allo-media.net
|
||||||
|
amarfa.ir
|
||||||
|
amcdn.vn
|
||||||
|
amoad.com
|
||||||
|
amunx.de
|
||||||
|
analights.com
|
||||||
|
analysis.fi
|
||||||
|
analyti.io
|
||||||
|
analytic.rocks
|
||||||
|
analytics-cdiscount.com
|
||||||
|
analytics.rechtslupe.org
|
||||||
|
analyticsip.net
|
||||||
|
andersenit.dk
|
||||||
|
andyhoppe.com
|
||||||
|
announcement.ru
|
||||||
|
anormal-tracker.de
|
||||||
|
antvoice.com
|
||||||
|
apkonline.ru
|
||||||
|
appier.net
|
||||||
|
asadcdn.com
|
||||||
|
atraxio.com
|
||||||
|
atsfi.de
|
||||||
|
audiencemanager.de
|
||||||
|
audiencesquare.com
|
||||||
|
audienzz.ch
|
||||||
|
audsp.com
|
||||||
|
audtd.com
|
||||||
|
avencio.de
|
||||||
|
avstat.it
|
||||||
|
backlink-test.de
|
||||||
|
backlink-umsonst.de
|
||||||
|
backlinkdino.de
|
||||||
|
baifendian.com
|
||||||
|
bekannt-im-web.de
|
||||||
|
belboon.de
|
||||||
|
beliebtestewebseite.de
|
||||||
|
best-top.ro
|
||||||
|
besucherstats.de
|
||||||
|
besucherzaehler-counter.de
|
||||||
|
besucherzaehler-homepage.de
|
||||||
|
besucherzaehler-zugriffszaehler.de
|
||||||
|
besucherzaehler.org
|
||||||
|
besucherzahlen.com
|
||||||
|
betarget.de
|
||||||
|
bf-tools.net
|
||||||
|
bid.run
|
||||||
|
bidderrtb.com
|
||||||
|
bigmining.com
|
||||||
|
blacktri.com
|
||||||
|
blog-o-rama.de
|
||||||
|
blog-webkatalog.de
|
||||||
|
blog104.com
|
||||||
|
blogcounter.com
|
||||||
|
blogcounter.de
|
||||||
|
bloggeramt.de
|
||||||
|
bloggerei.de
|
||||||
|
blogranking.net
|
||||||
|
blogtraffic.de
|
||||||
|
blogtw.net
|
||||||
|
bluecounter.de
|
||||||
|
bonitrust.de
|
||||||
|
bonnieradnetwork.se
|
||||||
|
bonuscounter.de
|
||||||
|
botdetector.ru
|
||||||
|
botize.com
|
||||||
|
botscanner.com
|
||||||
|
brandmetrics.com
|
||||||
|
browsiprod.com
|
||||||
|
bumlam.com
|
||||||
|
businessclick.ch
|
||||||
|
buzzoole.com
|
||||||
|
caanalytics.com
|
||||||
|
call-tracking.by
|
||||||
|
canalstat.com
|
||||||
|
carts.guru
|
||||||
|
casualstat.com
|
||||||
|
ccrtvi.com
|
||||||
|
cctvgb.com.cn
|
||||||
|
cdnmaster.cn
|
||||||
|
certifica.com
|
||||||
|
cetlog.jp
|
||||||
|
chart.dk
|
||||||
|
checkeffect.at
|
||||||
|
checkru.net
|
||||||
|
cheqzone.com
|
||||||
|
cifraclub.com.br
|
||||||
|
circle.am
|
||||||
|
citypaketet.se
|
||||||
|
cityua.net
|
||||||
|
clearsale.com.br
|
||||||
|
clicki.cn
|
||||||
|
clickmap.ch
|
||||||
|
clickmatic.pl
|
||||||
|
clubcollector.com
|
||||||
|
cms.lv
|
||||||
|
cnstats.ru
|
||||||
|
cnzz.net
|
||||||
|
coll1onf.com
|
||||||
|
compteur-fr.com
|
||||||
|
compteur-gratuit.org
|
||||||
|
compteur-visite.com
|
||||||
|
compteur.com
|
||||||
|
compteur.org
|
||||||
|
contadordevisitas.es
|
||||||
|
contadorgratis.com
|
||||||
|
contadorgratis.es
|
||||||
|
contadorvisitasgratis.com
|
||||||
|
contadorweb.com
|
||||||
|
contatoreaccessi.com
|
||||||
|
contentsfeed.com
|
||||||
|
contineljs.com
|
||||||
|
conversion.pl
|
||||||
|
conversionlabs.net.pl
|
||||||
|
cosmi.io
|
||||||
|
count.fr
|
||||||
|
count.im
|
||||||
|
count24.de
|
||||||
|
countar.de
|
||||||
|
counter-city.de
|
||||||
|
counter-go.de
|
||||||
|
counter-gratis.com
|
||||||
|
counter-kostenlos.info
|
||||||
|
counter-kostenlos.net
|
||||||
|
counter-treff.de
|
||||||
|
counter.de
|
||||||
|
counter.ok.ee
|
||||||
|
counter27.ch
|
||||||
|
countercity.net
|
||||||
|
counterlevel.de
|
||||||
|
counteronline.de
|
||||||
|
counterseite.de
|
||||||
|
counterserver.de
|
||||||
|
counterstation.de
|
||||||
|
counterstatistik.de
|
||||||
|
counthis.com
|
||||||
|
counti.de
|
||||||
|
countino.de
|
||||||
|
countit.ch
|
||||||
|
countnow.de
|
||||||
|
counto.de
|
||||||
|
countok.de
|
||||||
|
countus.fr
|
||||||
|
countyou.de
|
||||||
|
cpaevent.ru
|
||||||
|
cpmktg.com
|
||||||
|
cptrack.de
|
||||||
|
cr-nielsen.com
|
||||||
|
cssrvsync.com
|
||||||
|
cszz.ru
|
||||||
|
ctags.cn
|
||||||
|
cuntador.com
|
||||||
|
cya1t.net
|
||||||
|
d-bi.fr
|
||||||
|
d-markets.net
|
||||||
|
d-stats.com
|
||||||
|
d2-apps.net
|
||||||
|
data.caroda.io
|
||||||
|
datado.me
|
||||||
|
datadome.co
|
||||||
|
datamaster.com.cn
|
||||||
|
dawin.tv
|
||||||
|
dcmn.io
|
||||||
|
de17a.com
|
||||||
|
delidatax.net
|
||||||
|
deliv.lexpress.fr
|
||||||
|
denakop.com
|
||||||
|
dep-x.com
|
||||||
|
deteql.net
|
||||||
|
df-srv.de
|
||||||
|
die-rankliste.com
|
||||||
|
digidip.net
|
||||||
|
digital-metric.com
|
||||||
|
digitaladvisor.dk
|
||||||
|
digitiminimi.com
|
||||||
|
dircont3.com
|
||||||
|
directcounter.de
|
||||||
|
directcrm.ru
|
||||||
|
distribeo.com
|
||||||
|
divolution.com
|
||||||
|
dl8.me
|
||||||
|
dmdi.pl
|
||||||
|
dnab.info
|
||||||
|
do09.net
|
||||||
|
docodoco.jp
|
||||||
|
dotmetrics.net
|
||||||
|
dreamcounter.de
|
||||||
|
durocount.com
|
||||||
|
e-kaiseki.com
|
||||||
|
e-kuzbass.ru
|
||||||
|
eanalyzer.de
|
||||||
|
early-birds.fr
|
||||||
|
early-birds.io
|
||||||
|
easy.lv
|
||||||
|
easysol.net
|
||||||
|
easytracking.de
|
||||||
|
ebis.ne.jp
|
||||||
|
ec-concier.com
|
||||||
|
ec-optimizer.com
|
||||||
|
eco-tag.jp
|
||||||
|
econda-monitor.de
|
||||||
|
edococounter.de
|
||||||
|
edt02.net
|
||||||
|
edtp.de
|
||||||
|
efatik.me
|
||||||
|
eltex.co.jp
|
||||||
|
emailretargeting.com
|
||||||
|
emarbox.com
|
||||||
|
emetriq.de
|
||||||
|
engageya.com
|
||||||
|
enter-system.com
|
||||||
|
erate.co.il
|
||||||
|
eresmas.net
|
||||||
|
erotikcounter.org
|
||||||
|
estadisticasgratis.com
|
||||||
|
estadisticasgratis.es
|
||||||
|
etracker.de
|
||||||
|
etracking24.de
|
||||||
|
etrust.eu
|
||||||
|
euro-pr.eu
|
||||||
|
euroads.dk
|
||||||
|
eurocounter.com
|
||||||
|
ew3.io
|
||||||
|
exapxl.de
|
||||||
|
exe.bid
|
||||||
|
exmarkt.de
|
||||||
|
eyeota.net
|
||||||
|
ezakus.net
|
||||||
|
f-counter.jp
|
||||||
|
f-counter.net
|
||||||
|
facil-iti.com
|
||||||
|
faibl.org
|
||||||
|
fastcounter.de
|
||||||
|
faststart.ru
|
||||||
|
ferank.fr
|
||||||
|
fixcounter.com
|
||||||
|
flags.es
|
||||||
|
fogl1onf.com
|
||||||
|
fortvision.com
|
||||||
|
fraudmetrix.cn
|
||||||
|
free-counters.net
|
||||||
|
freecounter.it
|
||||||
|
freestat.ws
|
||||||
|
freestats.biz
|
||||||
|
freestats.net
|
||||||
|
freestats.org
|
||||||
|
freestats.tk
|
||||||
|
freestats.tv
|
||||||
|
freestats.ws
|
||||||
|
freihit.de
|
||||||
|
fremaks.net
|
||||||
|
frosmo.com
|
||||||
|
ftrack.ru
|
||||||
|
fun-hits.com
|
||||||
|
gacela.eu
|
||||||
|
galaxiemedia.fr
|
||||||
|
gallupnet.fi
|
||||||
|
gdeslon.ru
|
||||||
|
generaltracking.de
|
||||||
|
genieedmp.com
|
||||||
|
genieessp.jp
|
||||||
|
geocompteur.com
|
||||||
|
geocontatore.com
|
||||||
|
geovisite.ovh
|
||||||
|
getaim.info
|
||||||
|
gezaehlt.de
|
||||||
|
gft2.de
|
||||||
|
ggxt.net
|
||||||
|
giga-abs.de
|
||||||
|
giraff.io
|
||||||
|
gixmo.dk
|
||||||
|
gm-it.consulting
|
||||||
|
gm99.com
|
||||||
|
gmodmp.jp
|
||||||
|
gnezdo.ru
|
||||||
|
google-rank.org
|
||||||
|
goprediction.com
|
||||||
|
gostats.cn
|
||||||
|
gostats.de
|
||||||
|
gostats.pl
|
||||||
|
gostats.ru
|
||||||
|
gostats.vn
|
||||||
|
goutee.top
|
||||||
|
gpr.hu
|
||||||
|
graphinsider.com
|
||||||
|
gratis-besucherzaehler.de
|
||||||
|
gratis-counter-gratis.de
|
||||||
|
greatviews.de
|
||||||
|
grfz.de
|
||||||
|
gridsum.com
|
||||||
|
gridsumdissector.com
|
||||||
|
growingio.com
|
||||||
|
gsspcln.jp
|
||||||
|
gtags.net
|
||||||
|
gtop.ro
|
||||||
|
he2d.com
|
||||||
|
healte.de
|
||||||
|
hetchi.com
|
||||||
|
hiddencounter.de
|
||||||
|
hiperstat.com
|
||||||
|
hirmatrix.hu
|
||||||
|
hit.copesa.cl
|
||||||
|
hit100.ro
|
||||||
|
hitcount.dk
|
||||||
|
hitcountersonline.com
|
||||||
|
hitgraph.jp
|
||||||
|
hitmaster.de
|
||||||
|
hitmir.ru
|
||||||
|
hits.e.cl
|
||||||
|
holder.com.ua
|
||||||
|
hot-count.com
|
||||||
|
hotcounter.de
|
||||||
|
hotrank.com.tw
|
||||||
|
hsdn.org
|
||||||
|
hstrck.com
|
||||||
|
hub.com.pl
|
||||||
|
hubpd.com
|
||||||
|
hung.ch
|
||||||
|
hunkal.com
|
||||||
|
i-mobile.co.jp
|
||||||
|
i22lo.com
|
||||||
|
i2ad.jp
|
||||||
|
i2i.jp
|
||||||
|
idntfy.ru
|
||||||
|
idot.cz
|
||||||
|
iid-network.jp
|
||||||
|
iivt.com
|
||||||
|
im-apps.net
|
||||||
|
imcht.net
|
||||||
|
imetrix.it
|
||||||
|
imrk.net
|
||||||
|
inaudium.com
|
||||||
|
infocollect.dk
|
||||||
|
infostroy.nnov.ru
|
||||||
|
infox.sg
|
||||||
|
ingenioustech.biz
|
||||||
|
inistrack.net
|
||||||
|
inpref.com
|
||||||
|
inrd.ru
|
||||||
|
instreamatic.com
|
||||||
|
intelliad.de
|
||||||
|
interactive-circle.jp
|
||||||
|
interakt.ru
|
||||||
|
interaktiv-net.de
|
||||||
|
intergid.ru
|
||||||
|
interhits.de
|
||||||
|
intrastats.com
|
||||||
|
iogous.com
|
||||||
|
iolam.it
|
||||||
|
ipcount.net
|
||||||
|
ipfrom.com
|
||||||
|
ipinyou.com
|
||||||
|
irs09.com
|
||||||
|
iryazan.ru
|
||||||
|
istats.nl
|
||||||
|
italianadirectory.com
|
||||||
|
itop.cz
|
||||||
|
ivitrack.com
|
||||||
|
iyi.net
|
||||||
|
jiankongbao.com
|
||||||
|
jubiitag.dk
|
||||||
|
kaizenplatform.net
|
||||||
|
kavijaseuranta.fi
|
||||||
|
kctag.net
|
||||||
|
kdata.fr
|
||||||
|
keytrack.de
|
||||||
|
keyword-match.com
|
||||||
|
keyxel.com
|
||||||
|
kir.jp
|
||||||
|
klamm-counter.de
|
||||||
|
kmindex.ru
|
||||||
|
kono-research.de
|
||||||
|
kostenlose-counter.com
|
||||||
|
kupona.de
|
||||||
|
laserstat.com
|
||||||
|
lddt.de
|
||||||
|
lead-analytics.biz
|
||||||
|
lead.im
|
||||||
|
leadium.com
|
||||||
|
leadslabpixels.net
|
||||||
|
legenhit.com
|
||||||
|
leiki.com
|
||||||
|
lentainform.com
|
||||||
|
leserservice-tracking.de
|
||||||
|
letro.jp
|
||||||
|
libstat.com
|
||||||
|
link-empfehlen24.de
|
||||||
|
linkwi.se
|
||||||
|
listtop.ru
|
||||||
|
livecounter.dk
|
||||||
|
livestats.fr
|
||||||
|
livetex.ru
|
||||||
|
livewebstats.dk
|
||||||
|
lndata.com
|
||||||
|
logger.co.kr
|
||||||
|
logly.co.jp
|
||||||
|
logua.com
|
||||||
|
logxp.ru
|
||||||
|
logz.ru
|
||||||
|
lookit.cz
|
||||||
|
lookmy.info
|
||||||
|
losecounter.de
|
||||||
|
lugansk-info.ru
|
||||||
|
lumitos.com
|
||||||
|
luxup2.ru
|
||||||
|
luxupadva.com
|
||||||
|
luxupcdna.com
|
||||||
|
luxupcdnc.com
|
||||||
|
lwadm.com
|
||||||
|
m-brain.fi
|
||||||
|
mabaya.com
|
||||||
|
macromill.com
|
||||||
|
madnet.ru
|
||||||
|
mairdumont.com
|
||||||
|
marketing-page.de
|
||||||
|
marktest.pt
|
||||||
|
mastertag.effiliation.com
|
||||||
|
mateti.net
|
||||||
|
maxtraffic.com
|
||||||
|
mb-srv.com
|
||||||
|
mcloudglobal.com
|
||||||
|
md-nx.com
|
||||||
|
mediaplan.ru
|
||||||
|
mediatoday.ru
|
||||||
|
mediatraffic.com.ua
|
||||||
|
mediav.com
|
||||||
|
meetrics.net
|
||||||
|
megast.at
|
||||||
|
megavisites.com
|
||||||
|
mengis-linden.org
|
||||||
|
metalyzer.com
|
||||||
|
metrigo.com
|
||||||
|
metriweb.be
|
||||||
|
mgid.com
|
||||||
|
miaozhen.com
|
||||||
|
micodigo.com
|
||||||
|
microcounter.de
|
||||||
|
midas-network.com
|
||||||
|
mimgoal.com
|
||||||
|
mindtake.com
|
||||||
|
mmtro.com
|
||||||
|
mobylog.jp
|
||||||
|
modernus.is
|
||||||
|
mokuz.ru
|
||||||
|
monkeytracker.cz
|
||||||
|
motorpresse-statistik.de
|
||||||
|
mps-gba.de
|
||||||
|
mpwe.net
|
||||||
|
mr-rank.de
|
||||||
|
msgs.jp
|
||||||
|
mtrack.nl
|
||||||
|
musiccounter.ru
|
||||||
|
mwstats.net
|
||||||
|
mxapis.com
|
||||||
|
my-ranking.de
|
||||||
|
my-stats.info
|
||||||
|
mycounter.com.ua
|
||||||
|
mycounter.ua
|
||||||
|
mystat-in.net
|
||||||
|
mystat.hu
|
||||||
|
mystat.it
|
||||||
|
mystats.nl
|
||||||
|
mytopf.com
|
||||||
|
myvisitors.se
|
||||||
|
navrcholu.cz
|
||||||
|
ncom.dk
|
||||||
|
nepohita.com
|
||||||
|
netagent.cz
|
||||||
|
netcounter.de
|
||||||
|
netdebit-counter.de
|
||||||
|
netminers.dk
|
||||||
|
netmonitor.fi
|
||||||
|
netquattro.com
|
||||||
|
netstats.dk
|
||||||
|
netupdater.info
|
||||||
|
netvigie.com
|
||||||
|
netzaehler.de
|
||||||
|
netzstat.ch
|
||||||
|
nex8.net
|
||||||
|
ngacm.com
|
||||||
|
ngastatic.com
|
||||||
|
ninestats.com
|
||||||
|
nokaut.link
|
||||||
|
nsaudience.pl
|
||||||
|
ntlab.org
|
||||||
|
oadz.com
|
||||||
|
observare.de
|
||||||
|
odoscope.cloud
|
||||||
|
oevery.com
|
||||||
|
oewabox.at
|
||||||
|
oghub.io
|
||||||
|
omiki.com
|
||||||
|
on-line.lv
|
||||||
|
onlinewebstat.com
|
||||||
|
opentracking.ru
|
||||||
|
optimierung-der-website.de
|
||||||
|
organicfruitapps.com
|
||||||
|
orquideassp.com
|
||||||
|
osxau.de
|
||||||
|
otclick-adv.ru
|
||||||
|
ourstats.de
|
||||||
|
owldata.com
|
||||||
|
p0y.cn
|
||||||
|
p24.hu
|
||||||
|
page-hit.de
|
||||||
|
pagerank-backlink.eu
|
||||||
|
pagerank-linkverzeichnis.de
|
||||||
|
pagerank-online.eu
|
||||||
|
pagerank-suchmaschine.de
|
||||||
|
pagerankfree.com
|
||||||
|
pageranking-counter.de
|
||||||
|
pagoda56.com
|
||||||
|
parameter.dk
|
||||||
|
pc-agency24.de
|
||||||
|
pdmp.jp
|
||||||
|
peakcounter.dk
|
||||||
|
percycle.com
|
||||||
|
performax.cz
|
||||||
|
persianstat.com
|
||||||
|
persianstat.ir
|
||||||
|
phpstat.com
|
||||||
|
phywi.org
|
||||||
|
pimpmypr.de
|
||||||
|
pingclock.net
|
||||||
|
pixanalytics.com
|
||||||
|
pladform.ru
|
||||||
|
plexworks.de
|
||||||
|
pmbox.biz
|
||||||
|
pocitadlo.cz
|
||||||
|
pocitadlo.sk
|
||||||
|
polymorphicads.jp
|
||||||
|
popin.cc
|
||||||
|
potterpetrey.com
|
||||||
|
powercount.com
|
||||||
|
pp8.com
|
||||||
|
ppdb.pl
|
||||||
|
ppro.de
|
||||||
|
pr-chart.com
|
||||||
|
pr-chart.de
|
||||||
|
pr-linktausch.de
|
||||||
|
pr-sunshine.de
|
||||||
|
prnetwork.de
|
||||||
|
productsup.com
|
||||||
|
proext.com
|
||||||
|
profitshare.ro
|
||||||
|
programmatic.cz
|
||||||
|
props.id
|
||||||
|
prospecteye.com
|
||||||
|
prudsys-rde.de
|
||||||
|
publish-int.se
|
||||||
|
puls.lv
|
||||||
|
pushdom.co
|
||||||
|
pvmax.net
|
||||||
|
qchannel03.cn
|
||||||
|
qhupdate.com
|
||||||
|
quant.jp
|
||||||
|
quick-counter.net
|
||||||
|
r-ad.ne.jp
|
||||||
|
r.movad.de
|
||||||
|
r24-tech.com
|
||||||
|
rank-power.com
|
||||||
|
rank4all.eu
|
||||||
|
rankchamp.de
|
||||||
|
ranking-charts.de
|
||||||
|
ranking-counter.de
|
||||||
|
ranking-hits.de
|
||||||
|
ranking-links.de
|
||||||
|
rankings24.de
|
||||||
|
rawr.at
|
||||||
|
rays-counter.com
|
||||||
|
rdstation.com.br
|
||||||
|
reachmax.cn
|
||||||
|
realist.gen.tr
|
||||||
|
redretarget.com
|
||||||
|
refericon.pl
|
||||||
|
refinedads.com
|
||||||
|
reitingas.lt
|
||||||
|
reitingi.lv
|
||||||
|
rejestr.org
|
||||||
|
relap.io
|
||||||
|
rentracks.jp
|
||||||
|
research-artisan.com
|
||||||
|
research-int.se
|
||||||
|
research.de.com
|
||||||
|
reseau-pub.com
|
||||||
|
reshin.de
|
||||||
|
retag.xyz
|
||||||
|
retargeter.com.br
|
||||||
|
retargeting.biz
|
||||||
|
rightstats.com
|
||||||
|
ripost.services
|
||||||
|
ritogaga.com
|
||||||
|
rnet.plus
|
||||||
|
rossel.tech
|
||||||
|
royalcount.de
|
||||||
|
rtoaster.jp
|
||||||
|
ru.net
|
||||||
|
rutarget.ru
|
||||||
|
rvkcpqz.com
|
||||||
|
sagetrc.com
|
||||||
|
sambaads.com
|
||||||
|
sare25.com
|
||||||
|
sarimsol.com
|
||||||
|
sarov.ws
|
||||||
|
sas.com
|
||||||
|
sayyac.com
|
||||||
|
sayyac.net
|
||||||
|
sblftg.com
|
||||||
|
scriptil.com
|
||||||
|
scupio.com
|
||||||
|
scw.systems
|
||||||
|
sedotracker.de
|
||||||
|
seedtag.com
|
||||||
|
seesaa.jp
|
||||||
|
seitwert.de
|
||||||
|
selfcampaign.com
|
||||||
|
semantiqo.com
|
||||||
|
semiocast.com
|
||||||
|
semnicneposilejte.cz
|
||||||
|
semtracker.de
|
||||||
|
sensic.net
|
||||||
|
sensor.org.ua
|
||||||
|
seo-master.net
|
||||||
|
serating.ru
|
||||||
|
shinystat.it
|
||||||
|
sibautomation.com
|
||||||
|
sibulla.com
|
||||||
|
sifomedia.se
|
||||||
|
site-submit.com.ua
|
||||||
|
sitebot.cn
|
||||||
|
sitebro.de
|
||||||
|
sitetistik.com
|
||||||
|
sitizy.network
|
||||||
|
sjv.io
|
||||||
|
sk1n.fr
|
||||||
|
sk8t.fr
|
||||||
|
skylog.kz
|
||||||
|
slogantrend.de
|
||||||
|
smart-counter.net
|
||||||
|
smartnews-ads.com
|
||||||
|
snrbox.com
|
||||||
|
socdm.com
|
||||||
|
space-link.de
|
||||||
|
spacehits.net
|
||||||
|
specialstat.com
|
||||||
|
speedcount.de
|
||||||
|
speedcounter.net
|
||||||
|
speedtracker.de
|
||||||
|
speee-ad.jp
|
||||||
|
spelar.org
|
||||||
|
sphostserver.com
|
||||||
|
spider-mich.com
|
||||||
|
spolecznosci.net
|
||||||
|
sponsorcounter.de
|
||||||
|
spring-tns.net
|
||||||
|
srvtrck.com
|
||||||
|
stat-well.com
|
||||||
|
stat.4u.pl
|
||||||
|
stat.media
|
||||||
|
stat.pl
|
||||||
|
stat.www.fi
|
||||||
|
stat24.ru
|
||||||
|
static-fra.de
|
||||||
|
statistiche-free.com
|
||||||
|
statistiche.it
|
||||||
|
statistiche.ws
|
||||||
|
statistichegratis.net
|
||||||
|
statistics.ro
|
||||||
|
statistik-gallup.net
|
||||||
|
statistika.lv
|
||||||
|
statistiq.com
|
||||||
|
stats.de
|
||||||
|
stats.fr
|
||||||
|
stats.lt
|
||||||
|
stats4free.de
|
||||||
|
statsforever.com
|
||||||
|
stattds.club
|
||||||
|
stealth.nl
|
||||||
|
stetic.com
|
||||||
|
suchmaschinen-ranking-hits.de
|
||||||
|
sunios.de
|
||||||
|
suntcontent.se
|
||||||
|
superstat.info
|
||||||
|
svtrd.com
|
||||||
|
sync.tv
|
||||||
|
synovite-scripts.com
|
||||||
|
t4ft.de
|
||||||
|
tagcdn.com
|
||||||
|
tagmanager.cn
|
||||||
|
tagtool.de
|
||||||
|
tailtarget.com
|
||||||
|
tamedia.ch
|
||||||
|
tanx.com
|
||||||
|
targetix.net
|
||||||
|
taxel.jp
|
||||||
|
tbex.ru
|
||||||
|
tda.io
|
||||||
|
tds.io
|
||||||
|
team-rec.jp
|
||||||
|
technical-service.net
|
||||||
|
telemetric.dk
|
||||||
|
tenmax.io
|
||||||
|
tenping.kr
|
||||||
|
tetigi.com
|
||||||
|
tget.me
|
||||||
|
tgknt.com
|
||||||
|
thestat.net
|
||||||
|
tidningsnatet.se
|
||||||
|
tinyclues.com
|
||||||
|
tinystat.ir
|
||||||
|
tisoomi-services.com
|
||||||
|
titag.com
|
||||||
|
tnative.ru
|
||||||
|
tns-gallup.dk
|
||||||
|
tns-sifo.se
|
||||||
|
toc.io
|
||||||
|
tomonline-inc.com
|
||||||
|
top-bloggers.com
|
||||||
|
top-ro.ro
|
||||||
|
top.lv
|
||||||
|
tophits4u.de
|
||||||
|
toplist.sk
|
||||||
|
toplist100.org
|
||||||
|
topsem.com
|
||||||
|
topsite.lv
|
||||||
|
topstat.com
|
||||||
|
toptracker.ru
|
||||||
|
tovery.net
|
||||||
|
tpm.pw
|
||||||
|
tracdelight.com
|
||||||
|
tracdelight.io
|
||||||
|
tracker.stats.in.th
|
||||||
|
trackfeed.com
|
||||||
|
tracking*.euroads.fi
|
||||||
|
tracking.wlscripts.net
|
||||||
|
trackset.it
|
||||||
|
traffic4u.nl
|
||||||
|
trafficmaxx.de
|
||||||
|
trafikkfondet.no
|
||||||
|
trafit.com
|
||||||
|
trafix.ro
|
||||||
|
trbo.com
|
||||||
|
trendcounter.de
|
||||||
|
trick17.it
|
||||||
|
triver.jp
|
||||||
|
trkme.net
|
||||||
|
truehits.net
|
||||||
|
truehits3.gits.net.th
|
||||||
|
trugaze.io
|
||||||
|
twcouponcenter.com
|
||||||
|
txt.eu
|
||||||
|
tyxo.bg
|
||||||
|
uapoisk.net
|
||||||
|
uarating.com
|
||||||
|
ukw.jp
|
||||||
|
uniconsent.com
|
||||||
|
universaltrackingcontainer.com
|
||||||
|
up-rank.com
|
||||||
|
upravel.com
|
||||||
|
uptolike.com
|
||||||
|
urstats.de
|
||||||
|
usage.seibert-media.io
|
||||||
|
usemaxserver.de
|
||||||
|
uzerly.net
|
||||||
|
uzrating.com
|
||||||
|
vamaker.com
|
||||||
|
variti.net
|
||||||
|
vdoing.com
|
||||||
|
verypopularwebsite.com
|
||||||
|
vidigital.ru
|
||||||
|
viewar.org
|
||||||
|
vihtori-analytics.fi
|
||||||
|
vinsight.de
|
||||||
|
vira.ru
|
||||||
|
visilabs.net
|
||||||
|
visitor-stats.de
|
||||||
|
visits.lt
|
||||||
|
vivistats.com
|
||||||
|
vm5apis.com
|
||||||
|
volgograd-info.ru
|
||||||
|
vologda-info.ru
|
||||||
|
volvelle.tech
|
||||||
|
vtracy.de
|
||||||
|
warlog.ru
|
||||||
|
way2traffic.com
|
||||||
|
wcfbc.net
|
||||||
|
web-visor.com
|
||||||
|
webads.eu
|
||||||
|
webcompteur.com
|
||||||
|
webdissector.com
|
||||||
|
webest.info
|
||||||
|
webgozar.com
|
||||||
|
webgozar.ir
|
||||||
|
webhits.de
|
||||||
|
weblist.de
|
||||||
|
weblog.com.ua
|
||||||
|
webmeter.ws
|
||||||
|
webmobile.ws
|
||||||
|
webprospector.de
|
||||||
|
webserviceaward.com
|
||||||
|
webservis.gen.tr
|
||||||
|
websitesampling.com
|
||||||
|
webstat.no
|
||||||
|
webstatistika.lv
|
||||||
|
webtalking.ru
|
||||||
|
webtrekk-us.net
|
||||||
|
webtrekk.de
|
||||||
|
webtrekk.net
|
||||||
|
webttracking.de
|
||||||
|
webturn.ru
|
||||||
|
webvisor.com
|
||||||
|
webvisor.ru
|
||||||
|
wecount4u.com
|
||||||
|
welt-der-links.de
|
||||||
|
whoseesyou.com
|
||||||
|
winitout.com
|
||||||
|
wipe.de
|
||||||
|
wonder-ma.com
|
||||||
|
wos.lv
|
||||||
|
wstatslive.com
|
||||||
|
wwgate.ru
|
||||||
|
www.hey.lt
|
||||||
|
wysistat.com
|
||||||
|
x-traceur.com
|
||||||
|
xclaimwords.net
|
||||||
|
xcounter.ch
|
||||||
|
xhit.com
|
||||||
|
xplosion.de
|
||||||
|
xtgreat.com
|
||||||
|
xtractor.no
|
||||||
|
yektanet.com
|
||||||
|
yhjinm.cn
|
||||||
|
yieldbird.com
|
||||||
|
yigao.com
|
||||||
|
yoochoose.net
|
||||||
|
youle55.com
|
||||||
|
ywywjrlbsuv.com
|
||||||
|
zaehler.tv
|
||||||
|
zampda.net
|
||||||
|
zero.kz
|
||||||
|
zipstat.dk
|
||||||
|
zirve100.com
|
||||||
|
ziyu.net
|
||||||
|
zmctrack.net
|
||||||
|
zontera.com
|
||||||
|
ztcadx.com
|
||||||
580
src/lists/tracker_exodus.txt
Normal file
580
src/lists/tracker_exodus.txt
Normal file
@@ -0,0 +1,580 @@
|
|||||||
|
247realmedia.com
|
||||||
|
2mdn.net
|
||||||
|
3lift.com
|
||||||
|
4seeresults.com
|
||||||
|
a.fiksu.com
|
||||||
|
a.tiles.mapbox.com
|
||||||
|
a4.tl
|
||||||
|
aatkit.com
|
||||||
|
abtasty.com
|
||||||
|
accengage.com
|
||||||
|
account.talkingdata.com
|
||||||
|
acrcloud.com
|
||||||
|
actv8technologies.com
|
||||||
|
ad-brix.com
|
||||||
|
ad.cauly.co.kr
|
||||||
|
ad.crwdcntrl.net
|
||||||
|
ad4game.com
|
||||||
|
ad4push.com
|
||||||
|
ad4screen.com
|
||||||
|
adc3-launch.adcolony.com
|
||||||
|
adcolony.com
|
||||||
|
adform.com
|
||||||
|
adformdsp.net
|
||||||
|
adfurikun.jp
|
||||||
|
adj.st
|
||||||
|
adjust.com
|
||||||
|
adlibr.com
|
||||||
|
adm.dynamicyield.com
|
||||||
|
admixer.co.kr
|
||||||
|
adnxs.com
|
||||||
|
adotsolution.com
|
||||||
|
adproxy.fyber.com
|
||||||
|
ads.adadapted.com
|
||||||
|
ads.aerserv.com
|
||||||
|
ads.api.vungle.com
|
||||||
|
ads.glispa.com
|
||||||
|
ads.heyzap.com
|
||||||
|
ads.mobclix.com
|
||||||
|
ads.pubmatic.com
|
||||||
|
ads.rubiconproject.com
|
||||||
|
ads.tapdaq.com
|
||||||
|
ads30.adcolony.com
|
||||||
|
adsafeprotected.com
|
||||||
|
adserver.unityads.unity3d.com
|
||||||
|
adsrvr.org
|
||||||
|
adswizz.com
|
||||||
|
adtech.de
|
||||||
|
adtheorent.com
|
||||||
|
adx.adform.net
|
||||||
|
adzerk.com
|
||||||
|
adzerk.net
|
||||||
|
akamai.smartadserver.com
|
||||||
|
akamai.vungle-cdn.vungle.com
|
||||||
|
aktrack.pubmatic.com
|
||||||
|
alog.umeng.com
|
||||||
|
alogs.umeng.com
|
||||||
|
amobee.com
|
||||||
|
amplitude.com
|
||||||
|
analytics-server.gimbal.com
|
||||||
|
analytics.ad.daum.net
|
||||||
|
analytics.foresee.com
|
||||||
|
analytics.localytics.com
|
||||||
|
analytics.mobile.yandex.net
|
||||||
|
analytics.rayjump.com
|
||||||
|
analytics.social.unity.com
|
||||||
|
analytics.tapad.com
|
||||||
|
analytics.yinzcam.com
|
||||||
|
android-quinoa-config-prod.sense360eng.com
|
||||||
|
androidads20.adcolony.com
|
||||||
|
androidads21.adcolony.com
|
||||||
|
androidads23.adcolony.com
|
||||||
|
aos.wall.youmi.net
|
||||||
|
aotter.net
|
||||||
|
api-device.mocaplatform.com
|
||||||
|
api.adflake.com
|
||||||
|
api.airpush.com
|
||||||
|
api.alphonso.tv
|
||||||
|
api.altamob.com
|
||||||
|
api.amplitude.com
|
||||||
|
api.appsee.com
|
||||||
|
api.apptentive.com
|
||||||
|
api.beaconinside.com
|
||||||
|
api.branch.io
|
||||||
|
api.cloudmobi.net
|
||||||
|
api.crittercism.com
|
||||||
|
api.crowdtangle.com
|
||||||
|
api.dynamicyield.com
|
||||||
|
api.findgravy.com
|
||||||
|
api.gimbal.com
|
||||||
|
api.giphy.com
|
||||||
|
api.hypertrack.com
|
||||||
|
api.keen.io
|
||||||
|
api.mixpanel.com
|
||||||
|
api.mobpowertech.com
|
||||||
|
api.otherlevels.com
|
||||||
|
api.pingstart.com
|
||||||
|
api.proximi.fi
|
||||||
|
api.pushspring.com
|
||||||
|
api.safegraph.com
|
||||||
|
api.segment.io
|
||||||
|
api.sentiance.com
|
||||||
|
api.swrve.com
|
||||||
|
api.taplytics.com
|
||||||
|
api.tiles.mapbox.com
|
||||||
|
api.trillbit.com
|
||||||
|
api.uca.cloud.unity3d.com
|
||||||
|
api.vungle.akadns.net
|
||||||
|
api.vungle.com
|
||||||
|
api.wonderpush.com
|
||||||
|
apidm.airpush.com
|
||||||
|
apistaging.airpush.com
|
||||||
|
apiv2.moengage.com
|
||||||
|
app-config.enhance.co
|
||||||
|
app.opentracker.net
|
||||||
|
app.roximity.com
|
||||||
|
appboy.com
|
||||||
|
appcelerator.com
|
||||||
|
appcelerator.net
|
||||||
|
appengage-video.fyber.com
|
||||||
|
appengage-video.sponsorpay.com
|
||||||
|
appload.ingest.crittercism.com
|
||||||
|
applovin.com
|
||||||
|
applvn.com
|
||||||
|
appmetrica.yandex.com
|
||||||
|
appnext.com
|
||||||
|
appnexus.com
|
||||||
|
appnexus.net
|
||||||
|
appodeal.com
|
||||||
|
appodealx.com
|
||||||
|
apportal.airpush.com
|
||||||
|
appsflyer.com
|
||||||
|
appwall.api.airpush.com
|
||||||
|
apx.moatads.com
|
||||||
|
ar.umeng.com
|
||||||
|
areametrics.com
|
||||||
|
assets.tapad.com
|
||||||
|
ati-host.net
|
||||||
|
au.youmi.net
|
||||||
|
auction.unityads.unity3d.com
|
||||||
|
auditude.com
|
||||||
|
av1.xdrig.com
|
||||||
|
avazutracking.net
|
||||||
|
avocarrot.com
|
||||||
|
axonix.com
|
||||||
|
backelite.com
|
||||||
|
backtrace.io
|
||||||
|
banner.fyber.com
|
||||||
|
banners-slb.mobile.yandex.net
|
||||||
|
banners.mobile.yandex.net
|
||||||
|
batch.com
|
||||||
|
bd.vungle.com
|
||||||
|
beta.airpush.com
|
||||||
|
billboard.vungle.com
|
||||||
|
bm.adentifi.com
|
||||||
|
brahe.apptimize.com
|
||||||
|
bugly.qq.com
|
||||||
|
c.betrad.com
|
||||||
|
c.w.inmobi.com
|
||||||
|
c2i.startappnetwork.com
|
||||||
|
c2s.startappnetwork.com
|
||||||
|
cdn-adn.rayjump.com
|
||||||
|
cdn-api.admost.com
|
||||||
|
cdn-api.swirl.com
|
||||||
|
cdn-highwinds.unityads.unity3d.com
|
||||||
|
cdn-lb.vungle.com
|
||||||
|
cdn.adswizz.com.edgesuite.net
|
||||||
|
cdn.dynamicyield.com
|
||||||
|
cdn.gigya.com
|
||||||
|
cdn.unityads.unity3d.com
|
||||||
|
cdn1.gigya.com
|
||||||
|
cdn1.smartadserver.com
|
||||||
|
cdn1.sponsorpay.com
|
||||||
|
cdn2.gigya.com
|
||||||
|
cdn2.sponsorpay.com
|
||||||
|
cdn3.gigya.com
|
||||||
|
cdn3.sponsorpay.com
|
||||||
|
cdn4.sponsorpay.com
|
||||||
|
cdnap.airpush.com
|
||||||
|
cdns.us1.gigya.com
|
||||||
|
cedexis-radar.net
|
||||||
|
cedexis.com
|
||||||
|
chartbeat.com
|
||||||
|
chartbeat.net
|
||||||
|
chartboost.com
|
||||||
|
china.inmobi.com
|
||||||
|
ci.vungle.com
|
||||||
|
click-haproxy.supersonicads.com
|
||||||
|
click.dawin.tv
|
||||||
|
click.startappservice.com
|
||||||
|
cloud.xdrig.com
|
||||||
|
cloudmobi.net
|
||||||
|
cmcm.com
|
||||||
|
colocator.net
|
||||||
|
commander1.com
|
||||||
|
comscore.com
|
||||||
|
config-ltvp.inmobi.com
|
||||||
|
config.inmobi.com
|
||||||
|
config.uca.cloud.unity3d.com
|
||||||
|
config.unityads.unity3d.com
|
||||||
|
content.swrve.com
|
||||||
|
contextual.media.net
|
||||||
|
control.kochava.com
|
||||||
|
conversantmedia.com
|
||||||
|
crashlytics.com
|
||||||
|
criteo.com
|
||||||
|
ct.pinterest.com
|
||||||
|
cuebiq.com
|
||||||
|
cws.conviva.com
|
||||||
|
cx.ssacdn.com
|
||||||
|
data-location.enhance.co
|
||||||
|
data.de.coremetrics.com
|
||||||
|
data.mobclix.com
|
||||||
|
data.vungle.com
|
||||||
|
databerries.com
|
||||||
|
dc.webtrends.com
|
||||||
|
de.ioam.de
|
||||||
|
de.rayjump.com
|
||||||
|
de01.rayjump.com
|
||||||
|
debug.aerserv.com
|
||||||
|
decide.mixpanel.com
|
||||||
|
deliver.oztam.com.au
|
||||||
|
deltadna.net
|
||||||
|
demdex.net
|
||||||
|
detect.rayjump.com
|
||||||
|
dev-api.persona.ly
|
||||||
|
dev.dsp.persona.ly
|
||||||
|
dev.persona.ly
|
||||||
|
device-api.urbanairship.com
|
||||||
|
devices.carnivalmobile.com
|
||||||
|
diff.smartadserver.com
|
||||||
|
diff2.smartadserver.com
|
||||||
|
diff3.smartadserver.com
|
||||||
|
dispatcher.mng-ads.com
|
||||||
|
display.io
|
||||||
|
dmtry.com
|
||||||
|
doubleclick.com
|
||||||
|
doubleclick.net
|
||||||
|
dov-e.com
|
||||||
|
dsp.persona.ly
|
||||||
|
dts.startappservice.com
|
||||||
|
duapps.com
|
||||||
|
dynatrace.com
|
||||||
|
e-ssl.apsalar.com
|
||||||
|
e.apsalar.com
|
||||||
|
ehawk.com
|
||||||
|
engine.adzerk.net
|
||||||
|
engine.fyber.com
|
||||||
|
engine.sponsorpay.com
|
||||||
|
eqx.smartadserver.com
|
||||||
|
et.w.inmobi.com
|
||||||
|
etl.tindersparks.com
|
||||||
|
eulerian.com
|
||||||
|
event.split.io
|
||||||
|
events.startappservice.com
|
||||||
|
events.uber.com
|
||||||
|
events3alt.adcolony.com
|
||||||
|
evt.tamoco.com
|
||||||
|
exp.glispa.com
|
||||||
|
facebook.com
|
||||||
|
fastlane.rubiconproject.com
|
||||||
|
fidzup
|
||||||
|
files.adform.net
|
||||||
|
firebase.com
|
||||||
|
fk-mtrack.rayjump.com
|
||||||
|
flurry.com
|
||||||
|
foresee.com
|
||||||
|
foreseeresults.com
|
||||||
|
frm.acuant.net
|
||||||
|
fwmrm.net
|
||||||
|
fyc.heyzap.com
|
||||||
|
g.jwpsrv.com
|
||||||
|
gads.pubmatic.com
|
||||||
|
gallery.smartadserver.com
|
||||||
|
gemius.pl
|
||||||
|
geo.moatads.com
|
||||||
|
geodata.otherlevels.com
|
||||||
|
ginf.adfurikun.jp
|
||||||
|
glympse.com
|
||||||
|
go.admost.com
|
||||||
|
google-analytics.com
|
||||||
|
google.com
|
||||||
|
graph.accountkit.com
|
||||||
|
hb-minify-juc1ugur1qwqqqo4.stackpathdns.com
|
||||||
|
heapanalytics.com
|
||||||
|
helpshift.com
|
||||||
|
hockeyapp.net
|
||||||
|
houndify.com
|
||||||
|
hybird.rayjump.com
|
||||||
|
hypertrack.amazonaws.com
|
||||||
|
hyprmx.com
|
||||||
|
i.4see.mobi
|
||||||
|
i.l.inmobicdn.net
|
||||||
|
i.w.inmobi.com
|
||||||
|
iasds01.com
|
||||||
|
im2.smartadserver.com
|
||||||
|
image2.pubmatic.com
|
||||||
|
images.startappservice.com
|
||||||
|
img-cloudflare-2.haizap.com
|
||||||
|
img-cloudflare.haizap.com
|
||||||
|
imp.startappservice.com
|
||||||
|
incoming-data-sense360.s3.amazonaws.com
|
||||||
|
info.static.startappservice.com
|
||||||
|
ingest.vungle.com
|
||||||
|
init.startappservice.com
|
||||||
|
init.supersonicads.com
|
||||||
|
inlocomedia.com
|
||||||
|
inmobi.cn
|
||||||
|
inmobi.com
|
||||||
|
inmobi.info
|
||||||
|
inmobi.net
|
||||||
|
inmobi.us
|
||||||
|
inmobicdn.com
|
||||||
|
inmobicdn.net
|
||||||
|
inmobisdk-a.akamaihd.net
|
||||||
|
inrix.com
|
||||||
|
inrix.io
|
||||||
|
insight.adsrvr.org
|
||||||
|
instreamatic.com
|
||||||
|
integralads.com
|
||||||
|
interstitial.fyber.com
|
||||||
|
ipsws.indooratlas.com
|
||||||
|
itx5-publicidad.smartadserver.com
|
||||||
|
itx5.smartadserver.com
|
||||||
|
jaeger.vungle.com
|
||||||
|
japan.inmobi.com
|
||||||
|
js-agent.newrelic.com
|
||||||
|
js.adsrvr.org
|
||||||
|
js.moatads.com
|
||||||
|
jssdk.rayjump.com
|
||||||
|
jwpltx.com
|
||||||
|
kiip.me
|
||||||
|
kontakt.io
|
||||||
|
krxd.net
|
||||||
|
kvinit-prod.api.kochava.com
|
||||||
|
leanplum.com
|
||||||
|
ligatus.com
|
||||||
|
lisnr.com
|
||||||
|
loadus.exelator.com
|
||||||
|
locuslabs.com
|
||||||
|
log.mobpowertech.com
|
||||||
|
log.pinterest.com
|
||||||
|
logger.cloudmobi.net
|
||||||
|
loggly.com
|
||||||
|
login.microsoftonline.com
|
||||||
|
logs.supersonic.com
|
||||||
|
ltv-data-api.kube-prod.vungle.com
|
||||||
|
m.airpush.com
|
||||||
|
m.talkingdata.com
|
||||||
|
m2m-api.inmarket.com
|
||||||
|
management.azure.com
|
||||||
|
manifest.localytics.com
|
||||||
|
map.baidu.com
|
||||||
|
map.qq.com
|
||||||
|
marketo.com
|
||||||
|
marketo.net
|
||||||
|
mars.telequid.com
|
||||||
|
match.adsrvr.org
|
||||||
|
matomo.org
|
||||||
|
mb.moatads.com
|
||||||
|
mbe-cdn.fyber.com
|
||||||
|
mc.yandex.ru
|
||||||
|
md-a-c.apptimize.com
|
||||||
|
md-a-s.apptimize.com
|
||||||
|
mdn.otherlevels.com
|
||||||
|
med-api.admost.com
|
||||||
|
med.heyzap.com
|
||||||
|
media.net
|
||||||
|
medicscan.acuant.net
|
||||||
|
metrics.adflake.com
|
||||||
|
metrics.brightcove.com
|
||||||
|
millennialmedia.com
|
||||||
|
mixpanel.com
|
||||||
|
mktoedge.com
|
||||||
|
mktossl.com
|
||||||
|
mng-ads.com
|
||||||
|
moat.com
|
||||||
|
mobclix.com
|
||||||
|
mobile-collector.newrelic.com
|
||||||
|
mobile.mng-ads.com
|
||||||
|
mobileanalytics.us-east-1.amazonaws.com
|
||||||
|
mobileapptracking.com
|
||||||
|
mobpowertech.com
|
||||||
|
mobvista.com
|
||||||
|
monitoring.vungle.com
|
||||||
|
moodpresence.com
|
||||||
|
mopub.com
|
||||||
|
mparticle.com
|
||||||
|
mqtt.evrythng.com
|
||||||
|
nativex.com
|
||||||
|
net.rayjump.com
|
||||||
|
newrelic.com
|
||||||
|
nexage.com
|
||||||
|
nexus.ensighten.com
|
||||||
|
nr-data.net
|
||||||
|
oc.umeng.com
|
||||||
|
offer.fyber.com
|
||||||
|
omniture.com
|
||||||
|
omtrdc.net
|
||||||
|
onesignal.com
|
||||||
|
online.rayjump.com
|
||||||
|
ooyala.com
|
||||||
|
openx.com
|
||||||
|
openx.net
|
||||||
|
openx.org
|
||||||
|
optimized-by.rubiconproject.com
|
||||||
|
optimizely.com
|
||||||
|
outbrain.com
|
||||||
|
outcome.supersonicads.com
|
||||||
|
ow-gateway.supersonicads.com
|
||||||
|
p.jwpcdn.com
|
||||||
|
partner-service.link
|
||||||
|
persona.ly
|
||||||
|
ping.tapylitics.com
|
||||||
|
pingback.giphy.com
|
||||||
|
pixel-tracking.sonic-us.supersonicads.com
|
||||||
|
pixel.mathtag.com
|
||||||
|
pixel.moatads.com
|
||||||
|
pixel.rubiconproject.com
|
||||||
|
pixel.tapad.com
|
||||||
|
presage.io
|
||||||
|
preview.smartadserver.com
|
||||||
|
profile.localytics.com
|
||||||
|
prov.alphonso.tv
|
||||||
|
proximitykit.radiusnetworks.com
|
||||||
|
pubnative.net
|
||||||
|
push.xdrig.com
|
||||||
|
pushwoosh.com
|
||||||
|
px.dynamicyield.com
|
||||||
|
px.moatads.com
|
||||||
|
pyze.com
|
||||||
|
qualtrics.com
|
||||||
|
quantcast.com
|
||||||
|
quantcast.net
|
||||||
|
quinoa-personal-identify-prod.sense360eng.com
|
||||||
|
r.w.inmobi.com
|
||||||
|
radar.cedexis.com
|
||||||
|
rayjump.com
|
||||||
|
rec.replay.answerscloud.com
|
||||||
|
recommender.scarabresearch.com
|
||||||
|
registration.gimbal.com
|
||||||
|
report.appmetrica.yandex.net
|
||||||
|
req.startappservice.com
|
||||||
|
rich.otherlevels.com
|
||||||
|
rtb-csync.smartadserver.com
|
||||||
|
rtb.adentifi.com
|
||||||
|
rtb.persona.ly
|
||||||
|
rtb.platform.glispa.com
|
||||||
|
rv-gateway.supersonicads.com
|
||||||
|
s.mobclix.com
|
||||||
|
s4m.io
|
||||||
|
sam4m.com
|
||||||
|
saspreview.com
|
||||||
|
scandit.com
|
||||||
|
scheme.mobpowertech.com
|
||||||
|
schibsted.com
|
||||||
|
schibsted.io
|
||||||
|
scorecardresearch.com
|
||||||
|
sdk-assets.localytics.com
|
||||||
|
sdk-info.gimbal.com
|
||||||
|
sdk.adbuddiz.com
|
||||||
|
sdk.adincube.com
|
||||||
|
sdk.adotmob.com
|
||||||
|
sdk.appbrain.com
|
||||||
|
sdk.fiksu.com
|
||||||
|
sdk.follow-apps.com
|
||||||
|
sdk.foursquare.com
|
||||||
|
sdk.gpshopper.com
|
||||||
|
sdk.persona.ly
|
||||||
|
sdk.shopkick.com
|
||||||
|
sdk.split.io
|
||||||
|
sdk6.ibm.xtify.com
|
||||||
|
sdkm.w.inmobi.com
|
||||||
|
sdktm.w.inmobi.com
|
||||||
|
segment.com
|
||||||
|
sejs.moatads.com
|
||||||
|
service.fyber.com
|
||||||
|
services.assureid.net
|
||||||
|
serving-sys.com
|
||||||
|
setting.rayjump.com
|
||||||
|
sg-mtrack.rayjump.com
|
||||||
|
sg.rayjump.com
|
||||||
|
sg01.rayjump.com
|
||||||
|
shopkick.com
|
||||||
|
shopkick.de
|
||||||
|
signal360.com
|
||||||
|
silverpush.co
|
||||||
|
silverpush.com
|
||||||
|
simage2.pubmatic.com
|
||||||
|
singlespot.com
|
||||||
|
smaato.net
|
||||||
|
smartadserver.com
|
||||||
|
smartadserver.ru
|
||||||
|
smartlook.com
|
||||||
|
soda.startappservice.com
|
||||||
|
soma.smaato.net
|
||||||
|
sonicnotify.com
|
||||||
|
soom.la
|
||||||
|
ssl.vungle.com
|
||||||
|
st.dynamicyield.com
|
||||||
|
stags.bluekai.com
|
||||||
|
startappservice.com
|
||||||
|
startup.mobile.yandex.net
|
||||||
|
static.adzerk.net
|
||||||
|
static.ssacdn.com
|
||||||
|
statistics.videofarm.daum.net
|
||||||
|
stats.aws.rubiconproject.com
|
||||||
|
stats.unity3d.com
|
||||||
|
supersonic.com
|
||||||
|
supersonicads-a.akamaihd.net
|
||||||
|
switchboard.mixpanel.com
|
||||||
|
sync.adotmob.com
|
||||||
|
sync2ad.com
|
||||||
|
synerise.com
|
||||||
|
sypi.gpshopper.com
|
||||||
|
taboola.com
|
||||||
|
tag-mediation.supersonic.com
|
||||||
|
tags.bluekai.com
|
||||||
|
tags.otherlevels.com
|
||||||
|
tap2-cdn.rubiconproject.com
|
||||||
|
tapestry.tapad.com
|
||||||
|
tapjoy.com
|
||||||
|
tapjoyads.com
|
||||||
|
target.my.com
|
||||||
|
teads.tv
|
||||||
|
tealiumiq.com
|
||||||
|
tele.fm
|
||||||
|
templates.glispaconnect.com
|
||||||
|
tiqcdn.com
|
||||||
|
tknet.rayjump.com
|
||||||
|
tmk.smartadserver.com
|
||||||
|
track.adform.net
|
||||||
|
tracker-api.my.com
|
||||||
|
tracker.adotmob.com
|
||||||
|
tracker.fyber.com
|
||||||
|
trck.at
|
||||||
|
trk.glispa.com
|
||||||
|
trk.pinterest.com
|
||||||
|
tusdk.com
|
||||||
|
txn.ingest.crittercism.com
|
||||||
|
ua.supersonicads.com
|
||||||
|
ultimedia.com
|
||||||
|
umeng.com
|
||||||
|
uop.umeng.com
|
||||||
|
urbanairship.com
|
||||||
|
us-ads.openx.net
|
||||||
|
us01.rayjump.com
|
||||||
|
usw-lax.adsrvr.org
|
||||||
|
v.ssacdn.com
|
||||||
|
v.vungle.com
|
||||||
|
va.origin.startappservice.com
|
||||||
|
vast.cloudmobi.net
|
||||||
|
vectaury.io
|
||||||
|
video-ads.rubiconproject.com
|
||||||
|
video-interstitial-assets-cdn.fyber.com
|
||||||
|
video.fyber.com
|
||||||
|
w.inmobi.com
|
||||||
|
wd.adcolony.com
|
||||||
|
weborama.fr
|
||||||
|
weborama.net
|
||||||
|
webtrends.com
|
||||||
|
webview.unityads.unity3d.com
|
||||||
|
widespace.com
|
||||||
|
wootric.com
|
||||||
|
wootric.com.herokudns.com
|
||||||
|
ws.findgravy.com
|
||||||
|
ws.otherlevels.com
|
||||||
|
www.5rocks.io
|
||||||
|
www.googletagmanager.com
|
||||||
|
www.googletagservices.com
|
||||||
|
www.supersonicads.com
|
||||||
|
wzrkt.com
|
||||||
|
x.heyzap.com
|
||||||
|
yoc-performance.com
|
||||||
|
yoc.com
|
||||||
|
youmi.net
|
||||||
|
yt.moatads.com
|
||||||
|
yts.moatads.com
|
||||||
|
z.moatads.com
|
||||||
|
zapr.in
|
||||||
|
zucks.net
|
||||||
3538
src/lists/tracker_lowe.txt
Normal file
3538
src/lists/tracker_lowe.txt
Normal file
File diff suppressed because it is too large
Load Diff
70
src/main.py
70
src/main.py
@@ -1,23 +1,13 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import os
|
||||||
import common_lib as mylib
|
import common_lib as mylib
|
||||||
import bundle_import
|
|
||||||
import bundle_combine
|
import bundle_combine
|
||||||
import bundle_download
|
import bundle_download
|
||||||
import html_root
|
import html_root
|
||||||
import html_index
|
import html_index
|
||||||
import html_bundle
|
import html_bundle
|
||||||
|
import tracker_download
|
||||||
|
|
||||||
def reset_new():
|
|
||||||
print("RESET json files ...")
|
|
||||||
prefix = mylib.path_len(mylib.path_data())
|
|
||||||
for bid in mylib.enum_appids():
|
|
||||||
for src, _ in mylib.enum_jsons(bid):
|
|
||||||
frmt = mylib.path_add(mylib.path_data('_in', '%s.json'))
|
|
||||||
dest = bundle_import.next_path(frmt)
|
|
||||||
mylib.mv(src, dest, printOmitPrefix=prefix)
|
|
||||||
print('')
|
|
||||||
|
|
||||||
|
|
||||||
def del_id(bundle_ids):
|
def del_id(bundle_ids):
|
||||||
@@ -31,25 +21,51 @@ def del_id(bundle_ids):
|
|||||||
html_index.process()
|
html_index.process()
|
||||||
|
|
||||||
|
|
||||||
def full_chain(force=False):
|
def combine_and_update(bundle_ids, where=None, forceGraphs=False):
|
||||||
bundle_ids = bundle_import.process()
|
affected = bundle_combine.process(bundle_ids, where=where)
|
||||||
if force:
|
if len(affected) == 0:
|
||||||
bundle_ids = list(mylib.enum_data_appids())
|
print('no bundle affected by tracker, not generating bundle html')
|
||||||
if len(bundle_ids) > 0:
|
return
|
||||||
bundle_combine.process(bundle_ids)
|
new_ids = html_bundle.process(affected, forceGraphs=forceGraphs)
|
||||||
new_ids = html_bundle.process(bundle_ids)
|
if len(new_ids) == 0:
|
||||||
if len(new_ids) > 0:
|
print('no new bundle, not rebuilding index')
|
||||||
bundle_download.process(new_ids)
|
return
|
||||||
html_index.process()
|
bundle_download.process(new_ids)
|
||||||
html_root.process()
|
html_index.process()
|
||||||
|
html_root.process()
|
||||||
|
|
||||||
|
|
||||||
|
def import_update():
|
||||||
|
print('checking incoming data ...')
|
||||||
|
needs_update = set()
|
||||||
|
for fname, bid in mylib.enum_newly_added():
|
||||||
|
if bid == '_manually':
|
||||||
|
# TODO: notify admin that manual action is required
|
||||||
|
mylib.err('import', 'manual action required!')
|
||||||
else:
|
else:
|
||||||
print('none to import, not rebuilding index')
|
print(' ' + bid)
|
||||||
|
needs_update.add(bid)
|
||||||
|
os.remove(fname)
|
||||||
|
print('')
|
||||||
|
if len(needs_update) > 0:
|
||||||
|
combine_and_update(needs_update, forceGraphs=True)
|
||||||
|
|
||||||
|
|
||||||
|
def tracker_update():
|
||||||
|
new_trackers = tracker_download.process()
|
||||||
|
if new_trackers:
|
||||||
|
combine_and_update(['*'], where=new_trackers)
|
||||||
|
|
||||||
|
|
||||||
def process():
|
def process():
|
||||||
# reset_new()
|
# del_id(['_manually'])
|
||||||
# del_id(['*'])
|
import_update()
|
||||||
full_chain(force=False)
|
# tracker_update()
|
||||||
|
# tracker_download.combine_all('x')
|
||||||
|
# combine_and_update(['*']) # where=['test.com']
|
||||||
|
# if bundle_download.download_missing_icons(force=False):
|
||||||
|
# html_index.process()
|
||||||
|
# html_index.process()
|
||||||
|
|
||||||
|
|
||||||
process()
|
process()
|
||||||
|
|||||||
149
src/tracker_download.py
Executable file
149
src/tracker_download.py
Executable file
@@ -0,0 +1,149 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import common_lib as mylib
|
||||||
|
# import hashlib
|
||||||
|
|
||||||
|
known_trackers = None
|
||||||
|
|
||||||
|
|
||||||
|
# def md5(fname):
|
||||||
|
# hash_md5 = hashlib.md5()
|
||||||
|
# with open(fname, 'rb') as f:
|
||||||
|
# for chunk in iter(lambda: f.read(4096), b''):
|
||||||
|
# hash_md5.update(chunk)
|
||||||
|
# return hash_md5.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def save_list(result_set, fname, binary=False):
|
||||||
|
if not result_set:
|
||||||
|
return False
|
||||||
|
out = mylib.path_root('src', 'lists', fname)
|
||||||
|
with open(out + '_tmp', 'wb' if binary else 'w') as fp:
|
||||||
|
end = b'\n' if binary else '\n'
|
||||||
|
for domain in sorted(result_set):
|
||||||
|
fp.write(domain + end)
|
||||||
|
try:
|
||||||
|
changes = mylib.diff_files(out, out + '_tmp')
|
||||||
|
except Exception:
|
||||||
|
changes = list(result_set)
|
||||||
|
mylib.mv(out + '_tmp', out)
|
||||||
|
# md5_old = md5(out) if mylib.file_exists(out) else None
|
||||||
|
# md5_new = md5(out)
|
||||||
|
if changes:
|
||||||
|
print(' updating: ' + fname)
|
||||||
|
else:
|
||||||
|
print(' no-change: ' + fname)
|
||||||
|
return changes
|
||||||
|
|
||||||
|
|
||||||
|
def enum_lines(url, ignore=None):
|
||||||
|
whole = mylib.download(url)
|
||||||
|
for line in whole.split(b'\n'):
|
||||||
|
if not line or ignore and line.startswith(ignore):
|
||||||
|
continue
|
||||||
|
yield line
|
||||||
|
|
||||||
|
|
||||||
|
def github(path):
|
||||||
|
return 'https://raw.githubusercontent.com/' + path
|
||||||
|
|
||||||
|
|
||||||
|
def lockdown(fname, urlname):
|
||||||
|
url = github('confirmedcode/lockdown-ios/master/LockdowniOS/') + urlname
|
||||||
|
return save_list(set(enum_lines(url)), fname, binary=True)
|
||||||
|
|
||||||
|
|
||||||
|
def easylist(fname, urlname):
|
||||||
|
url = github('easylist/easylist/master/easyprivacy/') + urlname
|
||||||
|
res = set()
|
||||||
|
for x in enum_lines(url, b'!'):
|
||||||
|
if not x.startswith(b'||'):
|
||||||
|
continue
|
||||||
|
x = x[2:]
|
||||||
|
parts = x.split(b'^')
|
||||||
|
if len(parts) == 1:
|
||||||
|
parts = x.split(b'$')
|
||||||
|
res.add(parts[0].split(b'/')[0])
|
||||||
|
return save_list(res, fname, binary=True)
|
||||||
|
|
||||||
|
|
||||||
|
def lowe(fname):
|
||||||
|
res = set()
|
||||||
|
for x in enum_lines('https://pgl.yoyo.org/adservers/serverlist.php'
|
||||||
|
'?hostformat=hosts&mimetype=plaintext', b'#'):
|
||||||
|
p = x.split()
|
||||||
|
if len(p) != 2:
|
||||||
|
mylib.err('tracker-list', 'Lowe: parsing error')
|
||||||
|
continue
|
||||||
|
res.add(p[1])
|
||||||
|
return save_list(res, fname, binary=True)
|
||||||
|
|
||||||
|
|
||||||
|
def exodus(fname):
|
||||||
|
res = set()
|
||||||
|
url = 'https://etip.exodus-privacy.eu.org/trackers/export'
|
||||||
|
json = mylib.download(url, isJSON=True)
|
||||||
|
try:
|
||||||
|
for entry in json['trackers']:
|
||||||
|
net = entry['network_signature']
|
||||||
|
if not net:
|
||||||
|
continue
|
||||||
|
net = net.replace('\\.', '.').replace('\\-', '-')
|
||||||
|
for dom in net.split('|'):
|
||||||
|
if dom[-1] in '/.':
|
||||||
|
continue
|
||||||
|
if dom[0] in '\\.':
|
||||||
|
dom = dom[1:]
|
||||||
|
res.add(dom)
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
return save_list(res, fname, binary=False)
|
||||||
|
|
||||||
|
|
||||||
|
def is_tracker(domain):
|
||||||
|
global known_trackers
|
||||||
|
if not known_trackers:
|
||||||
|
known_trackers = mylib.read_list('tracker_all.txt')
|
||||||
|
return mylib.bintree_lookup(known_trackers, domain[::-1])
|
||||||
|
|
||||||
|
|
||||||
|
def combine_all(changes):
|
||||||
|
final = mylib.path_root('src', 'lists', 'tracker_all.txt')
|
||||||
|
if changes or not mylib.file_exists(final):
|
||||||
|
print(' updating: tracker_all.txt')
|
||||||
|
else:
|
||||||
|
print(' no-change: tracker_all.txt')
|
||||||
|
return
|
||||||
|
res = set()
|
||||||
|
for fname in ['custom.txt', 'lowe.txt', 'easylist.txt', 'easylist_int.txt',
|
||||||
|
'exodus.txt', 'lockdown_clickbait.txt',
|
||||||
|
'lockdown_marketing.txt', 'lockdown_game_ads.txt']:
|
||||||
|
for dom in mylib.read_list('tracker_' + fname):
|
||||||
|
if dom == 'google.com':
|
||||||
|
continue # added by exodus, not a tracker per se
|
||||||
|
res.add(dom[::-1]) # reverse for bintree lookup
|
||||||
|
with open(final, 'w') as fp:
|
||||||
|
for domain in sorted(res):
|
||||||
|
fp.write(domain + '\n')
|
||||||
|
|
||||||
|
|
||||||
|
def process():
|
||||||
|
print('downloading tracker domains ...')
|
||||||
|
changes = []
|
||||||
|
changes += lowe('tracker_lowe.txt')
|
||||||
|
changes += easylist('tracker_easylist.txt',
|
||||||
|
'easyprivacy_trackingservers.txt')
|
||||||
|
changes += easylist('tracker_easylist_int.txt',
|
||||||
|
'easyprivacy_trackingservers_international.txt')
|
||||||
|
changes += exodus('tracker_exodus.txt')
|
||||||
|
# changes += lockdown('tracker_lockdown_clickbait.txt', 'clickbait.txt')
|
||||||
|
# changes += lockdown('tracker_lockdown_marketing.txt', 'marketing.txt')
|
||||||
|
# changes += lockdown('tracker_lockdown_game_ads.txt', 'game_ads.txt')
|
||||||
|
combine_all(changes)
|
||||||
|
print('')
|
||||||
|
return changes
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# combine_all()
|
||||||
|
process()
|
||||||
Reference in New Issue
Block a user