YouTube: Автоматическое получение данных о динамике просмотров

YouTube: Автоматическое получение данных о динамике просмотров

Интересно отслеживать динамику популярности каналов — выраженную в количестве просмотров или подписчиков, — если стоит задача выбрать наиболее перспективные, быстрорастущие каналы и таргетировать на них рекламу. Следить за одним, двумя, десятью каналами совсем не трудно и в полуавтоматическом, и даже в ручном режиме. А если каналов сто или тысяча?

Если имеем список каналов в таблице Google, то шаги такие:

  1. Создаём в Google Script функцию, которая по API берёт данные о нужном параметре канала.
  2. Выполняем её для всех каналов из списка по расписанию.
  3. Анализируем полученные данные и определяем наиболее перспективные каналы.

1. Создание функции

Например, у нас есть список каналов:

hGJGhZ9SOOHvBB0Y4DOO_w
K1i2UviaXLUNrZlAFpw_jA
kK0XNKXOvFkH66AS6jrCCg
KAqou7V9FAWXpZd9xtOg3Q
Kqx9r4mrFglauNBJc1L_eg
BnZ16ahKA2DZ_T5W0FPUXg
lZkHt2kNIgyrTTPnSQV3SA
Rv76wLBC73jiP7LX4C3l8Q
6_h2ICrhla8_zm-K5KKLaA

Добавляем их в таблицу Google на лист, названный channels:

Список каналов с названями

Выбираем в меню «Инструменты» пункт «Редактор скриптов…» и копируем туда следующее содержимое:

var KEY = "KodopiKruAbracadabraInsertYourOwnApiKey" // ЗАМЕНИТЕ НА СВОЙ КЛЮЧ API
var SHEET_NAME = "channels";

function getChannelViews(channel_id){
  var url = "https://www.googleapis.com/youtube/v3/channels?part=statistics&id=UC" + channel_id;
  url = url + "&key=" + KEY;
  var videoListResponse = UrlFetchApp.fetch(url);
  var json = JSON.parse(videoListResponse.getContentText());
  var value = 0;
  if ( typeof json["items"][0] !== 'undefined' ) {
    value = Number(json["items"][0]["statistics"]["viewCount"]);
  }
  return value;
}

function insertChannelsViews() {
  var date = Utilities.formatDate(new Date(), "MSK", "dd.MM.yyyy");
  var sheet_name = SHEET_NAME;
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheet_name);
  if (sheet == null) {
    Logger.log("No such sheet");
    return;
  }
  var first_row = sheet.getRange('1:1');
  var values = first_row.getValues();
  var lc = sheet.getLastColumn();
  var lr = sheet.getLastRow();
  sheet.insertColumnsAfter(lc, 1);
  sheet.getRange(1, lc+1).setValue(date);
  var range = sheet.getRange(2, 1, lr-1, lc);
  var val = range.getValues();
  var r = 1;
  while ( typeof val[r-1] !== 'undefined' ) {
    sheet.getRange(r+1, lc+1).setValue(getChannelViews(val[r-1][0]));
    r++;
  }
}

Не забудьте в первой строчке, как и написано в комментарии, вписать свой ключ API. Взять его можно в Google API Console:

https://console.cloud.google.com/apis/credentials

Функция getChannelViews берёт данные о просмотрах одного канала, а функция insertChannelsViews вставляет на лист channels столбец с данными по всем каналам. А в самую первую строчку она вставляет дату, когда были собраны данные.

2. Получение данных по расписанию

Прежде всего, нужно дать функции insertChannelsViews права на доступ. Для этого запустите её один раз вручную в редакторе скриптов:

Выбор и запуск функции

После этого можно смело настраивать расписание, по которому станет работать функция, вставляющая столбец с данными. Идём в редакторе скриптов в меню «Правка» и выбираем пункт «Триггеры текущего проекта». Появится окно, в котором нужно выбрать нашу функцию insertChannelsViews и установить параметры запуска, например:

Настраиваем и сохраняем триггер

Теперь, после сохранения триггера, функция будет запускаться каждый день где-то между 12-ю и часом ночи.

3. Анализ данных

Очевидно, для анализа динамики нам необходимо как минимум два значения для каждого канала. Так что после пробного запуска в пункте 2 (для предоставления доступа функции) подождите сутки: заодно проверите, как работает расписание.

Итак, у нас есть 2 или больше значения для каждого канала. Как узнать, какой канал быстрее растёт? Проще всего построить графики и визуально определить динамику. Но тут есть неудобства: (а) если каналов много, просто разбегутся глаза; (б) проще и лучше оперировать числами.

Так что вспоминаем школьный курс математики! А именно далаем следующее:

i. Аппроксимируем график прямой линией

Для этого в таблицах Google есть специальная функция LINEST(). Вспоминаем формулу прямой:

y = a⋅x + b

Так вот, LINEST() даёт нам два числа, с помощью которых можно построить линию: угол наклона (a) и смещение (b). Из которых нам нужно только a…

ii. Находим угловой коэффициент

…потому что именно это число, называемое также уголовым коэффициентом, даёт нам представление о «крутизне» прямой. Чем число a больше, тем быстрее растёт наш канал. Также, если кто помнит, число a является производной от y (при y = a⋅x + b имеем y’ = a).

Поскольку LINEST() пишет нам свои два числа в две ячейки, используем функцию INDEX(), чтобы выбрать только первое из них.

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

=INDEX(LINEST(FILTER($F2:2;NOT(ISBLANK($F2:2)));FILTER($F$1:$1;NOT(ISBLANK($F2:2)));TRUE;FALSE);1;1)

Заключение

Самое главное — практика! Вот файл, на примере которого можно “пощупать” всё описанное выше:

https://docs.google.com/spreadsheets/d/11Bgf6PHZnophyTCfk5dPGbBXXtp69IwgMosB9RQhbw0/edit?usp=sharing

Проще всего будет сделать его копию себе в аккаунт: меню «Файл», выбираем «Добавить в мой Диск».

Можно применить фильтр, чтобы сортировать лист по угловому коэффициенту: от большего к меньшему, чтобы самые быстрорастущие каналы были вверху.

Ну и ещё я добавил в одну колонку функцию SPARKLINE(), которая строит наглядный график — с ним как-то всё равно лучше 😋