// ==UserScript== // @name data extraction linkedin // @namespace Violentmonkey Scripts // @match https://www.linkedin.com/* // @grant GM_getValue // @grant GM_setValue // @grant GM_getValues // @grant GM_setValues // @grant GM_listValues // @grant GM_deleteValue // @grant GM_deleteValues // @version 0.1 // @author Siarhei Siniak // @license Unlicense // @description 10/08/2024, 8:44:59 PM // @inject-into document // @require https://cdn.jsdelivr.net/npm/@violentmonkey/dom@1 // @require https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js // @noframes // ==/UserScript== class Linkedin { constructor() { this.data = new Map(); this.ui = { root: null, }; } async data_load() { let self = this; const keys = await GM_listValues(); let loaded = 0; for (let o of keys) { if (!o.startsWith('data-')) { return; } self.data.set( o.slice(5,), await GM_getValue(o) ); loaded += 1; } console.log({action: 'loaded', total: loaded}); } string_reduce (text) { return text.replaceAll(/\s+/gi, ' ').trim(); } parse_header() { let self = this; return [ $( '.scaffold-finite-scroll__content > div > .relative .update-components-header' ).map((i, o) => ({ header: o.innerText })), $( '.scaffold-finite-scroll__content > div > .relative .update-components-actor' ).map((i, o) => { let header = $(o); let teaser = $(o).parents('.relative') .parent().find('.feed-shared-update-v2__description-wrapper'); return { header: self.string_reduce(header.text()), teaser: self.string_reduce(teaser.text()), }; }) ] } async data_add (entry) { let self = this; if (self.data.has(entry.header)) { return false; } self.data.set(entry.header, { entry: entry, ts: (new Date()).valueOf(), }); await GM_setValue( 'data-' + entry.header, self.data.get(entry.header) ) console.log('saved ' + entry.header); console.log(self.data.get(entry.header)); return true; } async document_on_changed () { let self = this; let current_data = self.parse_header(); let changed = false; for (let o of current_data[0]) { let current_changed = await self.data_add(o); if (current_changed) { changed = current_changed; } } for (let o of current_data[1]) { let current_changed = await self.data_add(o); if (current_changed) { changed = current_changed; } } if (changed || (self.ui.root.length == 0 && self.data.size() > 0)) { self.display(); } } listener_add() { let self = this; return VM.observe( document.body, () => { self.document_on_changed(); } ); } display_init() { let self = this; self.ui.root = $(`