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*/
|
||||
}
|
||||
header { height: 50px; }
|
||||
header img { vertical-align: top; padding-right: 7px; }
|
||||
header img { vertical-align: top; padding: 0 7px; }
|
||||
header h1 {
|
||||
line-height: 50px;
|
||||
font-family: "Raleway", sans-serif;
|
||||
@@ -69,10 +69,11 @@ td { padding: 0.2em 1em 0.2em 0.1em; }
|
||||
#app-toc div {
|
||||
display: inline-block;
|
||||
width: 140px;
|
||||
height: 12em;
|
||||
overflow: hidden;
|
||||
margin: 5px;
|
||||
padding: 16px;
|
||||
vertical-align: top;
|
||||
height: min-content;
|
||||
background: #eee;
|
||||
word-wrap: break-word;
|
||||
border: 1pt solid #ccc;
|
||||
@@ -83,7 +84,7 @@ td { padding: 0.2em 1em 0.2em 0.1em; }
|
||||
margin: 0.5em auto 1em;
|
||||
display: block;
|
||||
}
|
||||
#app-toc img, #get-appcheck img {
|
||||
#app-toc img, #get-appcheck img, #appicon {
|
||||
border-radius: 21.5%;
|
||||
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.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 }
|
||||
#connections i {
|
||||
font-size: 0.9em;
|
||||
@@ -106,4 +110,6 @@ td { padding: 0.2em 1em 0.2em 0.1em; }
|
||||
display: inline-block;
|
||||
margin: 0.12em;
|
||||
}
|
||||
#connections i.bad { border-color: red; }
|
||||
#connections td { vertical-align: top; }
|
||||
#connections figure { display: inline-block; }
|
||||
|
||||
@@ -2,22 +2,24 @@
|
||||
|
||||
import sys
|
||||
import common_lib as mylib
|
||||
import tracker_download as tracker
|
||||
|
||||
|
||||
with open(mylib.path_root('src', '3rd-domains.txt'), 'r') as fp:
|
||||
level3_doms = set([x.strip() for x in fp.readlines()])
|
||||
level3_doms = None
|
||||
|
||||
|
||||
def dom_in_3rd_domain(needle):
|
||||
# TODO: binary tree lookup
|
||||
return needle in level3_doms
|
||||
global 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):
|
||||
parts = subdomain.split('.')
|
||||
if len(parts) < 3:
|
||||
return x
|
||||
elif dom_in_3rd_domain('.'.join(parts[-2:])):
|
||||
return subdomain
|
||||
elif dom_in_3rd_domain(parts[-1] + '.' + parts[-2]):
|
||||
return '.'.join(parts[-3:])
|
||||
else:
|
||||
return '.'.join(parts[-2:])
|
||||
@@ -46,6 +48,7 @@ def json_combine(bundle_id):
|
||||
uniq_par = set()
|
||||
for subdomain in logs:
|
||||
occurs = len(logs[subdomain])
|
||||
sub_tracker = tracker.is_tracker(subdomain)
|
||||
dict_increment(res, '#logs', occurs)
|
||||
dict_increment(domA, subdomain, 1)
|
||||
dict_increment(domB, subdomain, occurs)
|
||||
@@ -60,17 +63,40 @@ def json_combine(bundle_id):
|
||||
res['uniq_pardom'] = domC
|
||||
res['total_subdom'] = domB
|
||||
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
|
||||
|
||||
|
||||
def process(bundle_ids):
|
||||
def process(bundle_ids, where=None):
|
||||
print('writing combined json ...')
|
||||
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:
|
||||
obj = 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, json_combine(bid))
|
||||
mylib.json_write_combined(bid, obj)
|
||||
affected_ids.append(bid)
|
||||
print('')
|
||||
return affected_ids
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -27,10 +27,27 @@ def download_icon(bundle_id, force=False, langs=['us', 'de']):
|
||||
json = None
|
||||
for lang in langs:
|
||||
if not json:
|
||||
try:
|
||||
json = mylib.json_read_meta(bundle_id, lang)
|
||||
except Exception:
|
||||
continue
|
||||
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):
|
||||
if not mylib.valid_bundle_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
|
||||
|
||||
# same regex as in `api/v1/contribute/index.php`
|
||||
regex_bundle_id = re.compile(r'^[A-Za-z0-9\.\-]{1,155}$')
|
||||
logging.basicConfig(filename=os.path.join(os.pardir, "error.log"),
|
||||
format='%(asctime)s %(message)s',
|
||||
@@ -85,6 +86,32 @@ def printf(msg):
|
||||
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
|
||||
|
||||
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)))
|
||||
|
||||
|
||||
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
|
||||
|
||||
def download(url, isJSON=False):
|
||||
@@ -129,9 +196,8 @@ def download_file(url, path):
|
||||
# Enumerator
|
||||
|
||||
def enum_newly_added():
|
||||
for fname in glob.glob(path_data('_in', '*.json')):
|
||||
with open(fname, 'r') as fp:
|
||||
yield fname, json.load(fp)
|
||||
for fname in glob.glob(path_data('_in', 'in_*')):
|
||||
yield fname, os.path.basename(fname)[3:] # del prefix 'in_'
|
||||
|
||||
|
||||
def enum_appids():
|
||||
|
||||
@@ -15,7 +15,9 @@ def sort_dict(count_dict):
|
||||
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)
|
||||
pie1, _ = plt.pie(sizes, labels=names)
|
||||
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)
|
||||
|
||||
|
||||
def gen_domain_tags(unsorted_dict):
|
||||
for x in sorted(unsorted_dict):
|
||||
yield '<i>{}</i>'.format(x)
|
||||
def gen_dom_tags(unsorted_dict, trackers=None):
|
||||
sorted_arr = sorted(unsorted_dict, key=lambda x: (-x[1], x[0]))
|
||||
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):
|
||||
track_dom = [(dom, obj['total_subdom'][dom])
|
||||
for dom, known in obj['tracker_subdom'].items() if known]
|
||||
return mylib.template_with_base(f'''
|
||||
<h2>{obj['name']}</h2>
|
||||
<div id="meta">
|
||||
<img id="appicon" src="icon.png" width="100" height="100">
|
||||
<table>
|
||||
<tr><td>Bundle-id:</td><td>{
|
||||
bundle_id
|
||||
@@ -60,14 +70,14 @@ def gen_html(bundle_id, obj):
|
||||
<h3>Connections</h3>
|
||||
<div id="connections">
|
||||
<table>
|
||||
<tr><td>Known Trackers ({ len(track_dom) }):</td><td>{
|
||||
gen_dom_tags(track_dom)
|
||||
}</td></tr>
|
||||
<tr><td>Domains:</td><td>{
|
||||
''.join(gen_domain_tags(obj['uniq_pardom']))
|
||||
gen_dom_tags(obj['total_pardom'].items(), obj['tracker_pardom'])
|
||||
}</td></tr>
|
||||
<tr><td>Subdomains:</td><td>{
|
||||
''.join(gen_domain_tags(obj['uniq_subdom']))
|
||||
}</td></tr>
|
||||
<tr><td>Known Trackers:</td><td>{
|
||||
'...'
|
||||
gen_dom_tags(obj['total_subdom'].items(), obj['tracker_subdom'])
|
||||
}</td></tr>
|
||||
</table>
|
||||
<figure><img src="par.svg"></figure>
|
||||
@@ -75,25 +85,27 @@ def gen_html(bundle_id, obj):
|
||||
</div>''', title=obj['name'])
|
||||
|
||||
|
||||
def make_bundle_out(bundle_id):
|
||||
jdata = mylib.json_read_combined(bundle_id)
|
||||
def make_bundle_out(bundle_id, forceGraphs=False):
|
||||
json = mylib.json_read_combined(bundle_id)
|
||||
out_dir = mylib.path_out_app(bundle_id)
|
||||
needs_update_index = False
|
||||
if not mylib.dir_exists(out_dir):
|
||||
needs_update_index = True
|
||||
mylib.mkdir(out_dir)
|
||||
try:
|
||||
gen_graph(jdata['total_subdom'], mylib.path_add(out_dir, 'sub.svg'))
|
||||
gen_graph(jdata['total_pardom'], mylib.path_add(out_dir, 'par.svg'))
|
||||
gen_graph(json['total_subdom'], mylib.path_add(out_dir, 'sub.svg'),
|
||||
overwrite=forceGraphs)
|
||||
gen_graph(json['total_pardom'], mylib.path_add(out_dir, 'par.svg'),
|
||||
overwrite=forceGraphs)
|
||||
except KeyError:
|
||||
mylib.err('bundle-generate-page', 'skip: ' + bundle_id)
|
||||
|
||||
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
|
||||
|
||||
|
||||
def process(bundle_ids):
|
||||
def process(bundle_ids, forceGraphs=False):
|
||||
print('generating html pages ...')
|
||||
if bundle_ids == ['*']:
|
||||
bundle_ids = list(mylib.enum_appids())
|
||||
@@ -101,7 +113,7 @@ def process(bundle_ids):
|
||||
ids_new_in_index = set()
|
||||
for bid in bundle_ids:
|
||||
print(' ' + bid)
|
||||
if make_bundle_out(bid):
|
||||
if make_bundle_out(bid, forceGraphs=forceGraphs):
|
||||
ids_new_in_index.add(bid)
|
||||
print('')
|
||||
return ids_new_in_index
|
||||
|
||||
@@ -24,9 +24,21 @@ def gen_root():
|
||||
</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():
|
||||
print('generating root html ...')
|
||||
gen_root() # root index.thml
|
||||
gen_search() # root redirect.html?id=my.bundle.id
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -84,6 +84,31 @@ br.vet
|
||||
br.vlog
|
||||
br.wiki
|
||||
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.edu
|
||||
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
64
src/main.py
64
src/main.py
@@ -1,23 +1,13 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import common_lib as mylib
|
||||
import bundle_import
|
||||
import bundle_combine
|
||||
import bundle_download
|
||||
import html_root
|
||||
import html_index
|
||||
import html_bundle
|
||||
|
||||
|
||||
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('')
|
||||
import tracker_download
|
||||
|
||||
|
||||
def del_id(bundle_ids):
|
||||
@@ -31,25 +21,51 @@ def del_id(bundle_ids):
|
||||
html_index.process()
|
||||
|
||||
|
||||
def full_chain(force=False):
|
||||
bundle_ids = bundle_import.process()
|
||||
if force:
|
||||
bundle_ids = list(mylib.enum_data_appids())
|
||||
if len(bundle_ids) > 0:
|
||||
bundle_combine.process(bundle_ids)
|
||||
new_ids = html_bundle.process(bundle_ids)
|
||||
if len(new_ids) > 0:
|
||||
def combine_and_update(bundle_ids, where=None, forceGraphs=False):
|
||||
affected = bundle_combine.process(bundle_ids, where=where)
|
||||
if len(affected) == 0:
|
||||
print('no bundle affected by tracker, not generating bundle html')
|
||||
return
|
||||
new_ids = html_bundle.process(affected, forceGraphs=forceGraphs)
|
||||
if len(new_ids) == 0:
|
||||
print('no new bundle, not rebuilding index')
|
||||
return
|
||||
bundle_download.process(new_ids)
|
||||
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:
|
||||
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():
|
||||
# reset_new()
|
||||
# del_id(['*'])
|
||||
full_chain(force=False)
|
||||
# del_id(['_manually'])
|
||||
import_update()
|
||||
# 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()
|
||||
|
||||
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