// ==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; } 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)); } async document_on_changed () { let self = this; let current_data = self.parse_header(); for (let o of current_data[0]) { await self.data_add(o); } for (let o of current_data[1]) { await self.data_add(o); } self.display(); } listener_add() { let self = this; return VM.observe( document.body, () => { self.document_on_changed(); } ); } display_init() { let self = this; self.ui.root = $(`
`); $(document.body).append(self.ui.root); } display() { let self = this; let sorted_entries = Array.from(self.data.entries()).sort((a, b) => a[1].ts - b[1].ts); self.ui.root.empty(); for (let o of sorted_entries.map( (o) => JSON.stringify(o[1]) )) { self.ui.root.append($('
').text(o));
    }
  }
}

const l = new Linkedin();

(async () => {
  await l.data_load();

  const disconnect = l.listener_add();
  l.display_init();
})();