From 2b3305ab56161d1ec3dcf6eaebe71a78523789bd Mon Sep 17 00:00:00 2001 From: Siarhei Siniak Date: Sat, 17 Aug 2024 00:37:29 +0300 Subject: [PATCH] [~] Refactor --- deps/greasyfork/package.json | 5 +- deps/greasyfork/src/linkedin.user.js | 382 ++++++++++++++++++ .../linkedin.user.ts} | 0 deps/greasyfork/tsconfig.json | 109 +++++ deps/greasyfork/yarn.lock | 22 + 5 files changed, 517 insertions(+), 1 deletion(-) create mode 100644 deps/greasyfork/src/linkedin.user.js rename deps/greasyfork/{linkedin.user.js => src/linkedin.user.ts} (100%) create mode 100644 deps/greasyfork/tsconfig.json diff --git a/deps/greasyfork/package.json b/deps/greasyfork/package.json index 180d0be..0bdefeb 100644 --- a/deps/greasyfork/package.json +++ b/deps/greasyfork/package.json @@ -1,4 +1,7 @@ { "name": "greasyfork", - "packageManager": "yarn@4.4.0" + "packageManager": "yarn@4.4.0", + "dependencies": { + "typescript": "^5.5.4" + } } diff --git a/deps/greasyfork/src/linkedin.user.js b/deps/greasyfork/src/linkedin.user.js new file mode 100644 index 0000000..e62fa45 --- /dev/null +++ b/deps/greasyfork/src/linkedin.user.js @@ -0,0 +1,382 @@ +"use strict"; +// ==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 +// @grant GM_addStyle +// @grant GM_addElement +// @version 0.1 +// @author Siarhei Siniak +// @license Unlicense +// @description 10/08/2024, 8:44:59 PM +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +// @run-at document-body +// @inject-into content +// @require https://cdn.jsdelivr.net/npm/@violentmonkey/dom@1 +// @require https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js +// @noframes +// ==/UserScript== +/* + +Use this extension to disalbe CSP for linkedin + +https://addons.mozilla.org/en-US/firefox/addon/header-editor/ +https://github.com/FirefoxBar/HeaderEditor +https://github.com/violentmonkey/violentmonkey/issues/1335 +https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src + + +{ + "request": [], + "sendHeader": [], + "receiveHeader": [ + { + "enable": true, + "name": "disable CSP for linkedin", + "ruleType": "modifyReceiveHeader", + "matchType": "domain", + "pattern": "www.linkedin.com", + "exclude": "", + "group": "Ungrouped", + "isFunction": false, + "action": { + "name": "content-security-policy", + "value": "" + } + } + ], + "receiveBody": [] +} +*/ +class Linkedin { + constructor() { + this.data = new Map(); + this.ui = { + root: null, + entries: null, + search: null, + state: null, + }; + this.state = { + search: '', + }; + } + clean_page() { + if (location.href.search('empty_body=true') != -1) { + $('head').empty(); + $('body').empty(); + $('body').addClass('no-border'); + } + } + data_load() { + return __awaiter(this, void 0, void 0, function* () { + let self = this; + const keys = yield GM_listValues(); + let loaded = 0; + for (let o of keys) { + if (!o.startsWith('data-')) { + return; + } + self.data.set(o.slice(5), yield 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()), + }; + }) + ]; + } + data_add(entry) { + return __awaiter(this, void 0, void 0, function* () { + let self = this; + if (self.data.has(entry.header)) { + return false; + } + self.data.set(entry.header, { + entry: entry, + ts: (new Date()).valueOf(), + }); + yield GM_setValue('data-' + entry.header, self.data.get(entry.header)); + console.log('saved ' + entry.header); + console.log(self.data.get(entry.header)); + return true; + }); + } + document_on_changed() { + return __awaiter(this, void 0, void 0, function* () { + let self = this; + let state_changed = false; + if (JSON.stringify(self.state_get()) != JSON.stringify(self.state)) { + state_changed = true; + self.old_state = self.state; + self.state = self.state_get(); + } + let current_data = self.parse_header(); + let changed = false; + for (let o of current_data[0]) { + let current_changed = yield self.data_add(o); + if (current_changed) { + changed = current_changed; + } + } + for (let o of current_data[1]) { + let current_changed = yield self.data_add(o); + if (current_changed) { + changed = current_changed; + } + } + if (changed || (state_changed || + self.ui.entries === null && 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 = $(`
`); + $('head').append($('