Перейти к содержимому
RU
Играть

Форум

Флуда требуют наши сердца!


3BEPO3ABP

Рекомендованные сообщения

Летим на Венеру искать жизнь в ракетах, раскрашенных под хохлому и гжель.

© Рогозин

На Венеру, Карл (Наташ)! Где постоянная температура в районе 500°С, осадки из концентрированной серной кислоты и давление в 200 земных атмосфер...

Изменено пользователем P_woland

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

5 минут назад, Guard_of_world сказал:

Странно, что Вашингтона с Колумбом не путают.

А кто-нибудь помнит Америго Веспуччи? Ведь Колумб открыл (как он сам считал) новый путь в Индию, а Веспуччи доказал, что это новый континент, который назвали в его честь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

4 минуты назад, P_woland сказал:

А кто-нибудь помнит Америго Веспуччи? Ведь Колумб открыл (как он сам считал) новый путь в Индию, а Веспуччи доказал, что это новый континент, который назвали в его честь.

Колумб Америку открыл,
Страну для нас совсем чужую.
Дурак! Он лучше бы открыл
На Менделеевской пивную!

  • Хаха 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

26 минут назад, MOLDOBAH_B_TAHKE сказал:

Колумб Америку открыл,
Страну для нас совсем чужую.
Дурак! Он лучше бы открыл
На Менделеевской пивную!

 

Колумб Америку открыл -
Великий был моряк,
Но заодно он научил
Весь мир курить табак.


От трубки мира у костра,
Раскуренной с вождем,
Привычка вредная пошла
В масштабе мировом.

 

 

 

  • Нравится 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Fizzika, зацени скрипт для обезьянки

Скрытый текст

// ==UserScript==
// @name           Find my comments on YouTube.com
// @name:ru        Поиск моих комментариев на YouTube.com

// @description    Find and highlight my comments on YouTube.com. Does not break links. Works with Ajax.
// @description:ru Поиск и выделение моих комментариев на YouTube.com. Не ломает ссылки. Работает с Ajax.

// @namespace      http://tampermonkey.net/
// @author         Professor Woland
// @developer      Professor Woland
// @license        MIT
// @version        1.1
// @match          http*://www.youtube.com/*
// @grant          none
// ==/UserScript==

(function() {
    'use strict';

    var timer = setInterval(findAuthor, 250);

    //Edit
    var color = 'GreenYellow'; // Highlight color
    var author = 'Fizzika'; //Whose comments to highlight?
    var percent = '200%' //Nickname size as a percentage
    var fontWeight = 900 //The most bold font possible (100-900)
    //Edit_End

    function highlightComment (element) {
        element.style.fontWeight = fontWeight;
        element.style.backgroundColor = color
    };

    function highlightNickname (element) {
        element.style.backgroundColor = color;
        element.style.fontSize = percent
    };

    function findAuthor () {
      var els = document.getElementsByClassName('yt-simple-endpoint style-scope ytd-comment-renderer');
      if (els) {
          for (var i=0; i<els.length; i++) {
              if (els[i].id && els[i].id == 'author-text') {
                  var span = els[i].getElementsByTagName('span')[0];
                  if (span.innerHTML && span.innerHTML.includes(author)) {
                      if (span.id && span.id == 'colored_comment') {continue};
                      highlightNickname(span);
                      span.id = 'colored_comment';

                      var parentEl = els[i].parentNode.parentNode.parentNode;
                      if (parentEl.id && parentEl.id == 'main') {
                          var ELS = parentEl.getElementsByClassName('style-scope ytd-expander');
                          if (ELS) {
                              for (var j=0; j<ELS.length; j++) {
                                  if (ELS[j].id && ELS[j].id == 'content') {
                                      var spans = ELS[j].getElementsByTagName('span');
                                      if (spans) {
                                          for (var k=0; k<spans.length; k++) {
                                              highlightComment(spans[k])
                                          }
                                      };
                                      var strings = ELS[j].getElementsByTagName('yt-formatted-string');
                                      if (strings) {
                                          for (var x=0; x<strings.length; x++) {
                                              if (strings[x].id && strings[x].id == 'content-text') {
                                                  highlightComment(strings[x])
                                              }
                                          }
                                      }
                                   }
                               }
                           }
                       }
                   }
               }
           }
       }
    }
})();

 

 

Подсвечивает комментарии определённого автора на ютубе.

Изменено пользователем P_woland

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@P_woland

Проверки вида if (el.x && el.x == "foo") избыточны. Достаточно просто if (el.x == "foo"). В js при обращении к отсутствубщему в объекте свойству возвращается undefined.

Вообще очень много лишних ифов и проверок, из-за этого слишком большая ветвистость и вложенность.

 

Кроме того у тебя везде var, а это не очень хорошо (всё экспортируется в глобальную область видимости). Я бы советовал везде использовать let. Также есть цикл for..of, который выглядит опрятней, чем старомодный for со счётчиком.

Точки с запятой в джсе обычно опускаются.

 

Именования переменных тоже не сильно наглядные (по крайней мере с моей тз).

Ещё можно оптимизировать поиск по DOM'у,  у тебя слишком много запросов идёт. Получается такая мешанина, что без бутылки не разобраться. А ещё эти els и ELS :rolleyes:

 

При поиске по дому нескольких элементов (текста комментария и имени автора) лучше искать один объединяющий их элемент а уже потом из него вытаскивать нужное.

 

Вот как бы этот код написал я (тут без setInterval и таймера, так мне проще тестить было)

Spoiler

(function() {
  'use strict'

  //Edit
  const color = 'GreenYellow' // Highlight color
  const target = 'KresT' //Whose comments to highlight?
  const percent = '200%' //Nickname size as a percentage
  const fontWeight = 900 //The most bold font possible (100-900)

  //Edit_End

  const searchAttribute = "utube-comment-search-plugin::searched"
  const searchAttributeValue = "highlighted"


  function highlightComment (element) {
      element.style.fontWeight = fontWeight
      element.style.backgroundColor = color
  };

  function highlightNickname (element) {
      element.style.backgroundColor = color
      element.style.fontSize = percent
  };

  function findAuthor() {
    let comments = document.querySelectorAll('#main')
    for (const cmnt of comments) {
      if (cmnt.getAttribute(searchAttribute) == searchAttributeValue) {continue;}

      let author = cmnt.querySelector("#author-text > span")
      if (author && author.innerHTML.includes(target)) {
        let content = cmnt.querySelector("#content-text")
        highlightComment(content)
        highlightNickname(author)
        cmnt.setAttribute(searchAttribute, searchAttributeValue)
      }
    }
  }

  findAuthor()

})();

 

 

Но ты и так молодец, штука получилась рабочей.

Изменено пользователем Fizzika

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пробовал сначала  querySelectorAll - не хотел работать. Единственную возможную причину отыскал - метод возвращает статический псевдомассив, а getElementsBy* - динамический. Точно не знаю, будет ли изменяться псевдомассив при догрузке (ajax) комментов при использовании квериСелекторОлл. Или дело было связано со значением атрибута

class = "yt-simple-endpoint style-scope ytd-comment-renderer"

, где три ЦСС класса каскадно применяются друг за другом, то есть указаны в одну строку через пробел. Кароче, ХЗ.

 

 

18 минут назад, Fizzika сказал:

Проверки вида


if (el.x && el.x == "foo")

избыточны.

Не знал. Учил JS году в 2007. А сам применяешь )))

19 минут назад, Fizzika сказал:

let author = cmnt.querySelector("#author-text > span")
if (author && author.innerHTML.includes(target)) {...}

 

 

 

23 минуты назад, Fizzika сказал:

Кроме того у тебя везде var

Тоже подзабыл. Изменим.

 

 

25 минут назад, Fizzika сказал:

Также есть цикл for..of, который выглядит опрятней, чем старомодный for со счётчиком.

Пробовал конструкцию

for (let el in els) {...}

,как в питоне - не сработало.

Или в JS не for...in, a for...of  ???

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сейчас хочу присобачить кнопочку-переключалку рядом с ником - выключать/возобновлять дальнейшее подсвечивание.

Да, ещё изменил setInterval на рекурсивный вызов setTimeout

Так будет гибче.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ПППППППС.

Не понял значение атрибута

utube-comment-search-plugin::searched

Что за      ::сёчд      ?

Не нашёл такого значения поиском.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Исчо более вложенный ПППППС.

У тебя ответы на комментариии тоже хайлайтятся? Там содержимое в разных тегах находится. Уже не в спане.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

11 минуту назад, P_woland сказал:

Не понял значение атрибута


utube-comment-search-plugin::searched

Что за      ::сёчд      ?

Разобрался.

Ты же сам присваиваешь этот атрибут со значением.

Вопрос снят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

32 minutes ago, P_woland said:

Единственную возможную причину отыскал - метод возвращает статический псевдомассив, а getElementsBy* - динамический. Точно не знаю, будет ли изменяться псевдомассив при догрузке (ajax) комментов при использовании квериСелекторОлл. Или дело было связано со значением атрибута 

Так у тебя же каждые 200мс идет опрос, там по сути простой поллинг. В этом случае отсутствие элементов при загрузке страницы тебя никак не должно касаться, на следующей итерации подгрузятся и всё отработает.

Ну а, даже если "динамический" массив, он вроде как никак не должен поменятся, пока твой код работает, так как event loop заблокирован твоим выполняющимся кодом, и не даёт fetchу отработать.

 

32 minutes ago, P_woland said:

А сам применяешь ))) 

В том случае они таки нужны, так как author может быть null

 

32 minutes ago, P_woland said:

Или в JS не for...in, a for...of  ???

В джс есть и то, и другое.

For in для пробежки по свойствам объекта, for of для пробежки по элементам итерируемого контейнера.

 

20 minutes ago, P_woland said:

Не понял значение атрибута 

Ты помечаешь обработанные комменты, записывая в их айдишник какое-то ключевое слово.

По мне это не универсально - у элемента банально может быть свой айдишник, и ты его затрёшь.

 

Поэтому я придумал имя для атрибута (произвольное абсолютно, тут могла быть любая строка), и в этот атрибут записываю тоже придуманное из головы значение value.

Никаких особых смыслов тут нету, а ::searched я написал для красоты, люблю когда в разных ЯП есть оператор "два двоеточия", красиво дофига выглядит.

Изменено пользователем Fizzika
очепятка

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

15 minutes ago, P_woland said:

У тебя ответы на комментариии тоже хайлайтятся? Там содержимое в разных тегах находится. Уже не в спане.

Да.

Ответы на комменты тоже находятся внутри #main.

Причём айдишники у автора ответа и самого ответа такие же, как и у top-level коммента.

 

Ну а в спане я ищу только имя автора (причём там составной ксс-селектор, чтобы лишние спаны не захватывать)

Изменено пользователем Fizzika

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

4 минуты назад, Fizzika сказал:

Поэтому я придумал имя для атрибута

Понял, понял, уже разобрался сам.

4 минуты назад, Fizzika сказал:

люблю когда в разных ЯП есть оператор "два двоеточия", красиво дофига выглядит.

:D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

4 минуты назад, Guard_of_world сказал:

Пусть. Может случайно взломают ТО и как минимум откатят двухнедельный экскремент.

Это неизлечимо :wall:

0fa71d66f587.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Смелые люди однако, Физик и Воланд, такими словами бросаются и не боятся....  Понял, Ондрейко им больше не грозит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

6 часов назад, MOLDOBAH_B_TAHKE сказал:

Ондрейко им больше не грозит

Ондрейко самоликвидировался. Полетел в треш. Удалился. Затёрся. Скрылся. Обнулился.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

13 часа назад, 3BEPO3ABP сказал:

Вам привет из ВОТ) 

 

Zym7ckO.jpeg 

Есть же какой-то ник, идентичный нику Кот в мешке, я и на форуме его видел и в игре попадался. Это ведь его ник был. Чего он не заходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

1 час назад, a-e-r-o-navig сказал:

Есть же какой-то ник, идентичный нику Кот в мешке, я и на форуме его видел и в игре попадался. Это ведь его ник был. Чего он не заходит?

Он не играет больше в ТО.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Пожалуйста, войдите для комментирования

Вы сможете оставить комментарий после входа



Войти сейчас
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×
×
  • Создать...