Guest User

Metabot for youtube edited with dislikes

a guest
Mar 21st, 2018
616
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2. // @name         MetaBot for YouTube
  3. // @namespace    yt-metabot-user-js
  4. // @description  More information about users and videos on YouTube.
  5. // @version      180226
  6. // @homepageURL  https://vk.com/public159378864
  7. // @supportURL   https://github.com/asrdri/yt-metabot-user-js/issues
  8. // @updateURL    https://github.com/asrdri/yt-metabot-user-js/raw/master/yt-metabot.meta.js
  9. // @downloadURL  https://github.com/asrdri/yt-metabot-user-js/raw/master/yt-metabot.user.js
  10. // @icon         https://github.com/asrdri/yt-metabot-user-js/raw/master/logo.png
  11. // @include      https://*youtube.com/*
  12. // @include      https://*dislikemeter.com/?v*
  13. // @exclude      https://*youtube.com/*/about
  14. // @require      https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js
  15. // @require      https://github.com/dwachss/bililiteRange/raw/master/bililiteRange.js
  16. // @grant        none
  17. // @run-at       document-start
  18. // ==/UserScript==
  19.  
  20. //-- ПЕРЕМЕННЫЕ ДЛЯ ДИЗЛАЙКОВ --
  21. const minDislikeClickTime = 2000;  //Время между кликами по дизлайкам выбирается случайным образом между этих 2 значений, мс
  22. const maxDislikeClickTime = 4000;  //Время между кликами по дизлайкам выбирается случайным образом между этих 2 значений, мс
  23. var orderedClicksArray = [];       //Массив для временного хранения ссылок на дизлайки(удаляются из массива после клика)
  24. var topClickArrayIndex = 1;        //Счетчик-индикатор верхней заполненной границы массива, это для быстродействия
  25. var bClickTaskSet = 0;             //Индикатор, показывающий запущена ли задача выставления дизлайков, мини оптимизация
  26. //КОНЕЦ ПЕРЕМЕННЫХ ДЛЯ ДИЗЛАЙКОВ
  27.  
  28. const checkb = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAPCAMAAADXs89aAAAA+VBMVEUAAAD///+qqqp/f39mZmZubm5vb29sbGxtbW1tbW1tbW1ubm5ubm5tbW1ubm5tbW1ubm5ubm5ubm5tbW1tbW1ubm5ubm5tbW1ubm5ubm5tbW1ubm5ubm5vb29wcHBxcXFzc3N0dHR1dXV3d3d4eHh6enp7e3t8fHyAgICCgoKFhYWMjIyOjo6Pj4+QkJCSkpKUlJSWlpaZmZmampqdnZ2hoaGqqqqwsLC0tLS1tbW2tra5ubm+vr7ExMTKysrLy8vQ0NDR0dHS0tLU1NTV1dXW1tbe3t7i4uLj4+Pk5OTl5eXn5+fo6Ojq6urs7Ozu7u7w8PD9/f3////SCMufAAAAHHRSTlMAAAMEBSUnKCpbXV9htre6u87Q0dPp6uvs7u/8pkhKVQAAAMdJREFUeNpN0NdWwlAUANEbgvTeQhnQIE1B1ChYQcEC0gL+/8ewzPWwmMf9OMowDKWUP5YqU0pGTaXTHMqdOcM7G7LBIw4Vnc3b89i9BytwYH+uv7oAOqsbyJjCMb4d/urOgYhwqr55wmvdhIRwufXT0zzrgCVM1X2tA5xva1ARLvE4aQCMXoCCcJLaZNpvX71/3QJx4ShUBx+Lz4fp7hrCwmYWL3v5u7XTPmEVtLRfuk7+5OhJIKP9NO2psDIjCatSiId9/7oHY28awgWqV+8AAAAASUVORK5CYII=';
  29. const mred = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAAqFBMVEUAAAD/AAD/MwD+AAD4AAD+AAD+DAD+AAD+AgD+BwD9AAD+AAD+AQD+AgD+AAD9AAD+AQD+AgD+AAD+AAD+AgD+AgD+AgD9AQD/AAD/AgD/DAz/DQ3/EBD/ISH/IiL/IyP/Jib/OTn/PT3/QUH/Q0P/S0v/Tk7/T0//U1P/VFT/Wlr/Z2f/i4v/j4//srL/trb/yMj/zMz/19f/3t7/4uL/9fX/+Pj////schBBAAAAGHRSTlMABAUmJycqXF5ht7e5u8/Q0NTq6+3u7/0SYvJQAAAAgklEQVQIHQXBC1KDMBQAwM0jJWCt9z+mjoNAmo+7CVHyvrSz3ZPE+iyPF8d9HW/Z+pV9vBj3Fj894pmpqKyfKUpBx8C+RoaGBjl2GMNssMUChgFyNNB10OIEwwBnbuDoN+hxXxAl4K/GPCrKo6AeczHe6eFK39P52yWkNW+5nb1O/gHoZT3jykIiwQAAAABJRU5ErkJggg==';
  30. const mgreen = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAAyVBMVEUAAABVqlU/vz8zmTMpniktoy0snywqnSosnywrnysqoSosoCwrnyssoCwroCsrnyssnywsoCwrnysroCsrnysroCssnywsnywrnysroCssnywsoCwuoS44pTg5pjk6pjo8pzw9qD1LrktOr05UslRYtFhctVxgt2Bnu2dqvGptvW1vvm9ywHJ1wXV4wniRzZGs2qzE5MTJ5snS69LU69TW7NbY7djb79vn9Ofq9urw+PDz+fP1+vX5/Pn6/fr7/fv8/fz8/vz///9DdKfSAAAAG3RSTlMAAwQFJScoKltdX2G2t7q7ztDR0+nq6+zu7/wFCQO8AAAAm0lEQVR42jXK1xKCQBBE0WEVRZCsGNqAOeecdf7/o1yg9jx0za0aknKW20DdMQWliiEyQSHNGpRIl8+hqvam5QuyVHYOvEWJXGS6R/6tYVMD8W4AxCf+roCIgD3f+r0zf5YAmlTH8M7XC78XkKrkAKMH83uORJlMuePna4aUQSIAMJlm6WlEhQhKJU+S7iPjyUyIkh01q2VDk/cfpzAWsSatwJQAAAAASUVORK5CYII=';
  31. const morange = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAA8FBMVEUAAAD/qgD/fwD/ZgD+fAD+fAD+fAD+fwD+fwD+fwD/fAD/fwD+fgD+fgD+fgD+fgD+fQD+fgD+fgD+fQD+fQD+fQD+fQD+fgD+fQD+fgD+fQD+fgD+fQD+fgD/fgD/fwH/fwL/gAT/gAX/ggf/gwr/hAz/hQ7/jBz/jh//jiH/lCv/lzL/mTX/mTb/mjf/oEP/oUX/o0j/pk7/pk//qVX/qVb/q1j/r2D/tGv/vHr/vn7/xIv/yJL/zZ3/1Kr/17D/2bP/2bX/27f/4ML/48j/5s7/6dT/6tb/7Nn/8+j/9+//9/D/+fT//vz//v3///+PfT9BAAAAHnRSTlMAAwQFJScpWlxeYGC1trm6u87Q0dPp6urr7O7u/P7y0GwDAAAAp0lEQVR42h2JVQLCUAwEQ6FAcSkOi7u7u2vufxteMz+T2ZDC7glmcumAoZHgNJFv9dslRHXJFDp3Zn7OkFSD3UT9xe/Dg38DRDTyAiv+NFG88h5wUwhojMdA4cInwE8ZCJUd8wRIEITymXmpnKW09IK/c8txCkhv+Sj2kSHuTntiF2lRy8PbyFLYRqQnAax5AyDmIIUeAaqzmvqqtNDc/kQ27nPZ1P0HrvQbttZfcNAAAAAASUVORK5CYII=';
  32. const imgdm = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuM4zml1AAAAQiSURBVEhLrZZ/TJR1HMe/GpRZ/+RWMtvKttZkudKadqnMbBTBbG2mC1GkX8YdDbrMwIkCMbPcoIRMOjR1sFR0pQjz8FC4O9HMSQlzyUaaTA84b3hw9zx3wOG9+3y/99wTBw8Crc/22n3v+32e9/s+n+/n+T7H7hVoZDFBO8sM2tgJ4sZdKxsINLLgwBnmkS3sfJ+ZfSWdZPOVyycXwV/ZTBI1kUE/7AxjQYaQLAzeOmaV69kC5fbxg4SXk8FtLdGx6D/DQFkFvGZWgCPsPkVKO0j8A2JQS2g8BhsYPHWCA1TmKEUyMpQM/pNBGNqrkJGZFSmy/4ayB5Mq0Vj46oXRkHSKJSryoSADU/gi+54ZaD86Xb2JMsTBHbOo7lPVOc7Rohh4LFHqdz7mc9SBIhtqhjZcYtHCQGlTtYs+z5iDfOMz6s23qqdhjm4pumoeUOc4rybqcKLkMfU7H8cnvSTGSjbwnGIrhQkZZIYv5NjKZ2BeXBwqtj+Opr2PYHXyfKxb87y6HqYkdzZeSdChbtejMBNLaVy6ZbZY462t7E1NyIQetJECx76diYTlC7Fw2WJs0Mfijjk6Yp0TaJyCbzY/hSWvvSzgYz7H10gzbNIrOo0mbowU+D+gjRdGvXXsaV4uv9ZFY+FvuB99lofgqZ+OIVtkMwyHjh1h0neS6XgmE342Lv4Ui2R9MVak7yXKYTDmYGtu+ijytuhR9vWbcNVGczMysbMuLcHh8BoPUWtuL0iFfvMvyMqvERyqbkaXs2cUNx3dOHT8HEw7kjDQyOZykwYtYU7AGgVfcyKka99BcjahoLgKhtxjqonF1gZZlkchSRIcjk5k5JQiJSP3SW6SN1L8Lv1y36UESK4/IPfehHT9B/ha38MXhZsmZMJxu904XH0O8WtKPmRBK4ulcgRVAyqL/GcOZI+LPrMxaHtYlIuvbct7d8ImXq8XLVfa8ca6UnP4WTFzES4mt6RC7uuC77fFqniYyZhwHJ2deGv97sshEzt7jgQHBq0PQnZfg3w5WZxZww04X+anRZjUnr6iKR7G6XTio02VkjDhQaLZQ9Yp8F9YQHui3f+1pkV4W78HKVmVWJ1VgZWGcnTcuq1pwMvV/lcH3vm4vE2xoIMSbCpls1tLPAzPru3nJ3C+Yi4uVD6L42Vx+LHqrBDt7u7GJwWH8f5nJnfqp/sda437HCvSyy7SxusUi1DwVycJFRIBLZOR9DdEw5BdDHevBy6XC9tKq7HeaHxBkbt3UMcto6xatISHwxujqDAZrVc70NPTg+8P1CM+decSRWb84KcnZcRfyVWE+tbkwvwo959m/fRiOrtxo+H35tbrolyZWw/6k9J2xSgSkwtRxiY2i/4svMjPIn5U/L2fTeNrr68tWbTKUH41bcO+O/EpO/Xihohg7B/pB5kCVYYVDwAAAABJRU5ErkJggg==';
  33. const imgdma = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABsFBMVEUAAAD//wD/qgD/vwD/zAD+xwD/vwD+xADwuAD+wAD+wgD0tgD1uwD+wAD0uQBZtl3+wgCtvC3yuQCstyv+wQD+wgD+wgD+wgDztwD+wgDxtwDytwD+wQD+wQDyuAD+wQD+wQDytwD+wQD+wgDzuAD1ugD+wQDzuABft1n+wQD+wgBatlz+wQDytwD5vQD+wgD+wgD9wAD+wQD+wQDxtwD+wgDyuAD7vwD+wQAoOD8wPT02QTs8RTk/RzhARzhCSThESjdHTDZZWDFat11eWy9nvWpyaCl1aih4wXR5tkl5ulh6t0l7uEl7xX1/cCaBu1CGt0CKukCOeiGReyCSfCCV0ZeWujqbx2qc1J6ihhumiRqrjBivjxeykRa3lBW4lBXBmhLCmxLEnBHbqwrksQjnswfutwXxwAbyuADyugT0uQD0ugD03ZP03pj06cT068/10Fj10V311nb11nf179318OP18ef18uv2uwD2yTv2zEf2zUn20mH3yDX4vQD4vQL5vQD6vgD6wAn6wQz7vwD7vwH7wAT8wAD8wAH9wAD9wQD9wQL+wQD+wgD/wgD////cSs4bAAAAOXRSTlMAAgMEBRcYGiQpLjE1QUlKTFRUWGNtdn6AgoeMlpmgqbKzt77AxtHY3uDn6Orw8vf4+fn6+/v8/v4dJMtLAAABQUlEQVR42nXP9VMCQRjG8VewEwO7ExQVu7DFBAMVUMSOs7tbwTye+5fdHXC4c/Dzyzu739nZXQqI1Bbq61pqyrLjSCEizwg/z25pvCxoDAh6aMxU/Ya0Bsg9C/nqwAkWFJ6EHP8dBvx11ZzISx6wsgb45h8BuLaBbdenUBHOnmsEhsaB9bYNAN1uwN2DKyGFSAtguX1utW8AzHTX0mLnDDxCEVEhmIXejsFNMF6byWTzQhSq1aRHKDtCNNUGl1t2C+NwTFgsI5OpJPuMvZ+TJCsfOqpEgPg+FiwMlQDc2+3ewbCyZID5ujk8378bVZaYVuDz9PLkVYRFWagY4vHFtQjAIck4iWLrX86OfAhRKP3j/hvchJWTpFk+zKyE5cLvzz2MKqspZOESyv8rpNYUGDAlL1VEv1RRyTq+5XSaeUj6AXAh19PAE4muAAAAAElFTkSuQmCC';
  34. const imgdmd = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAZCAMAAACM5megAAAAllBMVEUAAAB/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAx6H3iAAAAMXRSTlMABAgMFBgcICQoLDA8QERITFBUWGBkaGx4fICDj5OXo6evs7e7v8PH09ff4+fr8/f7vr5GKgAAAN5JREFUeAGFy/FagjAARfEbIoSCWqLJXJoZltEm9/1fru2DPidM+v19DhyjRXEorbftFH654tV7hBtJZsw+yFoKa0dDPcMl2Dqh8U1rA9dLTYvnAFagaNUpXIsLPaoQQBShEdX0kQByHQOWpFcFILGldaZfCkCXQBDHU96xf4DkHhPFAUqRGQoOu6yBFQcc86cxgNGJ983QSmVFPx3gakmvHVwHeugxXI+afVvcymr2ZOhYsyf8v1HokjR+NK3qk0aJriONBI05jVd0fdkfrZzGEl1zIYoJWuFGiBX+/AIRxGBfReXU6wAAAABJRU5ErkJggg==';
  35. const botTargetDay = Date.parse('1 June 2017');
  36. const regexdate = /joinedDateText(.*?)"},{"text":"(.*?)"}]},/;
  37. const regexdatemob = /joined_date_text(.*?)"}, {"text": "(.*?)"}]/;
  38. const regexid = /"video_id":"(.*?)"/;
  39. const regexlinew = /"logged_in","value":"(.*?)"/;
  40. const regexliold = /"logged_in":"(.*?)"/;
  41. const regexlang = /"host_language":"(.*?)"/;
  42. const regexlangmob = /\\"host_language\\": \\"(.*?)\\"/;
  43. const mainDBurl = 'https://raw.githubusercontent.com/YTObserver/YT-ACC-DB/master/mainDB';
  44. if(window.location.hostname == "dislikemeter.com" || window.location.hostname == "www.dislikemeter.com") {
  45.   var videoid = getURLParameter('v', location.search);
  46.   if(videoid) {
  47.     waitForKeyElements('input#form_vid', function dmIDins(jNode) {
  48.       var pNode = jNode.get(0);
  49.       pNode.value = videoid;
  50.     });
  51.     return;
  52.   }
  53. } else if(window.location.pathname == '/channel/UCwBID52XA-aajCKYuwsQxWA/about') {
  54.   var msgu = getURLParameter('msgu', location.search);
  55.   var msgc = getURLParameter('msgc', location.search);
  56.   var msgn = getURLParameter('msgn', location.search);
  57.   if(msgu !== null & msgc !== null & msgn !== null) {
  58.     if(document.querySelector("meta[http-equiv='origin-trial']")) {
  59.       $.fn.sendkeys = function(x) {
  60.         x = x.replace(/([^{])\n/g, '$1{enter}');
  61.         return this.each(function() {
  62.           bililiteRange(this).bounds('selection').sendkeys(x).select();
  63.           this.focus();
  64.         });
  65.       };
  66.       waitForKeyElements('div#labelAndInputContainer', function insertMsgNew(jNode) {
  67.         $(jNode).find('input#input').sendkeys('MetaBot_report_v2: https://www.youtube.com/watch?v=' + msgu + '&lc=' + msgc + ' - ' + msgn);
  68.       });
  69.       waitForKeyElements('ytd-button-renderer.style-scope.ytd-channel-about-metadata-renderer.style-default', function sendMsgNew(jNode) {
  70.         if($(jNode).find('g.style-scope.yt-icon').children().length == 2) {
  71.           jNode.click();
  72.         }
  73.       });
  74.     } else {
  75.       waitForKeyElements('iframe#js-prefetch', function dmIDins(jNode) {
  76.         document.querySelector('button.channel-msg-button').click();
  77.         document.querySelector('textarea.compose-message').value = 'MetaBot_report_v1: https://www.youtube.com/watch?v=' + msgu + '&lc=' + msgc + ' - ' + msgn;
  78.       });
  79.       waitForKeyElements('button.channel-msg-button', function(jNode) {
  80.         $(jNode).css({
  81.           "border-color": "#77fa77",
  82.           "background": "linear-gradient(to right bottom, rgba(0,0,0,0), rgba(100,250,100,0.4))",
  83.           "border-width": "5px",
  84.           "border-style": "solid"
  85.         });
  86.         $(jNode).find('span.yt-uix-button-content').html('Подождите загрузки формы');
  87.         $(jNode).attr('data-tooltip-text', 'Подождите загрузки формы (~5 секунд)');
  88.       });
  89.     }
  90.   }
  91. } else {
  92.   var arrayDB = [];
  93.   var requestDB = new XMLHttpRequest();
  94.   requestDB.onreadystatechange = function() {
  95.     if(requestDB.readyState === 4) {
  96.       if(requestDB.status === 404) {
  97.         console.log("[MetaBot for Youtube] XMLHttpRequest succeed: mainDB not found.");
  98.       }
  99.       if(requestDB.status === 200) {
  100.         var responseDB = requestDB.responseText;
  101.         if(responseDB !== "") {
  102.           console.log("[MetaBot for Youtube] XMLHttpRequest succeed: mainDB loaded.");
  103.           arrayDB = responseDB.match(/[^\r\n=]+/g);
  104.         } else {
  105.           console.log("[MetaBot for Youtube] XMLHttpRequest failed.");
  106.         }
  107.       }
  108.     }
  109.   };
  110.   requestDB.open("GET", mainDBurl, true);
  111.   requestDB.send(null);
  112.   if(document.querySelector("meta[http-equiv='origin-trial']")) {
  113.     console.log('[MetaBot for Youtube] YouTube New design detected.');
  114.     spinnercheckNew();
  115.     waitForKeyElements('div#main.style-scope.ytd-comment-renderer', parseitemNew);
  116.     waitForKeyElements('div#flex', insertdmNew);
  117.   } else if(document.querySelector("meta[http-equiv='Content-Type']")) {
  118.     console.log('[MetaBot for Youtube] YouTube Mobile mode detected.');
  119.     waitForKeyElements('div.vpb', parseitemMob);
  120.   } else {
  121.     console.log('[MetaBot for Youtube] YouTube Classic design detected.');
  122.     waitForKeyElements('.comment-renderer-header', parseitem);
  123.     waitForKeyElements('div#watch7-views-info', insertdm);
  124.   }
  125. }
  126.  
  127. function spinnercheckNew() {
  128.   waitForKeyElements('paper-spinner-lite.ytd-item-section-renderer[aria-hidden="true"]', function(jNode) {
  129.     if (getURLParameter('v', location.search) === null) {
  130.       return;
  131.     }
  132.     console.log('[MetaBot for Youtube] Comment sorting spinner found.');
  133.     var mutationObserver = new MutationObserver(function(mutations) {
  134.       mutations.forEach(function(mutation) {
  135.         if($(jNode).find("#spinnerContainer").hasClass("cooldown")) {
  136.           setTimeout(recheckallNew, 2000);
  137.         } else {
  138.           $('div#main.style-scope.ytd-comment-renderer').each(function() {
  139.             var cNode = $(this).find("#published-time-text")[0];
  140.             deleteitemNew(this, $(cNode).find("a")[0].href);
  141.           });
  142.         }
  143.       });
  144.     });
  145.     mutationObserver.observe($(jNode).get(0), {
  146.       attributes: true,
  147.       attributeFilter: ['active'],
  148.       characterData: false,
  149.       childList: false,
  150.       subtree: true,
  151.       attributeOldValue: false,
  152.       characterDataOldValue: false
  153.     });
  154.   }, false);
  155.   waitForKeyElements('paper-spinner#spinner.yt-next-continuation[aria-hidden="true"]', function(jNode) {
  156.     if (getURLParameter('v', location.search) === null) {
  157.       return;
  158.     }
  159.     console.log('[MetaBot for Youtube] Comment loading spinner found.');
  160.     var mutationObserver = new MutationObserver(function(mutations) {
  161.       mutations.forEach(function(mutation) {
  162.         if($(jNode).find("#spinnerContainer").hasClass("cooldown")) {
  163.           setTimeout(recheckallNew, 2000);
  164.         } else {
  165.           setTimeout(recheckallNew, 2000);
  166.         }
  167.       });
  168.     });
  169.     mutationObserver.observe($(jNode).get(0), {
  170.       attributes: true,
  171.       attributeFilter: ['active'],
  172.       characterData: false,
  173.       childList: false,
  174.       subtree: true,
  175.       attributeOldValue: false,
  176.       characterDataOldValue: false
  177.     });
  178.   }, false);
  179.   waitForKeyElements('paper-spinner#spinner.yt-next-continuation[active]', function(jNode) {
  180.     if (getURLParameter('v', location.search) === null) {
  181.       return;
  182.     }
  183.     console.log('[MetaBot for Youtube] Comment replies loading spinner found.');
  184.     var mutationObserver = new MutationObserver(function(mutations) {
  185.       if (mutations[0].removedNodes) {
  186.         mutationObserver.disconnect();
  187.         setTimeout(recheckallNew, 2000);
  188.       }
  189.     });
  190.     mutationObserver.observe($(jNode).get(0).parentNode, {
  191.       attributes: true,
  192.       characterData: false,
  193.       childList: false,
  194.       subtree: false,
  195.       attributeOldValue: false,
  196.       characterDataOldValue: false
  197.     });
  198.   }, false);
  199. }
  200.  
  201. function recheckallNew(){
  202.   $('div#main.style-scope.ytd-comment-renderer').each(function() {
  203.     recheckNew(this);
  204.   });
  205. }
  206.  
  207. function insertdm(jNode) {
  208.   var videoid = getURLParameter('v', location.search);
  209.   var pNode = $(jNode).get(0);
  210.   var newspan = document.createElement('span');
  211.   newspan.innerHTML = '<a id="dmAdd" title="Добавить видео на анализатор Дизлайкметр" href="https://dislikemeter.com/?v=' + videoid + '"><img src="' + imgdma + '" /></a><span style="padding:0em 1em 0em 0em"></span><a style="padding:0px 0px 0px 1px" id="dmGo" title="Открыть статистику видео на анализаторе Дизлайкметр" href="https://dislikemeter.com/video/' + videoid + '" ><img src="' + imgdm + '" /></a>';
  212.   newspan.id = 'dmPanel';
  213.   $(pNode).css('text-align', 'right');
  214.   pNode.insertBefore(newspan, pNode.firstChild);
  215.   $(pNode).find("#dmPanel")[0].addEventListener("click", function dmClick() {
  216.     this.removeEventListener("click", dmClick);
  217.     var newspan = document.createElement('span');
  218.     newspan.innerHTML = '<a target="_blank" title="Помочь проекту Дизлайкметр" href="https://dislikemeter.com/?donate"><img src="' + imgdmd + '" /></a><span style="padding:0em 1em 0em 0em"></span>';
  219.     $(pNode).find("#dmPanel")[0].insertBefore(newspan, $(pNode).find("#dmPanel")[0].firstChild);
  220.   }, false);
  221.   $(pNode).find("#dmPanel")[0].addEventListener("mouseover", function dmOver() {
  222.     this.removeEventListener("mouseover", dmOver);
  223.     $(this).find("#dmAdd")[0].target = "_blank";
  224.     $(this).find("#dmGo")[0].target = "_blank";
  225.   }, false);
  226. }
  227.  
  228. function insertdmNew(jNode) {
  229.   this.addEventListener('yt-navigate-finish', function insertdmNewR() {
  230.     this.removeEventListener('yt-navigate-finish', insertdmNewR);
  231.     insertdmNew(jNode);
  232.   });
  233.   var videoid = getURLParameter('v', location.search);
  234.   if(typeof videoid === 'undefined') {
  235.     return;
  236.   }
  237.   if(!videoid) {
  238.     return;
  239.   }
  240.   var pNode = $(jNode).get(0);
  241.   if(typeof pNode === 'undefined') {
  242.     return;
  243.   }
  244.   var shareRu = $('button#button[aria-label="Поделиться"]')[0];
  245.   if($(shareRu).length > 0) {
  246.     if($(shareRu).parent().parent().find('yt-formatted-string#text').length > 0) {
  247.       $(shareRu).parent().parent().find('yt-formatted-string#text').html('');
  248.     }
  249.   }
  250.   pNode.innerHTML = '';
  251.   var newspan = document.createElement('span');
  252.   newspan.innerHTML = '<yt-icon-button style="padding:0em 0em 0em 0em" class="style-scope ytd-toggle-button-renderer style-default-active" onclick="window.open(\'https://dislikemeter.com/?v=' + videoid + '\', \'_blank\');" title="Добавить видео на анализатор Дизлайкметр"><a style="padding:0px 0px 0px 1px"><img src="' + imgdma + '" /></a></yt-icon-button><span style="padding:0em 0.5em 0em 0em"></span><yt-icon-button style="padding:0em 0em 0em 0em" class="style-scope ytd-toggle-button-renderer style-default-active" onclick="window.open(\'https://dislikemeter.com/video/' + videoid + '\', \'_blank\');" title="Открыть статистику видео на анализаторе Дизлайкметр"><a style="padding:0px 0px 0px 1px"><img src="' + imgdm + '" /></a></yt-icon-button><span style="padding:0em 1em 0em 0em"></span>';
  253.   newspan.id = 'dmPanel';
  254.   $(pNode).css('text-align', 'right');
  255.   pNode.insertBefore(newspan, pNode.firstChild);
  256.   $(pNode).find("#dmPanel")[0].addEventListener("click", function dmClick() {
  257.     this.removeEventListener("click", dmClick);
  258.     var newspan = document.createElement('span');
  259.     newspan.innerHTML = '<yt-icon-button style="padding:0em 0em 0em 0em" class="style-scope ytd-toggle-button-renderer style-default-active" onclick="window.open(\'https://dislikemeter.com/?donate\', \'_blank\');" title="Помочь проекту Дизлайкметр"><a style="padding:0px 0px 0px 1px"><img src="' + imgdmd + '" /></a></yt-icon-button><span style="padding:0em 0.5em 0em 0em"></span>';
  260.     $(pNode).find("#dmPanel")[0].insertBefore(newspan, $(pNode).find("#dmPanel")[0].firstChild);
  261.   }, false);
  262.   $(pNode).find("#dmPanel")[0].addEventListener("mouseover", function dmOver() {
  263.     this.removeEventListener("mouseover", dmOver);
  264.   }, false);
  265. }
  266.  
  267. function parseitem(jNode) {
  268.   var pNode = $(jNode).parent().parent().get(0);
  269.   $(pNode).hover(function blockShow() {
  270.     $(pNode).find("#t30sp").show();
  271.   }, function blockHide() {
  272.     $(pNode).find("#t30sp").hide();
  273.   });
  274.   pNode = jNode.get(0);
  275.   var userID = $(jNode).find("a")[0].href.split('/').pop();
  276.   var foundID = arrayDB.indexOf(userID);
  277.   var comURL = $(jNode).find("span")[0];
  278.   var t30span = document.createElement('span');
  279.   t30span.innerHTML = ' \u2022 <span id="about" style="cursor: pointer" title="Открыть страницу с датой регистрации">?</span> \u2022 <span id="top30" style="cursor: pointer" title="Найти другие комментарии автора с помощью агрегатора ТОП30"><font color="#7777fa">top</font><font color="#fa7777">30</font></span>';
  280.   t30span.id = 't30sp';
  281.   t30span.style = "display:none";
  282.   if(foundID > -1) {
  283.     console.log("[MetaBot for Youtube] user found in mainDB: " + userID);
  284.     markred(pNode, arrayDB[foundID + 1]);
  285.     $(comURL).after(t30span);
  286.   } else {
  287.     var newspan = document.createElement('span');
  288.     newspan.innerHTML = '<img id="checkbtn" src="' + checkb + '" title="Проверить дату регистрации" style="cursor: help" />';
  289.     newspan.id = 'checksp';
  290.     pNode.insertBefore(newspan, pNode.firstChild);
  291.     t30span.innerHTML += ' \u2022 <span id="sendlinkoff" title="Пожалуйста, проверьте другие комментарии пользователя кнопкой top30">Сообщить</span><span id="sendlink" style="cursor: pointer; display: none" title="Помогите пополнить список известных ботов - отправьте нам ссылку на подозрительный комментарий">Сообщить</span>';
  292.     $(comURL).after(t30span);
  293.     $(jNode).find("img")[0].addEventListener("click", function checkcomment() {
  294.       checkdate(pNode);
  295.     }, false);
  296.     $(jNode).find("#sendlink")[0].addEventListener("click", function displayinfo() {
  297.       sendinfo($(jNode).find("#sendlink"), $(comURL).find("a")[0].href, $(jNode).parent().parent().find("img")[0].alt, regexliold);
  298.       $(jNode).find("#sendlink").css("text-decoration", "line-through");
  299.     }, false);
  300.   }
  301.   $(jNode).find("#about")[0].addEventListener("click", function openaboutNew() {
  302.     window.open($(jNode).find("a")[0].href + '/about');
  303.   }, false);
  304.   $(jNode).find("#top30")[0].addEventListener("click", function openaboutNew() {
  305.     window.open('https://www.t30p.ru/search.aspx?s=' + $(jNode).find("a")[0].href.split('/').pop());
  306.     $(jNode).find("#sendlinkoff").hide();
  307.     $(jNode).find("#sendlink").show();
  308.   }, false);
  309. }
  310.  
  311. function parseitemMob(jNode) {
  312.   var userID = $(jNode).find("a")[0].href.split('/').pop();
  313.   var foundID = arrayDB.indexOf(userID);
  314.   if(foundID > -1) {
  315.     console.log("[MetaBot for Youtube] user found in mainDB: " + userID);
  316.     markredMob(jNode, arrayDB[foundID + 1]);
  317.   } else {
  318.     $(jNode)[0].addEventListener("touchstart", function () {
  319.       $(this).data('moved', '0');
  320.     }, false);
  321.     $(jNode)[0].addEventListener("touchmove", function () {
  322.       $(this).data('moved', '1');
  323.     }, false);
  324.     $(jNode)[0].addEventListener("touchend", function ttend() {
  325.       if($(this).data('moved') == 0){
  326.         if(['en', 'en-US', 'en-GB', 'ru', 'uk'].indexOf(currentlangmob()) < 0) {
  327.           alert('Функция поддерживается только на языках:\n \u2714 English\n \u2714 Русский\n \u2714 Українська\nВы можете сменить язык интерфейса в меню настроек YouTube.');
  328.           return;
  329.         }
  330.         this.removeEventListener("touchend", ttend);
  331.         checkdateMob(this);
  332.       }
  333.     }, false);
  334.   }
  335. }
  336.  
  337. function parseitemNew(jNode) {
  338.   var pNode = $(jNode).find("#header-author.ytd-comment-renderer")[0];
  339.   $(jNode).hover(function blockShow() {
  340.     $(pNode).find("#t30sp").show();
  341.   }, function blockHide() {
  342.     $(pNode).find("#t30sp").hide();
  343.   });
  344.   var userID = $(jNode).find("a")[0].href.split('/').pop();
  345.   var foundID = arrayDB.indexOf(userID);
  346.   var comURL = $(jNode).find("#published-time-text")[0];
  347.   var t30span = document.createElement('span');
  348.   t30span.innerHTML = ' \u2022 <span id="about" style="cursor: pointer" title="Открыть страницу с датой регистрации">?</span> \u2022 <span id="top30" style="cursor: pointer" title="Найти другие комментарии автора с помощью агрегатора ТОП30"><font color="#7777fa">top</font><font color="#fa7777">30</font></span>';
  349.   t30span.id = 't30sp';
  350.   t30span.style = "display:none";
  351.   var newspan = document.createElement('span');
  352.   newspan.id = 'checksp';
  353.   if(foundID > -1) {
  354.     console.log("[MetaBot for Youtube] user found in mainDB: " + userID);
  355.     markredNew($(pNode).parent(), arrayDB[foundID + 1]);
  356.     $(comURL).append(t30span);
  357.     $(newspan).attr('data-chan', $(jNode).find("a#author-text")[0].href);
  358.     pNode.insertBefore(newspan, pNode.firstChild);
  359.   } else {
  360.     newspan.innerHTML = '<img id="checkbtn" src="' + checkb + '" title="Проверить дату регистрации" style="cursor: help" />';
  361.     $(newspan).attr('data-chan', $(jNode).find("a#author-text")[0].href);
  362.     pNode.insertBefore(newspan, pNode.firstChild);
  363.     t30span.innerHTML += ' \u2022 <span id="sendlinkoff" title="Пожалуйста, проверьте другие комментарии пользователя кнопкой top30">СООБЩИТЬ</span><span id="sendlink" style="cursor: pointer; display: none" title="Помогите пополнить список известных ботов - отправьте нам ссылку на подозрительный комментарий">СООБЩИТЬ</span>';
  364.     $(comURL).append(t30span);
  365.     $(jNode).find("#checkbtn")[0].addEventListener("click", function checkcommentNew() {
  366.       checkdateNew($(pNode).parent());
  367.     }, false);
  368.     $(jNode).find("#sendlink")[0].addEventListener("click", function displayinfoNew() {
  369.       sendinfo($(comURL).find("#sendlink")[0], $(comURL).find("a")[0].href, $(jNode).parent().find("img#img")[0].alt, regexlinew);
  370.       $(jNode).find("#sendlink").css("text-decoration", "line-through");
  371.     }, false);
  372.   }
  373.   $(jNode).find("#about")[0].addEventListener("click", function openaboutNew() {
  374.     window.open($(jNode).find("a")[0].href + '/about');
  375.   }, false);
  376.   $(jNode).find("#top30")[0].addEventListener("click", function openaboutNew() {
  377.     window.open('https://www.t30p.ru/search.aspx?s=' + $(jNode).find("a")[0].href.split('/').pop());
  378.     $(jNode).find("#sendlinkoff").hide();
  379.     $(jNode).find("#sendlink").show();
  380.   }, false);
  381.   this.addEventListener('yt-navigate-start', function wipeitemNewS() {
  382.     this.removeEventListener('yt-navigate-start', wipeitemNewS);
  383.     deleteitemNew(jNode, $(comURL).find("a")[0].href);
  384.   });
  385.   this.addEventListener('yt-navigate-finish', function wipeitemNewF() {
  386.     this.removeEventListener('yt-navigate-finish', wipeitemNewF);
  387.     deleteitemNew(jNode, $(comURL).find("a")[0].href);
  388.   });
  389. }
  390.  
  391. function recheckNew(jNode) {
  392.   var checkre = $(jNode).find("#checksp").get(0);
  393.   if(typeof checkre !== 'undefined') {
  394.     if($(checkre).attr('data-chan') !== $(jNode).find("a#author-text")[0].href) {
  395.       $(jNode).find("#checksp").remove();
  396.       $(jNode).find("#t30sp").remove();
  397.       $(jNode).find("#botmark").remove();
  398.       var cNode = $(jNode).parent().parent().find("#content-text");
  399.       $(cNode).parent().removeAttr('style');
  400.       $(cNode).removeAttr('style');
  401.       parseitemNew(jNode);
  402.     }
  403.   }
  404. }
  405.  
  406. function deleteitemNew(jNode, url) {
  407.   if(url.length > 74) {
  408.     $(jNode).parent().parent().remove();
  409.   } else {
  410.     $(jNode).parent().parent().parent().remove();
  411.   }
  412. }
  413.  
  414. function sendinfo(jNode, link, username, regexpid) {
  415.   if(regexpid.exec(document.body.innerHTML)[1] == "1") {
  416.     window.open('https://www.youtube.com/channel/UCwBID52XA-aajCKYuwsQxWA/about?msgu=' + getURLParameter('v', link) + '&msgc=' + getURLParameter('lc', link) + '&msgn=' + username);
  417.   } else {
  418.     alert("Для отправки сообщений необходимо войти в аккаунт Google.");
  419.   }
  420. }
  421.  
  422. function checkdate(jNode) {
  423.   if(['en', 'en-US', 'en-GB', 'ru', 'uk'].indexOf(currentlang()) < 0) {
  424.     alert('Функция поддерживается только на языках:\n \u2714 English\n \u2714 Русский\n \u2714 Українська\nВы можете сменить язык интерфейса в меню настроек YouTube.');
  425.     return;
  426.   }
  427.   $(jNode).find("img")[0].remove();
  428.   var channelURL = $(jNode).find("a")[0].href + '/about';
  429.   var request = new XMLHttpRequest();
  430.   request.onreadystatechange = function() {
  431.     if(request.readyState === 4) {
  432.       if(request.status === 200) {
  433.         var response = request.responseText;
  434.         if(response !== "") {
  435.           console.log("[MetaBot for Youtube] XMLHttpRequest succeed.");
  436.           window.tempHTML = document.createElement('html');
  437.           tempHTML.innerHTML = response;
  438.           window.aboutSTAT = tempHTML.getElementsByClassName('about-stat');
  439.           var testday = Dparse(aboutSTAT[aboutSTAT.length - 1].innerHTML);
  440.           if(Date.parse(testday) > botTargetDay) {
  441.             $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + morange + '" title="Дата регистрации позже 1 июня 2017" /> ' + testday;
  442.             cNode = jNode.nextSibling;
  443.             $(cNode).css({
  444.               "background": "rgba(250,200,0,0.3)",
  445.               "border-left": "3px solid rgba(250,200,0,0.3)",
  446.               "padding-left": "3px"
  447.             });
  448.           } else {
  449.             $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + mgreen + '" title="Дата регистрации раньше 1 июня 2017" /> ' + testday;
  450.             cNode = jNode.nextSibling;
  451.             $(cNode).css({
  452.               "background": "rgba(100,250,100,0.3)",
  453.               "border-left": "3px solid rgba(100,250,100,0.3)",
  454.               "padding-left": "3px"
  455.             });
  456.           }
  457.           delete window.aboutSTAT;
  458.           delete window.tempHTML;
  459.         } else {
  460.           console.log("[MetaBot for Youtube] XMLHttpRequest failed.");
  461.         }
  462.       }
  463.     }
  464.   };
  465.   request.open("GET", channelURL, true);
  466.   request.send(null);
  467. }
  468.  
  469. function checkdateMob(jNode) {
  470.   var channelURL = $(jNode).find("a")[0].href + '/about?ajax=1';
  471.   var request = new XMLHttpRequest();
  472.   request.onreadystatechange = function() {
  473.     if(request.readyState === 4) {
  474.       if(request.status === 200) {
  475.         var response = request.responseText;
  476.         if(response !== "") {
  477.           console.log("[MetaBot for Youtube] XMLHttpRequest succeed.");
  478.           var matches = regexdatemob.exec(response);
  479.           var testday = Dparse(decodeURIComponent(JSON.parse('"' + matches[2] + '"')));
  480.           if(Date.parse(testday) > botTargetDay) {
  481.             $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + morange + '" title="Дата регистрации позже 1 июня 2017" /> ' + testday;
  482.             cNode = $(jNode).find("div.tpb")[0];
  483.             $(cNode).css({
  484.               "background": "rgba(250,200,0,0.3)",
  485.               "border-left": "3px solid rgba(250,200,0,0.3)",
  486.               "padding-left": "3px"
  487.             });
  488.           } else {
  489.             $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + mgreen + '" title="Дата регистрации раньше 1 июня 2017" /> ' + testday;
  490.             cNode = $(jNode).find("div.tpb")[0];
  491.             $(cNode).css({
  492.               "background": "rgba(100,250,100,0.3)",
  493.               "border-left": "3px solid rgba(100,250,100,0.3)",
  494.               "padding-left": "3px"
  495.             });
  496.           }
  497.         } else {
  498.           console.log("[MetaBot for Youtube] XMLHttpRequest failed.");
  499.         }
  500.       }
  501.     }
  502.   };
  503.   request.open("GET", channelURL, true);
  504.   request.send(null);
  505. }
  506.  
  507. function checkdateNew(jNode) {
  508.   if(['en', 'en-US', 'en-GB', 'ru', 'uk'].indexOf(currentlang()) < 0) {
  509.     alert('Функция поддерживается только на языках:\n \u2714 English\n \u2714 Русский\n \u2714 Українська\nВы можете сменить язык интерфейса в меню настроек YouTube.');
  510.     return;
  511.   }
  512.   var idspan = document.createElement('span');
  513.   idspan.id = 'checked';
  514.   idspan.innerHTML = 'checked';
  515.   $(jNode).find("#checkbtn")[0].remove();
  516.   var userID = $(jNode).find("a")[0].href.split('/').pop();
  517.   var foundID = arrayDB.indexOf(userID);
  518.   if(foundID > -1) {
  519.     console.log("[MetaBot for Youtube] user found in mainDB: " + userID);
  520.     markredNew(jNode, arrayDB[foundID + 1]);
  521.   } else {
  522.     var channelURL = $(jNode).find("a")[0].href + '/about';
  523.     var request = new XMLHttpRequest();
  524.     request.onreadystatechange = function() {
  525.       if(request.readyState === 4) {
  526.         if(request.status === 200) {
  527.           var response = request.responseText;
  528.           if(response !== "") {
  529.             console.log("[MetaBot for Youtube] XMLHttpRequest succeed.");
  530.             var matches = regexdate.exec(response);
  531.             var testday = Dparse(matches[2]);
  532.             var aNode = $(jNode).find("#author-text")[0];
  533.             var cNode = $(jNode).parent().find("#content-text")[0];
  534.             var newspan = document.createElement('span');
  535.             newspan.id = 'botmark';
  536.             var checkBadge = $(aNode).parent().find('span#author-comment-badge')[0];
  537.             if(Date.parse(testday) > botTargetDay) {
  538.               newspan.innerHTML = '<img src="' + morange + '" title="Дата регистрации позже 1 июня 2017" /> ' + testday;
  539.               $(aNode).append(newspan);
  540.               if($(checkBadge).length > 0) {
  541.                 $(checkBadge).attr('hidden', '');
  542.                 $(aNode).removeAttr('hidden');
  543.               }
  544.               $(cNode).parent().css({
  545.                 "background": "rgba(250,200,0,0.3)",
  546.                 "border-left": "3px solid rgba(250,200,0,0.3)",
  547.                 "padding-left": "3px"
  548.               });
  549.             } else {
  550.               newspan.innerHTML = '<img src="' + mgreen + '" title="Дата регистрации раньше 1 июня 2017" /> ' + testday;
  551.               $(aNode).append(newspan);
  552.               if($(checkBadge).length > 0) {
  553.                 $(checkBadge).attr('hidden', '');
  554.                 $(aNode).removeAttr('hidden');
  555.               }
  556.               $(cNode).parent().css({
  557.                 "background": "rgba(100,250,100,0.3)",
  558.                 "border-left": "3px solid rgba(100,250,100,0.3)",
  559.                 "padding-left": "3px"
  560.               });
  561.             }
  562.             aNode = $(jNode).find("#checksp");
  563.             aNode.attr('data-chan', $(jNode).find("a#author-text")[0].href);
  564.             aNode.hide();
  565.           } else {
  566.             console.log("[MetaBot for Youtube] XMLHttpRequest failed.");
  567.           }
  568.         }
  569.       }
  570.     };
  571.     request.open("GET", channelURL, true);
  572.     request.send(null);
  573.   }
  574. }
  575.  
  576. function markred(jNode, day) {
  577.   $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + mred + '" title="Пользователь найден в списке ЕРКЮ" /> ' + day;
  578.   cNode = jNode.nextSibling;
  579.   $(cNode).css({
  580.     "background": "rgba(250,100,100,0.3)",
  581.     "border-left": "3px solid rgba(250,100,100,0.3)",
  582.     "padding-left": "3px"
  583.   });
  584.   //вносим бота в массив для проставления дизлайков(старый классический дизайн ютуба)
  585.   requestDislike(jNode, false);
  586. }
  587.  
  588. function markredMob(jNode, day) {
  589.   $(jNode).find("a")[0].innerHTML = $(jNode).find("a")[0].innerHTML + ' <img src="' + mred + '" title="Пользователь найден в списке ЕРКЮ" /> ' + day;
  590.   cNode = $(jNode).find("div.tpb")[0];
  591.   $(cNode).css({
  592.     "background": "rgba(250,100,100,0.3)",
  593.     "border-left": "3px solid rgba(250,100,100,0.3)",
  594.     "padding-left": "3px"
  595.   });
  596. }
  597.  
  598. function markredNew(jNode, day) {
  599.   var aNode = $(jNode).find("#author-text")[0];
  600.   var cNode = $(jNode).parent().find("#content-text")[0];
  601.   var newspanN = document.createElement('span');
  602.   newspanN.id = 'botmark';
  603.   newspanN.innerHTML = '<img src="' + mred + '" title="Пользователь найден в списке ЕРКЮ" /> ' + day;
  604.   $(aNode).append(newspanN);
  605.   var checkBadge = $(aNode).parent().find('span#author-comment-badge')[0];
  606.   if($(checkBadge).length > 0) {
  607.     $(checkBadge).attr('hidden', '');
  608.     $(aNode).removeAttr('hidden');
  609.   }
  610.   $(cNode).parent().css({
  611.     "background": "rgba(250,100,100,0.3)",
  612.     "border-left": "3px solid rgba(250,100,100,0.3)",
  613.     "padding-left": "3px"
  614.   });
  615.   //вносим бота в массив для проставления дизлайков(новый дизайн ютуба)
  616.   requestDislike(jNode, true);
  617. }
  618.  
  619. function Dparse(day) {
  620.   day = day.replace(/Joined |Дата регистрации: |Ви приєдналися /i, '');
  621.   day = day.replace(/ янв. | января | січ. /i, ' Jan, ');
  622.   day = day.replace(/ февр. | февраля | лют. /i, ' Feb, ');
  623.   day = day.replace(/ мар. | марта | бер. /i, ' Mar, ');
  624.   day = day.replace(/ апр. | апреля | квіт. /i, ' Apr, ');
  625.   day = day.replace(/ мая. | мая | трав. /i, ' May, ');
  626.   day = day.replace(/ июн. | июня | черв./i, ' Jun, ');
  627.   day = day.replace(/ июл. | июля | лип. /i, ' Jul, ');
  628.   day = day.replace(/ авг. | августа | серп. /i, ' Aug, ');
  629.   day = day.replace(/ сент. | сентября | вер. /i, ' Sep, ');
  630.   day = day.replace(/ окт. | октября | жовт. /i, ' Oct, ');
  631.   day = day.replace(/ нояб. | ноября | лист. /i, ' Nov, ');
  632.   day = day.replace(/ дек. | декабря | груд. /i, ' Dec, ');
  633.   day = day.replace(/ г.| р./i, '');
  634.   return day;
  635. }
  636.  
  637. function currentlang() {
  638.   return regexlang.exec(document.body.innerHTML)[1];
  639. }
  640.  
  641. function currentlangmob() {
  642.   return regexlangmob.exec(document.body.innerHTML)[1];
  643. }
  644.  
  645. function getURLParameter(name, link) {
  646.   return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(link) || [null, ''])[1].replace(/\+/g, '%20')) || null;
  647. }
  648.  
  649. function waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector) {
  650.   var targetNodes, btargetsFound;
  651.   if(typeof iframeSelector == "undefined") targetNodes = $(selectorTxt);
  652.   else targetNodes = $(iframeSelector).contents().find(selectorTxt);
  653.   if(targetNodes && targetNodes.length > 0) {
  654.     btargetsFound = true;
  655.     targetNodes.each(function() {
  656.       var jThis = $(this);
  657.       var alreadyFound = jThis.data('alreadyFound') || false;
  658.       if(!alreadyFound) {
  659.         var cancelFound = actionFunction(jThis);
  660.         if(cancelFound) btargetsFound = false;
  661.         else jThis.data('alreadyFound', true);
  662.       }
  663.     });
  664.   } else {
  665.     btargetsFound = false;
  666.   }
  667.   var controlObj = waitForKeyElements.controlObj || {};
  668.   var controlKey = selectorTxt.replace(/[^\w]/g, "_");
  669.   var timeControl = controlObj[controlKey];
  670.   if(btargetsFound && bWaitOnce && timeControl) {
  671.     clearInterval(timeControl);
  672.     delete controlObj[controlKey];
  673.   } else {
  674.     if(!timeControl) {
  675.       timeControl = setInterval(function() {
  676.         waitForKeyElements(selectorTxt, actionFunction, bWaitOnce, iframeSelector);
  677.       }, 300);
  678.       controlObj[controlKey] = timeControl;
  679.     }
  680.   }
  681.   waitForKeyElements.controlObj = controlObj;
  682. }
  683.  
  684. //функция заносит найденные записи ботов в массив для последующего проставления дизлайков
  685. //by h010c
  686. function requestDislike(jNode, isNew) {
  687.   var i;
  688.   var botDislike;
  689.   if (isNew) {
  690.     botDislike = $(jNode).parent().find("#dislike-button:not(.style-default-active)")[0];   //Дизлайк на новом дизайне ютуба
  691.   } else {
  692.     botDislike = $(jNode).parent().find("button.sprite-dislike[aria-checked='false']")[0];  //Дизлайк на старом дизайне ютуба
  693.   }
  694.   if (botDislike) {
  695.     //перебираем элементы массива и делаем запись в найденную пустую ячейку
  696.     for (i = 0; i < topClickArrayIndex; i++) {
  697.       if (orderedClicksArray[i] == 0) {
  698.         orderedClicksArray[i] = botDislike;
  699.         break;
  700.       }
  701.     }
  702.     //если пустых ячеек в массиве не найдено, то добавляем новую ячейку в конце массива
  703.     if (i == topClickArrayIndex) {
  704.       orderedClicksArray[i] = botDislike;
  705.       //и увеличиваем счетчик-указатель верхней границы поиска для циклов проверки
  706.       topClickArrayIndex++;
  707.     }
  708.     //запускаем задачу проставления дизлайков, если она еще не запущена
  709.     if (bClickTaskSet == 0) {
  710.       scheduledDislike();
  711.       bClickTaskSet = 1;
  712.     }
  713.   }
  714. }
  715.  
  716. //функция кликает по дизлайкам через случайные промежутки времени
  717. //by h010c
  718. function scheduledDislike() {
  719.   var i;
  720.   //перебираем элементы массива до указанного счетчика внесенных записей
  721.   for (i = 0; i < topClickArrayIndex; i++) {
  722.     if (orderedClicksArray[i]) {
  723.       if ((orderedClicksArray[i]).getAttribute("aria-checked") == "false" || !((orderedClicksArray[i]).classList.contains("style-default-active"))) {
  724.         $(orderedClicksArray[i]).css({"background": "rgba(250,100,100,0.3)"});
  725.         orderedClicksArray[i].click();
  726.       }
  727.       orderedClicksArray[i] = 0;
  728.       break;
  729.     }
  730.   }
  731.   //проверка числа записей в массиве и указание верхней границы для перебора в цикле
  732.   if (i == topClickArrayIndex - 1) {
  733.     for (i = topClickArrayIndex - 1; i > 0; i--) {
  734.       if (orderedClicksArray[i] == 0) {
  735.         topClickArrayIndex--;
  736.       } else {
  737.         break;
  738.       }
  739.     }
  740.   }
  741.   //перезапускаем функцию через случайный промежуток времени
  742.   setTimeout(scheduledDislike, minDislikeClickTime + Math.random() * (maxDislikeClickTime - minDislikeClickTime));
  743. }
Add Comment
Please, Sign In to add comment