1

Тема: JS: Цикл с переменными и массив

Доброго времени суток.
По совету, начал переписывать определенный участок кода с ahk, полностью на JS, ибо, возможно кривая работа кода связана именно с этим.
Возникли проблемы (как обычно ).
Собственно, суть скрипта (ЮТУБ):

  • отправил "запрос 1" в строку поиска

  • нажал на кнопку поиска

  • идет поиск на странице по названию канала

  • клик по картинке видоса

  • если не нашел канал - скролл (до победного)

  • далее уже идет запрос 2 и всё пошло по кругу

Красиво всё расписано, но работает через жопу
Отдельно всё протестировано - и вводит запрос, и ищет и скроллит (если нужно).
Как только пытаюсь соединить всё в 1 скрипт - начинаются проблемы.
В данном ниже примере, проблема в том, что после ввода "запрос1" скрипт ступорится и ничего не делает.
Также иногда он начинает скроллить - даже не введя запрос, и на этом также - финиш.
Прошу помощи...

let zaprosi = ["Запрос1", "Запрос2", "Запрос3"]


const delay = (t) =>new Promise (res => setTimeout (res, t));

const findAndClick = async (channelName, td) => {
	while (true) {
		const blocks = Array.from(document.querySelectorAll('div#channel-info'));
 
		let elem = blocks.find((item) => item.innerText.trim().toLowerCase() == channelName.toLowerCase())
 
		if (elem) {
			elem.parentNode.parentNode.querySelector('a#thumbnail').click();
			return;
		} else {
			window.scrollBy(0, 5500);
			await delay (td);
		}
	}
}
 
;(async function () {
	for (const zap of zaprosi) {
		document.querySelector('input#search').value = zap;
		document.querySelector('button#search-icon-legacy').click();
		await findAndClick('Название канала', 3000)
	}
})()

Оригинальные (не изнасилованные мною) части кода:
Ввод запроса и клик:

document.querySelector('input#search').value ='ЗАПРОСЫ ИЗ МАССИВА ПО ОЧЕРЕДИ';
document.querySelector('button#search-icon-legacy').click();

Поиск канала и клик по нужному видосу вариант 1:

const findAndClick = (channelName, delay) => {
  const blocks = Array.from(document.querySelectorAll('div#channel-info'));

  let elem = blocks.find((item) => item.innerText.trim().toLowerCase() == channelName.toLowerCase())

  if (elem) {
    elem.parentNode.parentNode.querySelector('a#thumbnail').click();
  } else {
    window.scrollBy(0, 5500)

    setTimeout(() => {
      findAndClick(channelName, delay)
    }, delay)
  }
}

findAndClick('НАЗВАНИЕ КАНАЛА', 3000)

Поиск канала и клик по нужному видосу вариант 2:

((channelName) => {
   function searchCannel(channelName) {
      const coll = document.querySelectorAll('div#channel-info');
      let elem = '';
      for (let item of coll) {
         if ( item.innerText == channelName && (elem = item) )
            break;
      };
      return elem;
   }
   let channel = '', allElemsCount = 0, counter = 0;
   let timerId = setInterval(() => {
      if ( (channel = searchCannel(channelName)) || counter == 5 ) {
         clearInterval(timerId);
         if (channel)
            channel.parentNode.parentNode.querySelector('a#thumbnail').click();
         else
            alert('Not found!');
      }
      else {
         let newAllElemsCount = document.querySelectorAll('a#thumbnail').length;
         if (!(newAllElemsCount > allElemsCount))
            counter++;
         else {
            allElemsCount = newAllElemsCount;
            window.scrollTo(0, document.querySelector('ytd-app').scrollHeight);
         }
      }
   }, 2000);
})('НАЗВАНИЕ КАНАЛА');
)

Ну, массив с запросами, понятно:

let zaprosi = ["Запрос1", "Запрос2", "Запрос3"]

2

Re: JS: Цикл с переменными и массив

А через api ютуба не проще ли выполнить такую задачу .

3

Re: JS: Цикл с переменными и массив

svoboden
Основная проблема в необходимости получения ключа, что в моем случае крайне неудобно. Плюс ко всему документации на русском к API минимум, как и поддержки. Поэтому пытаюсь написать через Java.

4

Re: JS: Цикл с переменными и массив

Michael пишет:

через Java.

Через какое Java. А так на форуме уже давно были темы, как получать, и как обновлять токен (ключ).

5

Re: JS: Цикл с переменными и массив

svoboden
Ну, всё что в моём первом посте из скриптов - это на JS. Про получение и обновление ключа я находил тему, но там для каждого ключа нужен отдельный аккаунт гугл, что в моем случае не сильно удобно.