Добавление тысяч клипов в плейлист YouTube с канала Telegram

С приобретением телевизора с функцией просмотра YouTube и с подпиской на множество каналов Telegram, где ежедневно выкладываются клипы захотелось убрать лишние движения между мобильным телефоном и телевизором для просмотра очередного свежего контента.



Идея проста:

  • Дано: Один или несколько контент-мейкерских каналов Telegram с ежедневным выкладыванием новейших клипов.
  • Задача: Создать плейлист на своём YouTube со всеми этими клипами и автоматический отлов новых.
  • Инструменты: Google Apps Script (GAS), YouTube API



Экспорт истории канала Telegram


Ищем подходящий канал Telegram, который выкладывает посты с клипами YouTube (для примера возьмём @fresh_farsh).

В правом верхнем углу три точки — "Экспорт истории канала".


Для списка ссылок нам нужен только текст, так что снимаем все галочки и ставим максимальный период выгрузки, то есть "с первого сообщения до текущей даты".


Выгружается папка "ChatExport", внутри несколько пронумерованных файлов messages(2,3,4...).html, количество файлов зависит от количества контента канала.


Парсинг канала в в Google таблицы


Нам нужно сделать список ссылок YouTube для добавления в Google таблицу. Я выбрал этот сайт.

В верхнюю строку вводим регулярное выражение:

">(https:\/\/<a href="about:blank">www.youtube.com\/.*</a>?)<\/a>|">(https:\/\/youtu.be\/.*?)<\/a>

Ниже вставляем текст из всех messages(2,3,4).html подряд. В правой панели виден результат.

Жмём кнопку выгрузки результата.


Отжимаем "Include full match in exported data", чтоб не выгружались лишние совпадения. Выбираем CSV, выгружаем.


Создаём Google таблицу.

Копируем в неё CSV, убираем лишние строки, приводим все ссылки к виду youtu.be


Создание канала с плейлистом, API YouTube


Заходим на YouTube.

Справа сверху жмём на иконку аккаунта — "Создать канал".


Придумываем имя, запоминаем ID канала из адресной строки:
https://www.youtube.com/playlist?list=<ID КАНАЛА>

Теперь нам нужно включить YouTube API.
Создаём проект одним из способов:

  • Переходим по ссылке, далее выбираем "API и сервисы — Панель управления — Создать проект"
  • Перейдя сразу по ссылке.

Называем проект, жмём "Создать".

Далее жмём "Включить API и сервисы", ищем "YouTube Data API v3" — Включить.

Итак, API включен.

Возвращаемся к Google таблице.

"Инструменты — редактор скриптов".


Вставляем код, где в idCHannel вставляем ID нашего канала, "Файл — Сохранить" (CTRL+S).


Исходник
idCHannel = 'PLZqUj_5dkPHaAYSECFNOKqnsr2JypZnoo' // ID канала

// Функция добавления клипов из Google таблицы в плейлист YouTube
function fromSheetToYouTube(){
  // Берём активный лист таблицы
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var s = ss.getSheets()[0]
  // Считываем все значения ячеек в массив
  var data = s.getDataRange().getValues()
  // Цикл по вячейкам. 
  for (var d=1; d<=200; d++) {
    try {
      YouTube.PlaylistItems.insert({
        snippet: {
          playlistId: idCHannel,
          resourceId: {
            kind: "youtube#video",
            videoId: data[d][0].replace('https://youtu.be/','')
          }
        }
      }, "snippet")
      // Ставим галочку в столбце B напротив тех, которые успешно отправились
      s.getRange("B"+parseInt(d+1)).setValue('')
      // Пауза между отправками для исключения асинхрона
      Utilities.sleep(1000)
      // Пауза в 15 секунд после каждых 50 запросов
      if (d%50 == 0) Utilities.sleep(15000)
    } catch (e) {
      console.error(e);
    }
  }
}


Теперь надо подключить API к нашему скрипту.

"Ресурсы — Дополнительные функции Google — YouTube Data API — Вкл".



Теперь мы готовы запустить скрипт.

В выпадающем меню "Выбрать функцию" выбираем "fromSheetToYouTube".

Жмём слева треугольник "Выполнить".

Если всё в порядке и нет красных ошибок, горит "Running function fromSheetToYouTube...", значит наш скрипт выполняется.

Клипы добавляются, можно параллельно проверить плейлист.

Добавление идёт со скоростью 1 клип в секунду плюс пауза каждые 50 клипов (по умолчанию 15 секунд)

После выполнения можно посмотреть лог ошибок в меню "Вид — Журналы" либо по нажатию «CTRL+ENTER», там же есть ссылка на просмотр всех ошибок запуска скрипта, называемая „панель инструментов Apps Script

Если мы видим ошибку „The request cannot be completed because you have exceeded your quota“, это означает, что мы превысили ежедневную квоту на операции с API.

Способы экспорта клипов. Квоты.


В YouTube есть ограничения действий с API, называемые квотами.

Описание квот YouTube тут.

Остаток квот можно посмотреть тут по графикам (лучше выставлять сразу промежуток времени самый маленький для наглядности).

Что нам нужно знать из описания про квоты:
Projects that enable the YouTube Data API have a default quota allocation of 10 thousand units per day
10000 квот в день.

A write operation has a cost of approximately 50 units
Одна операция записи имеет стоимость 50 квот.

Если посчитать по калькулятору квот, то одна операция добавления видео в плейлист playlistItems-insert у нас выйдет чуть больше 50 квот если включён snippet.

Итого получаем 10000/53 примерно 188 клипов.

Если к клипу по каким-либо причинам нет доступа или автор удалил его, то запрос пройдёт впустую, потратив одну квоту на чтение.
То есть с учётом процента „недоступных/удалённых» видео мы можем отправить примерно 180 клипов за один день.

Давайте рассмотрим все варианты загрузки клипов от самого медленного к самому эффективному

  1. Вручную
    Это легко, но медленно.
    Заходим в плейлист — “Добавление видео — URL», вставляем нашу ссылку, жмём "Добавить видео".

    Минус естественно в скорости, так как после каждого добавления идёт перезагрузка страницы с плейлистом. Можно покопать в сторону автокликов через аналог Selenium IDE — Katalon, хорошее описание с ссылками и примерами можно посмотреть в статье Обзор и практическое руководство по Katalon Recorder (Selenium IDE++ для Chrome и Firefox)
  2. По 180 клипов в день с одного аккаунта
    Здесь я прочитал про сброс квот в полночь по тихоокеанскому времени.
    Разница с тихоокеанским временем, допустим у Новосибирска минус 15 часов, то есть после 15:00 сбрасываются квоты и опять можно загружать 180 клипов.
  3. С нескольких аккаунтов по 180 штук
    Допустим у нас есть два аккаунта Google: "Общий", "Тест1".

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

    Отрабатываем скрипт fromSheetToYouTube с новыми клипами (которых ещё нет в "Общем"), добавив их в плейлист "Тест1".

    Далее заходим в плейлист "Общий" — "Настройки плейлиста — Расширенные настройки — Соавторы".



    Ставим галочку "Приглашенные пользователи могут добавлять видео в этот плейлист" и копируем ссылку.

    Открываем под пользователем "Тест1" и в правом верхнем углу жмём "Продолжить".

    Теперь у пользователя "Тест1" появилась возможность добавить видео из своего плейлиста в плейлист "Общий".

    Жмём "Добавить все в …"


    Ставим галочку напротив "Общий".


    Появляется "Добавлено в плейлист Общий".

    Наши видео успешно скопированы.

    Посчитаем: с 5-6 аккаунтов мы можем ежедневно парсить около 1000 клипов.

    Используйте общее хранилище аккаунтов, чтоб не запутаться, а для входа под несколькими аккаунтами одновременно с одного браузера можно воспользоваться контейнеризацией.

    Минусы

    1. Начальная настройка занимает определённое время.
    2. Если у вас нет нескольких аккаунтов Google под рукой, создание с одного IP приводит к сообщению от Google о просьбе подтвердить номер телефона.


    Мои усердные попытки совместить VPN и НЕ белый IP привели к успешному созданию всего трёх новых аккаунтов (пришлось вспоминать старые).

    Так что копаем в сторону белых IP+VPN либо регистрации с разных устройств.

    На крайний случай закупаем несколько симок, в любом случае, аккаунты в будущем пригодятся.

    Плюсы

    При желании и большом количестве аккаунтов парсинг нескольких тысяч клипов может занять всего один день.

    TODO

    Попробовать "Серверный аккаунт" наподобие статьи Как работать с API Google Таблиц (Google Sheets API v4) на языке R с помощью нового пакета googlesheets4.
  4. Увеличить квоту:

    • Обращение к Google через Письмо (Бесплатно. Форма запроса на английском).
    • Платно через создание платного аккаунта.
  5. Добавление по 50 клипов с сгенерированных плейлистов. ВАЖНО!
    Пока писал статью, нашёл самый быстрый способ добавления.

    У YouTube есть функционал автогенерации ссылки на плейлист, нужно только вставить через запятую уникальные ID видео из ссылок (не больше 50 штук).
    Пример: https://www.youtube.com/watch_videos?video_ids=<ID1,ID2,ID3>

    Откроется плейлист с уникальным, автоматически сгенерированным, неизменным ID.

    https://www.youtube.com/watch?v=jSPUkvjaiBs&list=<УНИКАЛЬНЫЙ ID>
    Вставляем её сюда: https://www.youtube.com/playlist?disable_polymer=true&list=<УНИКАЛЬНЫЙ ID>

    Атрибут disable_polymer нужен для появления возможности выгрузки созданного плейлиста в свои.

    Жмём в правом верхнем углу три точки, "Добавить все в …" и выбираем свой плейлист (пункт 3 — «Общий»).


    Минусы: скорость и ограничение в 50 ссылок, а также придётся писать парсер либо вручную генерировать ссылки и подставлять их в конечный вариант.

    Плюсы:

    • Плейлист может генерироваться без аккаунта.
    • Нет ограничений на добавление! То есть при должной усидчивости можно вручную все клипы добавить по 50 за раз.

Создание бота Telegram и привязка его к GAS через вебхук


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

Делаем бота по инструкции, придумываем название. После создания бота нам нужен токен вида 123456789:ABCD…

Заходим в нашу Google таблицу в редактор скриптов.

Можно использовать тот же проект, где находится наш предыдущий скрипт fromSheetToYouTube.

Вставляем функцию doPost, она будет ловить на вход сообщения от бота, парсить ссылки регуляркой и добавлять в наш YouTube плейлист.

Исходники
// Отлов сообщений от бота Telegram
function doPost(e) {
  // Парсим входные параметры в JSON
  var inp = JSON.parse(e.postData.contents)
  // Вытягиваем текст сообщения. Если пост канала, то channel_post, иначе это сообщение в бота message
  if (typeof inp.channel_post === 'undefined'){
    var inpTxt = inp.message.text
  }else{
    var inpTxt = inp.channel_post.text
  }
  // Ищем регуляркой ссылку
  var y = /(?<=youtube.com\/watch\?v=)(.*?)$|(?<=youtu.be\/)(.*?)$/.exec(inpTxt)[0]
  try {
    YouTube.PlaylistItems.insert({
      snippet: {
        playlistId: idCHannel, //ссылка канала
        resourceId: {
          kind: "youtube#video",
          videoId: y //ссылка видео
        }
      }
    }, "snippet")
      } catch (e) {
        console.error(e);
      }
}


Добавили, сохранили, надо опубликовать, чтоб получить ссылку доступа.

Жмём „Опубликовать — Развернуть как веб-приложение…

Выпадающие меню выбираем, как на скрине.


Далее нам нужно содержимое всей ссылки https://script.google.com/macros/s…

Как только у нас есть токен бота и ссылка на наше приложение, мы можем их связать через webhook.

https://api.telegram.org/bot<ТОКЕН БОТА>/setWebHook?url=<ССЫЛКА НА ПРИЛОЖЕНИЕ>
Должно вывестись сообщение

{"ok":true,"result":true,"description":"Webhook was set"}

Сразу напишу, что сброс вебхука (отвязка бота от приложения) производится так: https://api.telegram.org/bot<ТОКЕН БОТА>/setWebHook
Выведется

{"ok":true,"result":true,"description":"Webhook was deleted"}

Как обойти блокировки

На ряде провайдеров всё, что связано с работой Telegram через браузер блокируется. Соответственно вызов https://api.telegram.org/ нам выведет „Не удается получить доступ к сайту“.

Тут нам поможет VPN, я использовал для Google Chrome расширение Hotspot Shield Free VPN Proxy — Unlimited VPN

Итак, наш бот связан с скриптом и если что-то написать в бота, функция doPost это поймает и обработает.

Входная структура JSON сообщений тут.

Некоторым в принципе хватит и такой функциональности — подписываемся на множество каналов, парсим все в один плейлист, а потом пересылаем со всех каналов новые посты в бота и знаем, что они моментально добавятся в наш плейлист.

Автоматизация

Чтобы автоматизировать процесс, добавляем бота в канал админом, предварительно прочитав про политики приватности тут.

Теперь при новом посте в канале в наш скрипт будет приходить

JSON.parse(e.postData.contents).channel_post.text

e — входной параметр.

При отправке с бота, соответственно

JSON.parse(e.postData.contents).message.text

На ваше усмотрение можно прикрутить проверку существования клипов, повторы, логи в ячейки и т.д., пользуясь мануалом.

Помним, что GAS отрабатываются при первом запуске не сразу, а примерно через 10-30 секунд, так что ваше первое сообщение боту придёт не сразу.

Заключение


Итак, мы изучили несколько способов добавления клипов.

Вдобавок у нас имеется Telegram бот, привязанный к каналу, способный отлавливать сообщения как из канала, так и адресованные ему, парсить их в GAS и добавлять в плейлист YouTube.
Задача решена.

Источники


Описание всех методов работы с ботами Telegram тут.
Справочник о API YouTube тут
Все команды Google Apps Script тут
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 2

    0

    А не проще было запихнуть данный функционал в телеграм-бота?

      0
      Я забыл написать в статье, что выбрал путь Google Script только из-за доступности.
      Не спорю, хороший телеграм-бот сможет всё это делать, но обычный пользователь, не программист, в большинстве случаев не захочет разворачивать сервер для поддержания бота, плюс писать/улучшать код для него.
      А в моей статье хватит обычного копипаста и двух аккаунтов — Google и Telegram для завершения задачи.

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое