Теперь AdWords – это Google Реклама. Новое название отражает, что сервис включает в себя различные рекламные инструменты в поисковой и контекстно-медийной сетях, на YouTube и не только. Подробнее

Сейчас в сети: 505
Сейчас в сети: 505
Учитесь работе в Google Реклама вместе с нами!
star_border

Используем Скрипты AdWords: делаем таргетинг на погоду!

Наверняка вы слышали про Скрипты AdWords. И, скорее всего, на этом знакомство закончилось. Печальный

 

Возможно, многих пугает «знание основ JavaScript». А кто-то, например, не видит смысла в их использовании («Ведь есть же API!»). Я же, наоборот, хочу, чтобы вы поняли, насколько интересный инструмент нам предложили инженеры AdWords.

 

Для этого я использую свой пример, основанный на справочном материале

 

Введение

Спрос на некоторые услуги и продукты сильно зависит от погодных условий.

 

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

 

В силу непредсказуемости погоды в моем городе, мне бы пришлось менять ставки несколько раз в день, и работа превратилась бы в сущую каторгу. К счастью, для поставленной задачи можно использовать Скрипты AdWords, которые будут осуществлять данную процедуру без моего участия.

 

В своем примере я использую из таблицы в Google Docs (в ней содержится названия городов и рекламных кампаний, с которыми я работаю). Также я использую Weather Underground API, предоставляющий информацию о погодных условиях.

 

Предварительные действия

 

Для того, чтобы скрипт заработал, нужно выполнить следующие шаги:

 

Зарегистрироваться на wundeground.com, чтобы получить ключ API

 

Weather Underground позволяет легко получить информацию о погодных условиях в виде JSON-объекта, который мы будем использовать в нашем скрипте. Для доступа к сервису требуется регистрация. Регистрация бесплатная и занимает несколько минут, пройти ее можно на их сайте. Не забудьте записать свой API ключ, который получите после завершения регистрации, иначе вы не сможете получить информацию о погоде.

 

Составить таблицу в Google Docs

 

Требуется составить таблицу, как в моем примере. Главное, чтобы ваш аккаунт AdWords имел к ней доступ. Вы можете скопировать мой пример (Файл > Создать Копию), и заполнить его своим контентом. Здесь важно запомнить URL вашей таблицы, чтобы была возможность к ней обратиться.

 

Пишем скрипт

 

 

Ниже приведены куски кода с небольшими комментариями. Было бы здорово, если бы вы ознакомились с основами JS. Сделать это можно, например здесь или здесь

Если лень читать, можно скопировать код, подставить свои данные и посмотреть, что будет. Веселый

Полная версия кода здесьhttp://goo.gl/1aHuy

Если интерес не угас, читаем дальше  Веселый

 

 

Спойлер

Скрипт будем писать по кусочкам, объединив их в итоге.

 

1. Сначала напишем функцию format, которая упростит нам жизнь.

function format(str,var_args){
for(vari=0;i<arguments.length-1;i++){
var reg= new RegExp('\\{'+i+'\\}','gm');
str=str.replace(reg, arguments[i+1]);
}
return str;
}

 

После шока от увиденного кода може возникнуть вопрос: что это и зачем это, и как это упростит жизнь.

 

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

 

2. Далее вставляем наш API ключ и URL нашей таблицы:

 

var WEATHER_UNDERGROUND_API_KEY = "ВСТАВЬТЕ_СЮДА_API_КЛЮЧ";
var SPREADSHEET_URL = "ВСТАВЬТЕ_СЮДА_URL_ВАШЕЙ_ТАБЛИЦЫ";

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

 

3. Вытаскиваем данные из таблицы 

 

function getSpreadsheetData(spreadsheetUrl){
var matches =new RegExp('key=([^&#]*)').exec(spreadsheetUrl);
if(!matches ||!matches[1]){
throw "Invalid spreadsheet URL: "+spreadsheetUrl;
}
var spreadsheetId= matches[1];
var spreadsheet =SpreadsheetApp.openById(spreadsheetId);
var sheet = spreadsheet.getSheets()[0];
  var range = sheet.getRange(2,1,sheet.getLastRow()-1,sheet.getLastColumn());
return range.getValues();
}

 

Вытаскиваем ID нашей таблице (он спрятан в URL, который мы так бережно хранили).

 

В моем случае ключ следующий: 0AiTcT09QpVO3dEtWaXozVG1KaTZ2TFc5bDRnWllBYXc

 

Далее, вытаскиваем данные из таблицы. 

 

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

 

4.Получаем информацию о погоде:

 

function getWeather(location){
var url= format('http://api.wunderground.com/api/{0}/conditions/q/{1}.json',
encodeURIComponent(WEATHER_UNDERGROUND_API_KEY),
encodeURIComponent(location));

var
response =UrlFetchApp.fetch(url);

if
(response.getResponseCode()!=200){
throw format('Error returned by API: {1}',response.getContentText());
}

var
result =JSON.parse(response.getContentText());

if
(!result['current_observation']){
throw format('Invalid location: {0}', location);
}

return
result['current_observation'];
}

Делаем http запрос с помощью функции URlFetchApp. Если нет никаких ошибок, то получаем функцию в виде JSON объекта. 

 

Ссылка для http запроса выглядит следующим образом:

 

http://api.wunderground.com/api/КЛЮЧ_API/conditions/q/Страна/Город.json

 

Так, для Москвы (в России) ссылка будет выглядеть следующим образом:

 

 

http://api.wunderground.com/api/КЛЮЧ_API/conditions/q/russia/moscow.json

 

Можно также использовать транслитерацию: 

 

http://api.wunderground.com/api/КЛЮЧ_API/conditions/q/rossiya/moskva.json

 

А можно вообще делать так (как в моем примере):

 

http://api.wunderground.com/api/КЛЮЧ_API/conditions/q/moskva,rossiya.json

 

Рекомендую проверять правильность написания городов, переходя по такой ссылке, перед тем, как активировать скрипт.

 

 

5. Изменяем множитель ставки в зависимости от погодных условий:

 

function getBidMultiplier(weather){
// Higher score means higher bids.
var score =0;

// Temperature.
if (weather['temp_c']>0) {
return -1;
} else {
// Wind.

if
(weather['wind_kph']<10) {
score++;
} else if (weather['wind_kph']>20) {
score--;
}

// Snow.
if (weather['precip_today_in']>20) {
score +=5;
} else if (weather['precip_today_in']>10) {
score +=3;
} else if (weather['precip_today_in']>5) {
score ++;
}

// Increase/decrease bid by 10% for each score point.
return 1 + (0.1* score);
}

Наконец то, есть где разгуляться! 

 

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

 

Я, например, будут останавливать кампанию, если температура > 0, в зависимости от уровня выпавших осадков (мм) на сегодняшний день повышаю ставку на 10%, 30% или 50%.

 

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

 

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

 

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

 

6. Изменяем ставку для слов в кампании:

 

function adjustBids(campaignName,bidMultiplier){
var selector =AdWordsApp.keywords().withCondition(
format('CampaignName = "{0}"',campaignName));

var
iterator =selector.get();

while
(iterator.hasNext()){
var keyword =iterator.next();
if(keyword.getMaxCpc()){
keyword.setMaxCpc(keyword.getMaxCpc()*bidMultiplier);
}
}
}

 

Для каждого ключевого слова из кампаний в нашем exel таблицы меняем ставку.

 

7. Наконец, собираем все в кучу:

 

function main() {
var data = getSpreadsheetData(SPREADSHEET_URL);
for (var i = 0; i < data.length; i++) {
var row = data[i];
var campaignName = row[0];
var locationName = row[1];
try {
var weather = getWeather(locationName);
var precip_type = "snow";
if (weather['temp_c'] > 0) {
precip_type = "rain";
}
Logger.log(format('Weather for {0} is {1} °C, {2} kph, and {3} in of {4}.',
locationName, weather['temp_c'], weather['wind_kph'],
weather['precip_today_metric'], precip_type));
} catch (error) {
Logger.log(format('Error getting weather for {0}: {1}', locationName, error));
continue;
}
var bidMultiplier = getBidMultiplier(weather);
if (bidMultiplier < 0) {
AdWordsApp.campaigns().withCondition(format('Name CONTAINS "{0}"', campaignName)).get().next().pause();
Logger.log(format('Campaign "{0}" has been paused', campaignName));
} else {
AdWordsApp.campaigns().withCondition(format('Name CONTAINS "{0}"', campaignName)).get().next().enable();
if (bidMultiplier != 1) {
Logger.log(format('Setting bids to {0}% for campaign "{1}"',
Math.floor(bidMultiplier * 100), campaignName));
adjustBids(campaignName, bidMultiplier);
} else {
Logger.log(format('No bid changes for campaign "{0}".', campaignName));
}
}
}
}

 

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

 

Итог

 

Результат должен выглядеть примерно так: 

 

 

 

Правда, в моем случае изменений не произошло, т.к. кампания была приостановлена. Веселый

 

Впрочем, это не так уж и важно. Цель статьи - помочь вам понять, на что способны Скрипты AdWords.

 

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

 

Творите! 

Владимир Ковтун

Привет! Меня зовут Владимир Ковтун. Я сертифицированный специалист Google AdWords и не только :-) Фанат своего ремесла. Всегда рад помочь!

Комментарии
Андрей_Шестеров Ведущий участник
декабря 2012 - последнее изменение декабря 2012

Владимир, отличная статья! Пора углубляться в программинг Веселый Меня тут на конференции как раз вдохновили на автоматизацию)

Владимир Ковтун Ведущий участник
декабря 2012

Это правильно Веселый 

 

Удачи в этом интересном деле!

FireFlyko
февраля 2013

Спасибо за статью. Вот подумываю автоматизировать работу с стартом включением объявлений товарных позиций для интернет магазинов.


Анна Б
марта 2014

Добрый день!

Для доступа к API Google обязательно предоставление кредитной линии?

demureless Ведущий участник
марта 2014

2 Анна

В РФ - вроде бы именно так как Вы пишите. 
Скрипты AdWords - это немного не то API, для них нужно только разрешение в аккаунте на использование, и если сами пишите - то немного знаний

Иван Ш
августа 2016

Ребят а как можно настроить этот скрипт что б он по фазе луны повышал ставки (в определенную фазу) Веселый ?

Владимир Ковтун Ведущий участник
августа 2016

@Иван Ш, это уже отдельный скрипт нужен.

Нужно ещё календарь стрижек прикрутить к нему Хохочущий смайлик

Иван Ш
августа 2016

Не без шуток , конверсия чуть повышается в определенную фазу )