import { get_page_events } from '../src/facebook/get-page-events.mjs'; import send from '../src/signal/send.mjs'; import fetch from 'node-fetch'; const api = 'http://localhost:3333'; const token = // '831411806230c7e950c4eeb226499ef92bb6bdc4157797929a0e16d133dc13a8'; '1234567812345678123456781234567812345678123456781234567812345678'; const headers = { 'Content-Type': 'application/json' }; const scrape = async (pageID) => { try { const res = await get_page_events({ pageID, get_upcoming_events: true, get_past_events: false }); return res; } catch (e) { console.error(e); } return []; }; const unix = (a) => parseInt(new Date(a).valueOf() / 1000, 10); const sleep = (ms) => new Promise((res) => setTimeout(res, ms)); const updated = (oldEvent, scrapedEvent) => { let keys = [ 'canceled', 'end', 'start', 'draft', 'facebook_id', 'place_id', 'name', 'ticket_url', 'id' ]; for (let key of keys) { if (oldEvent[key] != scrapedEvent[key]) { return true; } } return false; }; (async () => { let resp = await fetch(`${api}/places/?token=${token}`); let places = await resp.json(); places = places.filter((place) => { const scrape = place.scraper == 'facebook'; if (!scrape) { console.log( 100, `Skipping #${place.id}$ {place.name}. Reason: Scraper is ${place.scraper}` ); } return scrape; }); for (let place of places) { if (place.id < 13) { console.log(100, `Skipping #${place.id} ${place.name}`); continue; } else { console.log(100, `Scraping #${place.id} ${place.name}`); } const events = await scrape(place.facebook_id); let payloads = []; for (let event of events) { payloads.push({ canceled: false, end: -1, start: unix(new Date(event.time_range.start)), draft: false, facebook_id: event.id, place_id: place.id, name: event.name ?? '', ticket_url: event.event_buy_ticket_url ?? '' }); } for (let payload of payloads) { let search = await fetch( `${api}/search/events/?facebook_id=${payload.facebook_id}&token=${token}` ); if (!search.ok) { await sleep(200); continue; } search = await search.json(); let new_event = search.length === 0; let old_event; if (!new_event) { old_event = search[0]; } let res; if (new_event) { res = await fetch(`${api}/events/?token=${token}`, { method: 'POST', body: JSON.stringify(payload), headers }); console.log(res.status, 'Insert', place.name, payload.name); let newEvent = await res.text(); let msg = await send(newEvent, place); console.log(res.status, 'Signal', msg); } else if (old_event && updated(old_event, payload)) { payload.id = old_event.id; if (old_event.ticket_url.length > 0 && payload.ticket_url.length == 0) { payload.ticket_url = old_event.ticket_url; } if (updated(old_event, payload)) { res = await fetch(`${api}/events/${payload.id}/?token=${token}`, { method: 'PATCH', body: JSON.stringify(payload), headers }); console.log(res.status, 'Update', place.name, payload.name); } else { console.log(201, 'Skip', place.name, payload.name); } } else { console.log(201, 'Skip', place.name, payload.name); } } } })();