-
Notifications
You must be signed in to change notification settings - Fork 2
/
index.js
82 lines (70 loc) 路 2.35 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
const puppeteer = require("puppeteer");
const sqlite3 = require("sqlite3");
const { open } = require("sqlite");
const pAll = require("p-all");
const hosts = require("./hosts.json");
const analyseUrl = require("./src/analyseUrl");
const startScan = async () => {
// open the database
const db = await open({
filename: "./db.sqlite",
driver: sqlite3.Database,
});
await db.run(
"CREATE TABLE IF NOT EXISTS urls (url TEXT PRIMARY KEY UNIQUE, valid BOOL DEFAULT FALSE, updated_at text DEFAULT (strftime('%Y-%m-%d %H:%M:%S:%s','now', 'localtime')));"
);
await db.run(
"CREATE TABLE IF NOT EXISTS trackers (id INTEGER PRIMARY KEY AUTOINCREMENT, url TEXT, type TEXT, value TEXT, updated_at text DEFAULT (strftime('%Y-%m-%d %H:%M:%S:%s','now', 'localtime')));"
);
// start scanning and persit results in sqlite
return puppeteer.launch().then(async (browser) => {
await pAll(
hosts.map((url) => async () => {
console.log("url", `https://${url}`);
const exist = await db.get(
"select count(url) as count from urls where url = ?",
[url]
);
if (exist.count > 0) {
// skip existing urls in DB
return Promise.resolve();
}
await db.get(
`INSERT INTO urls(url) VALUES(?) ON CONFLICT(url) DO UPDATE SET url=excluded.url;`,
[url]
);
await db.run("DELETE from trackers where URL = ?", [url]);
let trackers, cookies;
try {
let result = await analyseUrl(browser, url);
trackers = result.trackers;
} catch (e) {
console.log("err", e);
await db.run("DELETE from urls where URL = ?", [url]);
return Promise.resolve();
}
if (!trackers) {
return Promise.resolve();
} else {
await db.run(`UPDATE urls set valid=TRUE where url=?;`, [url]);
return pAll(
trackers.map(
(track) => () =>
db.run(
`INSERT INTO trackers (url, type, value) VALUES(?, ?, ?);`,
[url, track.type, track.value]
)
),
{ concurrency: 1, stopOnError: true }
);
}
}),
{ concurrency: 5, stopOnError: true }
);
browser.close();
db.close();
});
};
if (require.main === module) {
startScan();
}