-
Notifications
You must be signed in to change notification settings - Fork 0
/
pageScrapper.ts
125 lines (102 loc) · 3.1 KB
/
pageScrapper.ts
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import puppeteer from 'puppeteer';
export interface Person {
sub: string;
name: string;
iat: number;
}
export class Scrapper {
url: string;
replacer: string;
expectedUrl: string;
userInput: string;
passInput: string;
loginContainer: string;
user: string;
pass: string;
constructor() {}
setUrl(url: string): void {
this.url = url;
}
setReplacer(replacer: string): void {
this.replacer = replacer;
}
setExpectedUrl(url: string): void {
this.expectedUrl = url;
}
getReplacer(): string {
return this.replacer;
}
getExpectedUrl(): string {
return this.expectedUrl;
}
setUserInput(input: string): void {
this.userInput = input;
}
getUserInput(): string {
return this.userInput;
}
setPassInput(input: string) {
this.passInput = input;
}
getPassInput(): string {
return this.passInput;
}
setLoginContainer(loginContainer: string): void {
this.loginContainer = loginContainer;
}
getLoginContainer(): string {
return this.loginContainer;
}
setUser(user: string) {
this.user = user;
}
setPassword(pass: string) {
this.pass = pass;
}
async createScrapper (browser: puppeteer.Browser) {
if (!!this.url) {
const page = await browser.newPage();
await page.goto(this.url);
this.login(page);
this.getTokenFromWebsite(page).then((localStorage: Object) => {
this.openNewSite(page, localStorage['token']);
});
} else {
throw(new Error('No has introducido una url hacia la que apuntar.'));
}
}
private getTokenFromWebsite(page: puppeteer.Page): Promise<any> {
return page.waitForSelector('div.container').then(() => {
const localStorageData = page.evaluate(() => {
let json = {};
Object.keys(window.localStorage).forEach((key, index) => {
json[key] = localStorage.getItem(localStorage.key(index));
})
return json;
});
return localStorageData;
});
}
private login(page: puppeteer.Page) {
return page.waitForSelector(this.getLoginContainer()).then(() => {
page.waitForSelector(this.getUserInput()).then(
() => this.writeOnInput(page, this.getUserInput(), this.user)
);
page.waitForSelector(this.getPassInput()).then(
() => {
setTimeout(() => {
this.writeOnInput(page, this.getPassInput(), this.pass);
}, 1000);
}
);
});
}
async writeOnInput(page: puppeteer.Page, selector: string, text: string) {
await page.focus(selector);
page.keyboard.type(text);
}
private async openNewSite(page: puppeteer.Page, token: string) {
const newUrl = this.getExpectedUrl().replace(this.getReplacer(), token);
await page.goto(newUrl);
}
}