Предыстория


Многие помнят недавний скандал об отказе крупных рекламодателей размещаться на YouTube из-за того, что их прероллы (платные ролики перед видео, которые можно пропустить после 5 секунд) показывались в видео с нежелательным контентом. Однако в нашей статье речь пойдет о другой проблеме – детском контенте. Дело в том, что даже при корректных настройках таргетинга на взрослую аудиторию, огромное количество (вплоть до 90%) показов получают детские каналы. Связано это с тем, что родители со своих «взрослых» аккаунтов на своих устройствах, как мобильных, так и десктопах, ставят детям мультики. ?Разумеется, рекламодателям не хочется тратить рекламный бюджет на детей, которые просто просматривают прероллы, т.к. это не имеет практически никакого эффекта. Такие видео и каналы можно исключать при помощи минус-слов или исключения целых тематик, но это долго, сложно и исключит далеко не все каналы и видео – детский контент довольно разнообразен. Многие малоизвестные детские каналы и видео продолжают показывать в них рекламу из-за того, что у них общие, не характерно детские названия или недостаточное описание, но их все равно смотрят дети в большом количестве. Я решил найти способ автоматизировать поиск и исключение подобных каналов с помощью скриптов AdWords.

image

Решение 1


Итак, я приступил к созданию своего первого скрипта для поиска детских каналов. AdWords позволяет создавать свои скрипты на JS для управления рекламным аккаунтом. Они созданы на базе Google Apps Scripts и их главным преимуществом является интеграция с другими сервисами Google, такими, как Google Drive, Spreadsheets, YouTube, Analytics, BigQuery и т.д., а также возможность подключать сторонние API. До этого мне уже приходилось работать с YouTube Data API v3 для поиска видео в качестве места размещения. Постараюсь рассказать об этом в другой статье. ?Так вот, опытным путем получилось установить, что детские видео объединяют не названия, а их теги. Немного модифицировав скрипт для поиска YouTube видео, нашел по разным запросам детских мультиков подобные теги и сохранил их в Google Spreadsheet для дальнейшего использования в новом скрипте. Файл публичный, но рекомендую перед настройкой скрипта скопировать его к себе в Google Drive и заменить id файла в скрипте на новый.

Основные моменты для понимания работы скрипта:

  1. Из URL_PERFORMANCE_REPORT получаем все ссылки с местами размещения YouTubе и достаем videoId за вчера.

     var report = AdWordsApp.report(
         'SELECT Url ' +
         'FROM   URL_PERFORMANCE_REPORT ' +
         'WHERE CampaignName CONTAINS "Video" ' +
         'DURING YESTERDAY');
    
      var rows = report.rows();
    
      while (rows.hasNext()) {
        var row = rows.next();
        var videoId = row['Url'].toString().replace('www.youtube.com/video/','');
        videoIdList.push([videoId]);
      }

  2. В цикле отправляем запросы к YouTubе с каждым id видео. Из ответа получаем теги и ID видеоканала и проверяем все теги на пересечение с нашей библиотекой детских тегов.

    for (var i = 0; i < videoList.length; i++) {
        
        var results = YouTube.Videos.list('snippet', {id: videoList[i]});
        try {
          if (results.items[0].snippet !== undefined) {
            
            var channelId = results.items[0].snippet.channelId;
            var tags = results.items[0].snippet.tags;
            if (uniqueChannel[channelId] !== true){
              for (var k = 0; k < tags.length; k++) {
                if (tagsObj[tags[k]] !== undefined) {
                  channels.push([channelId]);
                  uniqueChannel[channelId] = true;
                  Logger.log("Добавить в библиотеку исключений - " + channelId);
                  break;
                } else {
                  continue;
                };
              }
            }
          }
        } catch (e) {
          Logger.log(e);
        }
      }

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

  3. После того как все видео были проверены, запускаем цикл на добавление всех каналов в список исключенных площадок в аккаунте AdWords. Список с названием, идентичным тому, что в скрипте (у меня просто “Видеоканалы”) нужно создать заранее. Лимит для списка исключенных площадок в списке составляет 65000, проблем с его переполнением возникнуть не должно.

    var excludedPlacementList = AdWordsApp.excludedPlacementLists().withCondition('Name = "Видеоканалы"').get().next();
      for (var d = 0; d < channels.length; d++) {
        excludedPlacementList.addExcludedPlacement("youtube.com/channel/"+channels[d].toString());
      };

Проблемы с использованием первого варианта скрипта


Достаточно простое и эффективное решение, но, как оказалось, не все так просто. При использовании данного скрипта у меня возникла следующая проблема: при запуске охватных видеокампаний скрипт не успевал обработать все видео за вчерашний день — упирался во временной лимит 30 минут (внутреннее ограничение AdWords), и не добавлял новые исключения. К тому же, лучше добавлять видео как можно чаще и быстрее, чтобы сэкономить максимум средств. К сожалению, даже после добавления видео в список исключений они, по опыту, начинают действовать не сразу. Техподдержка Google говорит о сроке вплоть до 2 дней (по наблюдениям, обычно раньше).

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

Решение 2


После тестирования первой версии скрипта со знакомым, фанатом автоматизации я понял, что нужно делать проверку каждый час и не проверять видео, которые уже были проверены ранее, иначе скрипт начинал упираться в лимит 30 минут уже к полудню. ?Решение было взято из другого скрипта для изменения ставок от часа к часу, кому интересно, вот ссылка на такое решение. Все получилось немного сложнее, по сравнению с первой версией, но результат получился отличным. Дополнили функционалом сохранения в txt-файл уже проверенных видео в Google Drive, туда записываются все id за сегодня, для того чтобы сравнивать их с новым отчетом каждый час. Сравнение происходит при помощи метода difference из свободной библиотеки Underscore.js.

var videoList = _.difference(videoIdList, data);

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

Настройка скрипта


  1. Укажите название создаваемого файла в Google Drive

    var dataFile = "videoIds.txt";

    Если такого файла еще нет, то он создастся автоматически.

  2. Выберите кампании, которые нужно проверить

    'WHERE CampaignName CONTAINS "(Video)"

    Синтаксис AWQL есть в справке AdWords.

  3. Замените id файла Google Spreadsheet на свой

    var spreadsheet = SpreadsheetApp.openById('11PMGc70yLE88Npi47Hwb6W36Y8yjw2N2CdXXLgdK12o');

  4. В интерфейсе AdWords создайте общий список исключаемых мест размещения

    var excludedPlacementList = AdWordsApp.excludedPlacementLists().withCondition('Name = "Видеоканалы"').get().next();

    и вставьте его название вместо «Видеоканалы».

  5. Включите в расширенных API YouTube.

  6. После первых просмотров включите YouTube API в Google Developers Console. Ссылка будет в журнале ошибок.

  7. Настройте расписание срабатывания скрипта «Каждый час».

Готово!

Финал


В итоге получили скрипт, который проверяет детские каналы каждый час и не упирается в лимит по времени. Из других полезностей, вы можете настроить скрипт на любую тематику, добавляя новые теги в файл spreadsheet. Код обновленного скрипта выложил сюда. С удовольствием отвечу на вопросы и пожелания.

Иногда в исключения попадают и взрослые каналы, но это происходит достаточно редко. Причины могут быть две – или владелец канала размещает в нем не только взрослые, но и детские видео, или умышленно использует детские теги для накрутки и расширения аудитории. ?По наблюдениям, после того, как вы начнете использовать скрипт, существенно снизится коэффициент просмотров (VTR, View-through rate), так как взрослые жмут кнопку «пропустить» гораздо чаще детей.

Пользуйтесь и размещайтесь на правильных каналах!
Поделиться с друзьями
-->

Комментарии (8)


  1. vp_adam_smith
    07.04.2017 00:32

    Хорошая статья, есть о чем подумать.


  1. erty
    07.04.2017 00:32
    +1

    До них наконец-то дошло откуда все эти десятки миллионов просмотров и кликов.
    Ещё бы для взрослых добавили кнопку «Я всё-равно принципиально ничего не куплю, хватит мне показывать свою унылую муру» и на Земле наконец-то наступит мир, покой и процветание.


    1. qw1
      07.04.2017 00:36
      +2

      Для таких есть AdBlock ))


      1. erty
        07.04.2017 16:39

        На андроиде для приложений доступны только листы подменяющие host-файл. Спасают они слабо, в большинстве приложений приходится расплачиваться своим временем и нервами (речь в первую очередь об игрушках-пальцетыках)


        1. qw1
          07.04.2017 21:22

          Почему же? Основные рекламные фреймворки известны, их View можно вырезать из приложений автоматически. Собственно, этим занимается модуль MinMinGuard для XPosed Framework.


  1. Smolski
    10.04.2017 10:28

    Решение хорошее, но вообще детей лучше ограничивать от гаджетов. Думать даже не хочу — что будет за следующее поколение. Да, я олдфаг, но я сам видел что происходит с формированием детей, если не ограничивать их от информационного мусора (пускай даже детского)


  1. Alya_Ef
    14.04.2017 11:23

    Дмитрий, огромное спасибо, очень полезный скрипт! Получилось запустить, но пока не до конца понятно, как он работает, подскажите, пожалуйста:
    1) Как его модифицировать, чтобы можно было создать скрипт на уровне родительского аккаунта (MCC)? Сейчас, насколько я вижу, если скрипт создавать в MCC, он не находит кампании по названию в дочерних аккаунтах.
    2) Добавляет ли он новые найденные каналы в excel на вкладку results или только в список исключений в интерфейсе? Пока все отминусованные скриптом каналы уже присутствовали в этом списке ранее, так что не могу понять.
    3) Как можно с помощью скрипта при первом запуске сразу отминусовать весь ранее собранный список из results?
    4) Теги в файле должны соответствовать тегу на канале полностью? Не действует правило, как на поиске, что вложенные фразы будут показаны по запросу с общей фразой? Т.е. если добавить"смешарики", будут ли отминусованы каналы с тегом "смешарики мультфильм"?


    Спасибо,
    Аля


    1. dmitrytonkikh
      14.04.2017 11:34

      Здравствуйте,
      1. Его можно запускать через MCC в executeInParallel, но нужно изменять название текстового файл с id видео.
      2. Данная версия добавляет их только в общую библиотеку, вы можете скачать id детских каналов вот здесь здесь
      3. Для этого есть отдельный скрипт для того, чтобы не вносить по 100 каналов за раз.
      4. Теги должны соответствовать полностью не на канале, а в видео.