1
1
const puppeteer = require ( "puppeteer" ) ;
2
2
const chrono = require ( "chrono-node" ) ;
3
+ const fs = require ( "fs" ) ;
3
4
const { InfluxDB } = require ( "@influxdata/influxdb-client" ) ;
4
5
require ( "dotenv" ) . config ( ) ;
5
6
console . log ( `CONTACT_TARGET=${ process . env . CONTACT_TARGET } ` ) ;
@@ -29,6 +30,12 @@ const writeApi = client.getWriteApi(
29
30
process . env . INFLUXDB_ORG ,
30
31
process . env . INFLUXDB_BUCKET
31
32
) ;
33
+ const fileName = "scan-logs.csv" ;
34
+ fs . appendFileSync (
35
+ fileName ,
36
+ "scanDate,contactLabel,HasWhatsapp,LastSeenDate" + "\n"
37
+ ) ;
38
+ let noWhatsappContacts = [ ] ;
32
39
33
40
( async ( ) => {
34
41
const page = await loadBrowser ( ) ;
@@ -38,7 +45,13 @@ const writeApi = client.getWriteApi(
38
45
while ( true ) {
39
46
for ( let index = 0 ; index <= 99 ; index ++ ) {
40
47
const contact = `Unknown${ index } ` ;
41
- await scanStatus ( page , contact ) ;
48
+
49
+ if ( noWhatsappContacts . includes ( contact ) ) {
50
+ continue ;
51
+ }
52
+
53
+ let result = await scanStatus ( page , contact ) ;
54
+ fs . appendFileSync ( fileName , result + "\n" ) ;
42
55
await page . waitForTimeout ( 10000 ) ;
43
56
}
44
57
}
@@ -97,10 +110,11 @@ async function scanStatus(page, contactTarget) {
97
110
console . log (
98
111
`No whatsApp for ${ contactTarget } (or not in phone contacts list).`
99
112
) ;
100
- return ;
113
+ noWhatsappContacts . push ( contactTarget ) ;
114
+ return `${ new Date ( ) . toISOString ( ) } ,${ contactTarget } ,false,null` ;
101
115
}
102
116
contactElt . click ( ) ;
103
- await page . waitForTimeout ( 30000 ) ; // Status shows up late sometimes.
117
+ await page . waitForTimeout ( 10000 ) ; // Status shows up late sometimes.
104
118
105
119
let statusElt = await page . $ ( "._3Id9P" ) ; // Status text.
106
120
@@ -110,14 +124,14 @@ async function scanStatus(page, contactTarget) {
110
124
111
125
if ( ! statusElt ) {
112
126
console . log ( `No status available for ${ contactTarget } .` ) ;
113
- return ;
127
+ return ` ${ new Date ( ) . toISOString ( ) } , ${ contactTarget } ,true,null` ;
114
128
}
115
129
let status = await statusElt . evaluate ( x => x . textContent ) ; // `last seen today at 13:15` format.
116
130
console . log ( `Status for ${ contactTarget } is '${ status } '.` ) ;
117
131
118
132
if ( status == "click here for contact info" ) {
119
133
console . log ( `'click here for contact info' case for ${ contactTarget } .` ) ;
120
- return ;
134
+ return ` ${ new Date ( ) . toISOString ( ) } , ${ contactTarget } ,null,null` ;
121
135
}
122
136
123
137
let lastSeenDate = chrono . parseDate ( status ) ;
@@ -131,4 +145,5 @@ async function scanStatus(page, contactTarget) {
131
145
132
146
let data = `status,contactName=${ contactTarget } offlineSince=${ offlineSince } u` ;
133
147
writeApi . writeRecord ( data ) ;
148
+ return `${ new Date ( ) . toISOString ( ) } ,${ contactTarget } ,null,${ lastSeenDate . toISOString ( ) } ` ;
134
149
}
0 commit comments