Sleazy Fork is available in English.

Cam4 Clean figuccio

cam colorato 2025

  1. // ==UserScript==
  2. // @name Cam4 Clean figuccio
  3. // @description cam colorato 2025
  4. // @version 16.5
  5. // @author figuccio
  6. // @match https://*.cam4.com/*
  7. // @grant GM_addStyle
  8. // @grant GM_setValue
  9. // @grant GM_getValue
  10. // @grant GM_registerMenuCommand
  11. // @run-at document-end
  12. // @require https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js
  13. // @namespace https://greasyfork.org/users/237458
  14. // @require http://code.jquery.com/jquery-latest.js
  15. // @require https://code.jquery.com/ui/1.13.2/jquery-ui.js
  16. // @icon https://cam4.com/favicon.ico
  17. // @license MIT
  18. // ==/UserScript==
  19. (function() {
  20. 'use strict';
  21. function addClock() {
  22. // Selettore del pulsante esistente clock sulla barra superiore
  23. const headerElement = document.querySelector("#root > div > div.THmE0 > header > div.rsdM3.AyoJO > div.yLU7N.TcOud > div.f3e13.o_Anz.rbqYB > button");
  24.  
  25. if (headerElement) {
  26. // Creazione dell'elemento orologio
  27. const clock = document.createElement("div");
  28. clock.style.display = "inline-block"; // Allinea accanto al pulsante
  29. clock.style.marginLeft = "10px"; // Distanza tra il pulsante e l'orologio
  30. clock.style.fontSize = "16px";
  31. clock.style.color = "lime";
  32. clock.style.background ="brown";
  33. clock.style.padding = "1px";
  34. clock.style.borderRadius = "5px";
  35. clock.style.zIndex = "9000"; // Valore alto per posizionarlo sopra gli altri elementi
  36. clock.style.cursor="pointer";
  37. clock.style.border="1px solid yellow";
  38.  
  39. // Aggiunge l'elemento orologio accanto al pulsante
  40. headerElement.parentNode.insertBefore(clock, headerElement.nextSibling);
  41. // Aggiungi la data al passaggio del mouse
  42. clock.addEventListener('mouseenter', function() {
  43. const currentDate = new Date();
  44. const formattedDate = currentDate.toLocaleDateString('it', {
  45. day: '2-digit',
  46. month: 'long',
  47. weekday: 'long',
  48. year: 'numeric'
  49. });
  50. clock.setAttribute('title', formattedDate); // Mostra la data come tooltip
  51. });
  52.  
  53. // Applica stile al contenitore del pulsante
  54. const container = headerElement.parentNode;
  55. container.style.display = "flex";
  56. container.style.alignItems = "center"; // Allinea verticalmente al centro
  57.  
  58. // Aggiorna l'orologio
  59. function updateClock() {
  60. const now = new Date();
  61. const timeString = `${now.toLocaleTimeString()}:${now.getMilliseconds()}`; // Aggiunge i millisecondi
  62. clock.textContent = timeString;
  63. }
  64.  
  65. // Aggiorna l'orologio ogni secondo
  66. updateClock();
  67. setInterval(updateClock, 90);
  68. } else {
  69. console.error("Elemento non trovato. Controlla il selettore.");
  70. }
  71. }
  72.  
  73. function addColorPicker() {
  74. const colorPicker = $('<input type="color" title="Color picker" list="colors" id="colorPicker"style="cursor:pointer;">');
  75. const colorValue = $('<span id="colorValue" title="Hex value" style="margin-left:10px;font-size:16px;color:lime;background-color:brown;border:1px solid yellow;border-radius:5px;cursor:pointer;"></span>');
  76. const headerElement = document.querySelector("#root > div > div.THmE0 > header > div.rsdM3.AyoJO > div.yLU7N.TcOud > div.f3e13.o_Anz.rbqYB > button");
  77.  
  78. if (headerElement) {
  79. $(headerElement).after(colorPicker);
  80. $(colorPicker).after(colorValue);
  81.  
  82. const userdata = { color: 'camcolor' };
  83. let mycolor = GM_getValue(userdata.color, "#980000"); // Valore predefinito
  84.  
  85. function saveSetting() {
  86. GM_setValue(userdata.color, mycolor);
  87. $('.Ia4MR,.OOOkf,.dSgtq,html').css("background", mycolor);
  88. }
  89. ///////////////////////////////////////////////////////////////////////////////
  90. // Funzione per osservare i cambiamenti nel DOM
  91. function observeDOMChanges() {
  92. // Creazione di un observer con una funzione di callback
  93. var observer = new MutationObserver(function(mutationsList, observer) {
  94. // Per ogni mutazione rilevata, esegui la funzione saveSetting
  95. for(var mutation of mutationsList) {
  96. saveSetting();
  97. }
  98. });
  99.  
  100. // Configurazione dell'observer per osservare cambiamenti nei nodi figlio e nei nodi attributo
  101. var config = {childList:true, attributes:true, subtree:true};
  102. // Inizia ad osservare il DOM target
  103. observer.observe(document.body, config);
  104. }
  105. // Avvia l'osservazione dei cambiamenti nel DOM
  106. observeDOMChanges();
  107. /////////////////////////////////////////////////////////////////////////////////
  108. $('#colorPicker').val(mycolor); // Imposta il colore del selettore
  109. $('#colorValue').text(mycolor); // Mostra il valore HEX
  110. $('.Ia4MR,.OOOkf,.dSgtq,html').css("background", mycolor); // Applica lo sfondo
  111.  
  112. $('#colorPicker').on('input', function(event) {
  113. mycolor = event.target.value;
  114. $('#colorValue').text(mycolor);
  115. $('.Ia4MR,.OOOkf,.dSgtq,html').css("background", mycolor);
  116. saveSetting(); // Salva il valore ogni volta che cambia
  117. });
  118.  
  119. saveSetting(); // Salva il colore iniziale
  120. } else {
  121. console.error("Elemento non trovato. Controlla il selettore.");
  122. }
  123. }
  124.  
  125. setTimeout(function() {
  126. addClock();
  127. addColorPicker();
  128. }, 2000);
  129.  
  130. //})();
  131. //////////////////////////////////
  132. // Serie di selettori di messaggi di chat da tenere d'occhio (se 6 sulle cam corregge scroll)
  133. const chatMessageSelectors = [
  134. '.ChatMobileMessages__msgHolder__3-Yju',
  135. '.ChatMobileMessages__msgHolderEmbed__2LQTu',
  136. '.ChatMobileMessages__msgHolderForMobile__3tDM4'
  137. ];
  138.  
  139. // Funzione per scorrere la pagina verso l'alto
  140. function scrollPageUp() {
  141. window.scrollTo(0, 0);
  142. }
  143.  
  144. // MutationObserver per osservare gli elementi specificati
  145. const observer = new MutationObserver((mutations) => {
  146. mutations.forEach((mutation) => {
  147. chatMessageSelectors.forEach((selector) => {
  148. if (mutation.target.matches(selector) || mutation.target.querySelector(selector)) {
  149. scrollPageUp();
  150. }
  151. });
  152. });
  153. });
  154.  
  155. // Inizia a osservare il corpo del documento per eventuali modifiche
  156. observer.observe(document.body, {
  157. childList: true,
  158. subtree: true
  159. });
  160. ////////////////////////////////////////////////////////////////////
  161. GM_addStyle(`
  162. /* Naked & Uncut: Tulum */
  163. .SegmentItem__container__NA2zm,
  164.  
  165. /* popup sopra */
  166. .Directory__subHeader__2O2A2,
  167.  
  168. /*set 2023 */
  169. .Footer__footer__202HR,
  170. /*categorie funziona +parte sotto cam*/
  171. .ContentCard__title__2CLsx,
  172. .ContentCard__container__rOtbe,
  173. .LegalArea__legal__2bQcD,
  174.  
  175. .QMBRc,.BYmt2,.jGkoG,.SnYAk,.yId07,
  176.  
  177.  
  178. /*correlate set 2023*/
  179. .Directory__aboveFooterWrap__sLRuI {
  180. display: none!important;
  181. }
  182. `);
  183.  
  184. //continua cookie
  185. // Function to save cookies to local storage
  186. function saveCookiesToLocalStorage() {
  187. const cookies = document.cookie.split(';');
  188. cookies.forEach(cookie => {
  189. const [name, value] = cookie.split('=');
  190. if (name.trim() === 'disclaimer18' || name.trim() === 'disclaimerMobile18') {
  191. GM_setValue(name.trim(), value);
  192. }
  193. });
  194. }
  195.  
  196. // Function to set cookies from local storage
  197. function setCookiesFromLocalStorage() {
  198. const disclaimer18 = GM_getValue('disclaimer18');
  199. const disclaimerMobile18 = GM_getValue('disclaimerMobile18');
  200. if (disclaimer18) {
  201. document.cookie = `disclaimer18=${disclaimer18}; domain=.cam4.com; max-age=315360000`;
  202. }
  203. if (disclaimerMobile18) {
  204. document.cookie = `disclaimerMobile18=${disclaimerMobile18}; domain=.cam4.com; max-age=315360000`;
  205. }
  206. }
  207.  
  208. //Salva i cookie nella memoria locale quando viene eseguito lo script
  209. saveCookiesToLocalStorage();
  210.  
  211. //Imposta i cookie dall'archiviazione locale quando la pagina viene caricata
  212. window.addEventListener('load', setCookiesFromLocalStorage);
  213.  
  214. if(!localStorage.reload) {
  215. //correzione errore triangolo giallo
  216. setTimeout(function(){document.location.reload();}, 2000);
  217. localStorage.reload = 1;
  218. }
  219. setCookiesFromLocalStorage();
  220. //popup questo sito utilizza cookie visibile senza estensione blocca publicita rifunziona
  221. GM_addStyle('.index__cookieConsent__2M-8D {display: none!important}');//sett 2023
  222. //foto publicita in alto prova un esperienza piu intima rifunziona
  223. GM_addStyle('.PageHeaders__wrapper__3I9TX .PageHeaders__title__Wms1b {display: none!important}');
  224. //parte sotto paginazione marzo 2024
  225. GM_addStyle('#root > div > footer {display: none!important}');
  226. //scritta scorrevole marzo 2025
  227. GM_addStyle('.jhdSH{display:none!important}');
  228. //parte inutile sotto i numeri rifunziona
  229. GM_addStyle('#app > div.pageContainer > div.pageContent > div.Directory__content__TBdmJ > div.SponsoredAds__premiumAds__ZXHiX.Directory__sponsoredAds__tHvki{display: none!important}');//cam4 premium gennaio 2024
  230.  
  231. //x dentro video
  232. GM_addStyle('.index__closeButton__2llsj {display:none!important}');
  233. //ricordamelo dopo in chat ottobre
  234. GM_addStyle('.TokenAwarenessDesktop__container__3aA7r {display:none!important}');
  235. //popup badoo allinterno della cam
  236. GM_addStyle('.AdEmbeded__AddWrapperNoButton__28ZlR {display:none!important}');
  237. //current page color red
  238. GM_addStyle('.Pagination__pagination__3if3L li.Pagination__active__xYxuK a {background-color:red!important;color:lime!important;}');
  239. //////////////////////////////////////////////////////////////////////////////////////
  240. // Click "Accedi" button after 7 seconds
  241. setTimeout(() => {
  242. const accediButton = document.querySelector("#root > div > div.THmE0 > header > div.LzM4W._GM7Y > button.DicDC.SCZfE.yAILi.s1855.Wg2T7");
  243. if (accediButton) {
  244. accediButton.click();
  245. } else {
  246. console.error("Accedi button not found");
  247. }
  248. }, 7000);
  249.  
  250. // Fare clic sul pulsante "Continua" dopo 5 secondi
  251. var l_foundButton = false;
  252. function clickButton() {
  253. const continueIntervalId = setInterval(() => {
  254. const continueButton = document.querySelector("#tUZ2be9k_loginFrom_continueButton");
  255. if (continueButton) {
  256. continueButton.click();
  257. l_foundButton = true;
  258. clearInterval(continueIntervalId); // Ferma l'intervallo una volta trovato il pulsante
  259. }
  260. }, 5000); // Esegui l'intervallo ogni 5 secondi
  261. }
  262.  
  263. // Aggiunto controllo e log per debug
  264. if (l_foundButton) {
  265. console.log("Button clicked.");
  266. l_foundButton = false; // Reset per il prossimo ciclo
  267. } else {
  268. //console.log("Button not found.");
  269. }
  270.  
  271. // Chiama clickButton() ogni 1000 millisecondi (1 secondo) finché il pulsante non viene trovato
  272. var intervalId = setInterval(() => {
  273. if (!l_foundButton) {
  274. clickButton();
  275. } else {
  276. clearInterval(intervalId); // Interrompe l'intervallo una volta cliccato il pulsante
  277. }
  278. }, 1000);
  279.  
  280. // Esegui clickButton() all'avvio per gestire i bottoni già presenti
  281. clickButton();
  282.  
  283. // Fare clic sul pulsante "Invia" dopo 1 secondo
  284. const submitIntervalId = setInterval(() => {
  285. const submitButton = document.querySelector("#tUZ2be9k_loginFrom_submitButton");
  286. if (submitButton) {
  287. submitButton.click();
  288. clearInterval(submitIntervalId);
  289. }
  290. }, 2000);
  291.  
  292. })();
  293. //////////////////////////////pulsante torna in alto
  294. var $ = window.jQuery;
  295. $(document).ready(function() {
  296. $('body').append('<img class="toPageTop1" title="Sali in alto" style="position:fixed;z-index:999999999999999999;bottom:320px;right:0px;cursor:pointer;border-radius:100%;width:70px;height:70px" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAABINJREFUeF7tmkFy2koQhv9W7PeWT3CBQFXE9vmdIPYJQk4QvIxYBJ8gzglMFihL804QcgKTE8TZIleZdwFQlrFd6lejWCmFCNQjzWBTwI6anp7ub3p6emZE2PIfbbn/2AHYRcCWE9gtgS0PgF0SXNsScM+uXezfPXee4AAxN5iokY0+Yp7CoWnMGOP73tfopBmtIzqtAnA/XDcQ374goENEBzoOMfMlA0M4+5+i182pTl8dWSsA3A/hoRPzKxB1dIxZKss8jIH3Ubd1aURfRolRACrMnT9uz4w5vuitAnGzf2JyeRgD4AZXbWI+J4Jrepay+pgRMdFx5D8bmRjHCIB6EJ4B6JkwSENHf+Z7JxryuaKVAdQHk3NrIV/kHfNw1m0dF4mtaq8E4EGdT72qCKE0gEfh/E8I9H7WfVZqCZYC4A4mHYfovErome4bg16WSYzaAFRxQ/HdF9vZXhdQsjvc7DV1t0htALUg/EhAW9fAdcgzMJr73kudsbQAJBUe40IyADP+A8FMCctoEOGpZNyYcBS99sYSWSWjBaAWhBcEHBYpZ/DXud/Sqv2LdNaCySWB/i6SY2A8972jIrm0XQzAHUwOHKIvUsUA+iCYOdFxUl2Ks3xMe03pAUoMoD646oP4jQaAhxNl+bYoBlALJteEX8/wVT2MgaSUdQBVShv7MXg691tNiUIRALX1OXx3LVEolYmZj6Nua6jkbdQV0mUgA2C48Mk6nwIzDSFvjLzJEQGoD8JTEN5KZ3eVXGqYSqpZOXXZYRQC492s650W2SwCUAvCMQHPi5QVtWedJ9AFO0iKForxkcFHJiEw49O86xUWbGsDsOi8KqVV0ZIkQcZFUsoahMDA57nvFdYsawGQ57xyPAtA/TcJ4dEAWOZ8HgCTEB4HgPuCRCU8teYXT5CLEZDmkGwklC3AHgWA5G6fnD4x9/OOz8sA/IwEoh5x3NN9U0j6m8wBZWehcFfIJMEiWe12k9ugG4Q90+Xqshyg7eiSDqrMjnyvX6RPtAuUOAkWjZu0r1oCIgUrhGLmfyQvSSIAapxaEEYE/FXVsGx/WwDUZcy86/3y+LrMbjGAejAZAvRqEwDAxnHYxjKwFQHS8E/KcJ0ZlV5LSXXaACDd/lIbtQAYPa0lezUnl6YmL1qsXoreJ0MjJ0NplOjI6c6+9hJQHWzkAh0nV8lKb4GyOrSWQNrR5AWJMeeFhc/ieKUAJEthEI6I8MKUA9X08L8zv1Xqc5zSANTnMPTn7VjyWFHNudW91SMMf98/1H0TLLULLJry0BCqOl8qCeZDuBuZuDPUiRR158c3e52yM28kArIGrzUxCo+6EqClc0Ce8uTmhzC0lRfUPs/MPckpT+K8kSWwBESHQKfSJ+0iY9XpjsGn6UtSkbxOu9EI+C0/BFdtB3GbQW3dozQD3wg8iuGMynz6IoVgFUDWiB+fz+IQxA2+f2RNE6cK7R/hyFMwTWMHY52PHKTO5smtDUAVI2323QGwSXcTdO8iYBNmyaaNuwiwSXcTdO8iYBNmyaaNWx8B/wMj7yxftxxt6gAAAABJRU5ErkJggg==";/>');
  297.  
  298. $(".toPageTop1").hide(0);
  299. $(window).scroll(function(){
  300. if($(window).scrollTop() >= 100){
  301. $(".toPageTop1").fadeIn(4000);
  302. }else{
  303. $(".toPageTop1").stop(true,true).fadeOut(2000);
  304. }
  305. });
  306. $(".toPageTop1").click(function(){
  307. $("html,body").animate({
  308. scrollTop:0
  309. },3000);
  310. });
  311.  
  312. });
  313. //passa alla pagina successiva senza reflesh febbr 2025
  314. let isScrolling = false;
  315. function scrollHandler() {
  316. if (isScrolling) return;
  317. if ($(window).scrollTop() + $(window).height() >= $(document).height()) {
  318. isScrolling = true;
  319. const currentPage = document.querySelector('a[aria-current="true"]');
  320. if (currentPage) {
  321. const nextPage = currentPage.nextElementSibling;
  322. if (nextPage && nextPage.tagName.toLowerCase() === 'a') {
  323. nextPage.click();
  324. setTimeout(function() {
  325. isScrolling = false;
  326. }, 3000); // Timeout per prevenire il doppio click
  327. }
  328. }
  329. }
  330. }
  331.  
  332. $(window).scroll(scrollHandler);
  333. ////////////////////////////////////////
  334. //scrollbar
  335. GM_addStyle(`
  336. /*####----BROWSER SCROLL BAR----####*/
  337. ::-webkit-scrollbar {
  338. /*colore di spondo pulsanti su e giu */
  339. background:#303134!important;
  340. width:17px!important;
  341. }
  342.  
  343. /*cursore che scorre*/
  344. ::-webkit-scrollbar-thumb {background-color:#676767!important;border-radius:5px!important;border:2px solid green!important;}
  345.  
  346. /*parte colorata sotto lo scroll */
  347. body::-webkit-scrollbar-track {background:#303134;}
  348.  
  349. /*pulsanti sotto freccine su e giu*/
  350. ::-webkit-scrollbar-button {background-color:#777777;}
  351.  
  352. /*freccia nera sopra*/
  353. ::-webkit-scrollbar-button:single-button:vertical:decrement {display:block;
  354. background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QgFDgonQxmpnwAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAc0lEQVQoz+XRMUoCAACF4Q/BSa/gHjl1Alu8QwguXcC7eApPIXQJt2iKjhAk+DcoJDjonP/8vulxJ1Wr6rNa3wpm1bZju2p5DUyqTfXTX2/Vw/lucAZGWOAZQ3zjgEe8VuMLhClesMc7vvBxwnM8/ecffwFSoEVS/hyFWgAAAABJRU5ErkJggg==)!important;
  355. background-size: cover!important;
  356. background-repeat: no-repeat!important;
  357. border:1px solid red;
  358. }
  359. /*freccia nera sotto*/
  360. ::-webkit-scrollbar-button:single-button:vertical:increment {display:block;
  361. background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4QgFDTUIslAAowAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAAAdUlEQVQoz+XPIQoCUQCE4XnJ4Daz3UuIJ9lsNHoH457CUwhWD+ANBEGzYUG+Da6IsIhZ/zQwDDOT/B7lKTBP0iSZJGl7T5JRkmuSZSnl8JZGhQ0uuOPmwRlrjAdrMcPeixZbTD/uRY1jH9ph8dVRNDhhlT+hA0tUX1KVJjAXAAAAAElFTkSuQmCC)!important;
  362. background-size: cover!important;
  363. background-repeat: no-repeat!important;
  364. border:1px solid red;
  365. }
  366. `);
  367.