Предыстория
Многие помнят недавний скандал об отказе крупных рекламодателей размещаться на YouTube из-за того, что их прероллы (платные ролики перед видео, которые можно пропустить после 5 секунд) показывались в видео с нежелательным контентом. Однако в нашей статье речь пойдет о другой проблеме – детском контенте. Дело в том, что даже при корректных настройках таргетинга на взрослую аудиторию, огромное количество (вплоть до 90%) показов получают детские каналы. Связано это с тем, что родители со своих «взрослых» аккаунтов на своих устройствах, как мобильных, так и десктопах, ставят детям мультики. Разумеется, рекламодателям не хочется тратить рекламный бюджет на детей, которые просто просматривают прероллы, т.к. это не имеет практически никакого эффекта. Такие видео и каналы можно исключать при помощи минус-слов или исключения целых тематик, но это долго, сложно и исключит далеко не все каналы и видео – детский контент довольно разнообразен. Многие малоизвестные детские каналы и видео продолжают показывать в них рекламу из-за того, что у них общие, не характерно детские названия или недостаточное описание, но их все равно смотрят дети в большом количестве. Я решил найти способ автоматизировать поиск и исключение подобных каналов с помощью скриптов AdWords.
Решение 1
Итак, я приступил к созданию своего первого скрипта для поиска детских каналов. AdWords позволяет создавать свои скрипты на JS для управления рекламным аккаунтом. Они созданы на базе Google Apps Scripts и их главным преимуществом является интеграция с другими сервисами Google, такими, как Google Drive, Spreadsheets, YouTube, Analytics, BigQuery и т.д., а также возможность подключать сторонние API. До этого мне уже приходилось работать с YouTube Data API v3 для поиска видео в качестве места размещения. Постараюсь рассказать об этом в другой статье. Так вот, опытным путем получилось установить, что детские видео объединяют не названия, а их теги. Немного модифицировав скрипт для поиска YouTube видео, нашел по разным запросам детских мультиков подобные теги и сохранил их в Google Spreadsheet для дальнейшего использования в новом скрипте. Файл публичный, но рекомендую перед настройкой скрипта скопировать его к себе в Google Drive и заменить id файла в скрипте на новый.
Основные моменты для понимания работы скрипта:
- Из 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]); }
- В цикле отправляем запросы к 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 видеоканала отправляется в массив для исключения, если уже не был добавлен через другое видео с этого же канала.
- После того как все видео были проверены, запускаем цикл на добавление всех каналов в список исключенных площадок в аккаунте 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 файл уже все видео за текущий день.
Настройка скрипта
- Укажите название создаваемого файла в Google Drive
var dataFile = "videoIds.txt";
Если такого файла еще нет, то он создастся автоматически.
- Выберите кампании, которые нужно проверить
'WHERE CampaignName CONTAINS "(Video)"
Синтаксис AWQL есть в справке AdWords.
- Замените id файла Google Spreadsheet на свой
var spreadsheet = SpreadsheetApp.openById('11PMGc70yLE88Npi47Hwb6W36Y8yjw2N2CdXXLgdK12o');
- В интерфейсе AdWords создайте общий список исключаемых мест размещения
var excludedPlacementList = AdWordsApp.excludedPlacementLists().withCondition('Name = "Видеоканалы"').get().next();
и вставьте его название вместо «Видеоканалы».
- Включите в расширенных API YouTube.
- После первых просмотров включите YouTube API в Google Developers Console. Ссылка будет в журнале ошибок.
- Настройте расписание срабатывания скрипта «Каждый час».
Готово!
Финал
В итоге получили скрипт, который проверяет детские каналы каждый час и не упирается в лимит по времени. Из других полезностей, вы можете настроить скрипт на любую тематику, добавляя новые теги в файл spreadsheet. Код обновленного скрипта выложил сюда. С удовольствием отвечу на вопросы и пожелания.
Иногда в исключения попадают и взрослые каналы, но это происходит достаточно редко. Причины могут быть две – или владелец канала размещает в нем не только взрослые, но и детские видео, или умышленно использует детские теги для накрутки и расширения аудитории. По наблюдениям, после того, как вы начнете использовать скрипт, существенно снизится коэффициент просмотров (VTR, View-through rate), так как взрослые жмут кнопку «пропустить» гораздо чаще детей.
Пользуйтесь и размещайтесь на правильных каналах!
Автор: dmitrytonkikh