Greasy Fork 支持简体中文。

MDA linkedin improvements

my linkedin improvements started 2025-01-11

// ==UserScript==
// @name         MDA linkedin improvements
// @namespace    http://tampermonkey.net/
// @version      1.5.7
// @description  my linkedin improvements started 2025-01-11
// @author       mr-d-r
// @license      MIT
// @match        http*://*.linkedin.com/*
// @grant        GM_addStyle
// @require      https://update.greasyfork.org/scripts/524553/1525219/MDA%20library.js
// ==/UserScript==

// update check 27.01.2025

(function() {
    'use strict';
	var dbg=0, 	aa, bb;

	if( window.location.hostname.match("merchantpool1") )	{  log(`${GM.info.script.name}:  ${window.location.hostname} skipped !!!`);	return;  }
	console.log("\n", "\n", `${GM.info.script.name}: start ${window.location.hostname} debug=${(typeof dbg == "undefined") ? "absent" : dbg}  MDAlib=${(typeof MDAlib == "undefined") ? "absent" : MDAlib}` );

// end of script


	function myActions (caller) { var a, b,			fn=fnName();
		log(`${fn}(${caller}) @${window.location.hostname}: start`);
		click_ShowMore();

		qSA(".ad-banner").forEach(item =>{
			item.remove();	log(`ad had been removed`);		//if( item?.style?.display && item?.style?.display != 'none' )  item.style.display='none';	log(`ad had been hidden`);
		});
		qSA("div[id='sub-frame-error']").forEach(item =>{ 	item?.remove();	log(`sub-frame-error removed`);		});

		qSA("article.mb3").forEach(item =>{
			if( a=qS("use[href='#close-small']") )  {  a.parentNode.parentNode.click();	log(`linkedin app AD found - closed`);  }
		});

		// WORKS, вроде реально норм, но под настроение еще искать более точные критерии для рекламы
		document.querySelectorAll(".relative > div[id*='ember']").forEach(i =>{
			i.querySelectorAll("span[aria-hidden='true']").forEach(j =>{
				if( j.textContent == "Promoted" )  {
						a=i.querySelector(".update-components-actor__image"); // ADs title
					  	console.log("promoted1 - removed", a?.ariaLabel);
					  	i.remove(); // j.textContent=`${j.textContent}_Removed!!!`;  i.style.display='none';  	// i.remove();
				}
			});
			i.querySelectorAll(".update-components-actor__sub-description-button-text").forEach(j =>{
				if( j.textContent.match(/Book an appointment/i) )  {
					  	console.log("Book an appointment - removed", a?.ariaLabel);
					  	i.remove(); // j.textContent=`${j.textContent}_Removed!!!`;  i.style.display='none';  	// i.remove();
				}
			});
		});

		//     например если .update-components-header__text-view сразу <span> и сразу href="https://www.linkedin.com/company/*"
		document.querySelectorAll(".relative > div[id*='ember']").forEach(i =>{
			i.querySelectorAll(".update-components-actor__container [href*='/company']").forEach(j =>{  // document.querySelectorAll(".update-components-actor__container [href*='/company']")[10].href
					  	console.log("promoted2 - removed", j?.href);
						i.remove();
			});
		});

/*  2finish
		document.querySelectorAll(".relative > z&*&^*&^*^zxzx").forEach(i =>{
			i.querySelectorAll(".update-components-actor__meta-link [href*='/company']").forEach(j =>{  // document.querySelectorAll(".update-components-actor__container [href*='/company']")[10].href
					  	console.log("promoted22 - removed", j?.href);
						i.remove();
			});
		});
*/


	} // myActions()


	window.addEventListener('load', function() {	var fn=fnName();
		ttout(300,   ()=>{	myActions(`onLoad`);	});
		ttout(2500,  ()=>{	myActions(`onLoad`);	});

		// ttout(onLOADlckTMOUT,  ()=>{ 	onLOADlck=false; 					});  	// 3000 ms IMPORTANT !!!
	}); // window.addEventListener('load'...) // onload


	window.navigation.addEventListener("navigate", (event) => {  // https://stackoverflow.com/questions/6390341/how-to-detect-if-url-has-changed-after-hash-in-javascript
	});


window.addEventListener('keydown', (e) => {     // window.addEventListener("keyup", async (e) => {
    var a, b, aa, bb, cc, c1, c2; //     if(dbg)  log("parent " +e.code);
	if( anyActiveInput() ) 	{ log(`on ${e.code}:  active input detected`);				return; 	}

    switch (e.code) {  // see https://www.freecodecamp.org/news/javascript-keycode-list-keypress-event-key-codes/
    	 case "KeyA":
				//log(`KeyA: clicked`);
				myActions(`onKeyA`);  // chk upd 111 222 333 444 555
				e.preventDefault();
				break;
    	 case "KeyE":  // Endorse
				if (e.ctrlKey || e.altKey || e.shiftKey)  break;
				aa=document.querySelectorAll(".artdeco-button__text").length;
				cc=0; document.querySelectorAll(".artdeco-button__text").forEach(item => {
					if(item.textContent.match(/Endorse\n/)) { console.log(item); 	cc++; 	item.click(); } ;
				});
				c1=0; document.querySelectorAll(".artdeco-button__text").forEach(item => {
					if(item.textContent.match(/Endorse\n/)) { c1++; } ;
				});
				c2=0; document.querySelectorAll(".artdeco-button__text").forEach(item => {
					if(item.textContent.match(/Endorse\n/)) { c2++; } ;
				});
				log(`KeyE: endorse clicked: ${cc},  endorse left: ${c1},  endorsed found: ${c2}`);
				e.preventDefault();
				break;
    	 case "KeyM":  // чаще всего кнопка "Show more feed updates" показывается при запущенном devtool !!!
				if (e.ctrlKey || e.altKey || e.shiftKey)  break;
				log(`KeyM: "Show more feed updates"`);
				document.querySelectorAll(".display-flex").forEach(item => {
  					a=item.querySelector(".artdeco-button__text");
    				if (a) b=a.innerText;
    				if (b)  console.log("bbb", b == "Show more feed updates");
  					if( b == "Show more feed updates") {
        				console.log(a);  a.parentNode.click();		// WORKS, но орет Uncaught TypeError: Cannot read properties of null (reading 'parentNode') !!!
					}
				});
				e.preventDefault();
				break;

     } // end of switch
     return;
}); // end of  window.addEventListener("keydown", (e) =>


var onScrollLOCK=false, onScrollTMOUT=300, scrollBefore = 0, tickCURR, tickPROC;
window.addEventListener('scroll',function(e){  // !!! https://stackoverflow.com/questions/4670834/capturing-the-scroll-down-event
    const scrolled = window.scrollY;
	var a, procCNT=0;

	if( onScrollLOCK ) return;		onScrollLOCK=true; 		ttout(onScrollTMOUT,  ()=>{	onScrollLOCK=false;	});

	//if( ! onLoadDONE )  return;

    if(scrollBefore > scrolled){
        console.log("ScrollUP");
        scrollBefore = scrolled;
        //Desired action
    } else {
        scrollBefore = scrolled;
        //console.log("ScrollDOWN");
			// tickCURR, tickPROC - MUST BE GLOBAL !!!
			tickCURR=Date.now();
			if (!tickPROC) 		tickPROC=setInterval(function () {  // если быстро нажали Ctrl +/- несколько раз подряд, то отработать только последнее
											let cu=Date.now();
											procCNT++;
											if ((cu-tickCURR) < 300) { 	if(dbg && dbg>5)  console.log("interv: <600 - skip");					}
											else { 	clearInterval(tickPROC); tickPROC=null; //	log("finally fire on scrollDOWN 557732" +procCNT);
													myActions(`onScrollDOWN`);
											}
								}, 600);
    }

}) // 'scroll'

	function click_ShowMore () {
			if( a=qS(".jobs-description__footer-button[aria-expanded='false']") ) 	{ 	log(`${window.location.hostname} "See more" clicked`); 	a.click(); 	}
			//else log(`${window.location.hostname} "See more" is not found`);

			qSA(".artdeco-button").forEach(item => {
					let x=item?.textContent;
					if( x.match(/Show more/) ) 	if( ! x.match(/Show more feed updates/) ) {
							console.log(`Show more  COULD BE clicked: ${x}`);   // item.click();
					} ;
			});
	} // click_ShowMore()
})();