AdWords
Сейчас в сети: 561
Сейчас в сети: 561
Советы и вопросы по использованию скриптов AdWords
Подсказки
star_border
Ответить

Скрипт для остановки товаров не в наличии

Бакалавр ✭ ✭ ✭

Добрый день.

 

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

которые перестали быть в наличии от freeadwordsscripts.com

http://www.freeadwordsscripts.com/2013/10/disable-ads-and-keywords-for-out-of.html

 

Суть его работы в том что ищет определенный код html на странице и при его присутствии

останавливает объявление. Но насколько понял это работает только с англоязычным текстом

и тэгами html. С русским текстом типа "Нет в наличии" как триггер у меня он не захотел работать.


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

 

Спасибо

 

 

1 Ответ экспертаverified_user

Re: Скрипт для остановки товаров не в наличии

Ведущий участник
Спасибо за наводку. Попробую разобраться и потестировать
C уважением,
Павел

Re: Скрипт для остановки товаров не в наличии

Бакалавр ✭ ✭ ✭
Demureless, была возможность протестить ?

Re: Скрипт для остановки товаров не в наличии

Ведущий участник

Chameleon-od написано:

 

Суть его работы в том что ищет определенный код html на странице и при его присутствии

останавливает объявление. 


Немного не так, он ищет "out of stock" (нет в наличии) и если находит ставит объявления в паузу.

 

Скрипт можно признать  рабочим, но с оговорками.
Если реклама построена по схеме
Запросы на главную
Запросы на категории
Запросы на карточку товара
Корректная работа будет только в том случае если в категориях (и главной) у Вас не используется "нет в наличии" - а это распространенный метод

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

ad10.png

Так или иначе учитывайте это момент

 


С русским текстом типа "Нет в наличии" как триггер у меня он не захотел работать.

 


 Попробуйте это, вроде работает но с оговорками "этажом" выше

/************************************
* Item Out Of Stock Checker
* Version 1.1
* ChangeLog v1.1 - Filtered out deleted Campaigns and AdGroups
* Created By: Russ Savage
* FreeAdWordsScripts.com
***********************************/
var URL_LEVEL = 'Ad'; // or Keyword
var ONLY_ACTIVE = true; // set to false for all ads or keywords
var CAMPAIGN_LABEL = ''; // set this if you want to only check campaigns with this label
var STRIP_QUERY_STRING = true; // set this to false if the stuff that comes after the question mark is important
var WRAPPED_URLS = true; // set this to true if you use a 3rd party like Marin or Kenshoo for managing you account
// This is the specific text to search for 
// on the page that indicates the item 
// is out of stock.
var OUT_OF_STOCK_TEXT = 'Нет в наличии';
 
function main() {
  var alreadyCheckedUrls = {};
  var iter = buildSelector().get();
  while(iter.hasNext()) {
    var entity = iter.next();
    var url = cleanUrl(entity.getDestinationUrl());
    if(alreadyCheckedUrls[url]) {
      if(alreadyCheckedUrls[url] === 'Нет в наличии') {
        entity.pause();
      } else {
        entity.enable();
      }
    } else {
      var htmlCode;
      try {
        htmlCode = UrlFetchApp.fetch(url).getContentText();
      } catch(e) {
        Logger.log('There was an issue checking:'+url+', Skipping.');
        continue;
      }
      if(htmlCode.indexOf(OUT_OF_STOCK_TEXT) >= 0) {
        alreadyCheckedUrls[url] = 'Нет в наличии';
        entity.pause();
      } else {
        alreadyCheckedUrls[url] = 'Есть в наличии';
        entity.enable();
      }
    }
    Logger.log('Url: '+url+' is '+alreadyCheckedUrls[url]);
  }
}
 
function cleanUrl(url) {
  if(WRAPPED_URLS) {
    url = url.substr(url.lastIndexOf('http'));
    if(decodeURIComponent(url) !== url) {
      url = decodeURIComponent(url);
    }
  }
  if(STRIP_QUERY_STRING) {
    if(url.indexOf('?')>=0) {
      url = url.split('?')[0];
    }
  }
  if(url.indexOf('{') >= 0) {
    //Let's remove the value track parameters
    url = url.replace(/\{[0-9a-zA-Z]+\}/g,'');
  }
  return url;
}
 
function buildSelector() {
  var selector = (URL_LEVEL === 'Ad') ? AdWordsApp.ads() : AdWordsApp.keywords();
  selector = selector.withCondition('CampaignStatus != DELETED').withCondition('AdGroupStatus != DELETED');
  if(ONLY_ACTIVE) {
    selector = selector.withCondition('CampaignStatus = ENABLED').withCondition('Status = ENABLED');
    if(URL_LEVEL !== 'Ad') {
      selector = selector.withCondition('AdGroupStatus = ENABLED');
    }
  }
  if(CAMPAIGN_LABEL) {
    var label = AdWordsApp.labels().withCondition("Name = '"+CAMPAIGN_LABEL+"'").get().next();
    var campIter = label.campaigns().get();
    var campaignNames = [];
    while(campIter.hasNext()) {
      campaignNames.push(campIter.next().getName());
    }
    selector = selector.withCondition("CampaignName IN ['"+campaignNames.join("','")+"']");
  }
  return selector;
}
C уважением,
Павел

Re: Скрипт для остановки товаров не в наличии

Бакалавр ✭ ✭ ✭
Спасибо за потраченное время Веселый
Не совсем понял из ответа у вас скрипт по триггеру "нет в наличии" останавливал объявления? У меня по русскому тексту не хотел работать.

В var OUT_OF_STOCK_TEXT можно прописывать код html, которые искать нужно.
И автор на сайте пример приводил, когда мониторил наличие "in_stock":false на целевом сайте, и у меня подобным образом получилось заставить его работать.

Re: Скрипт для остановки товаров не в наличии

Ведущий участник
Да это Вам спасибо. Попробуйте не html писать. А так как отображается на сайте состояние. Обратите внимание - если у Вас состояний больше чем два (например: снят с производства, ожидаем поступление и т.п)- нужно подпиливать под себя. Я вообще изменил логику в скрипте. Выключает все, кроме того что есть в наличии
C уважением,
Павел

Re: Скрипт для остановки товаров не в наличии

Бакалавр ✭ ✭ ✭
Павел, а модифицированным кодом, который оставляет только то что в наличии, могли бы поделиться? Веселый

Re: Скрипт для остановки товаров не в наличии

Ведущий участник

Chameleon-od написано:
Павел, а модифицированным кодом, который оставляет только то что в наличии, могли бы поделиться? Веселый


конечно! в спешке не сделал этого сразу, извините , вот он

/************************************
* Item Out Of Stock Checker
* Version 1.1
* ChangeLog v1.1 - Filtered out deleted Campaigns and AdGroups
* Created By: Russ Savage
* FreeAdWordsScripts.com
***********************************/
var URL_LEVEL = 'Ad'; // or Keyword
var ONLY_ACTIVE = false; // set to false for all ads or keywords
var CAMPAIGN_LABEL = 'prod'; // set this if you want to only check campaigns with this label
var STRIP_QUERY_STRING = true; // set this to false if the stuff that comes after the question mark is important
var WRAPPED_URLS = true; // set this to true if you use a 3rd party like Marin or Kenshoo for managing you account
// This is the specific text to search for 
// on the page that indicates the item 
// is out of stock.
var OUT_OF_STOCK_TEXT = 'Есть в наличии';
 
function main() {
  var alreadyCheckedUrls = {};
  var iter = buildSelector().get();
  while(iter.hasNext()) {
    var entity = iter.next();
    var url = cleanUrl(entity.getDestinationUrl());
    if(alreadyCheckedUrls[url]) {
      if(alreadyCheckedUrls[url] === 'Есть в наличии')  {
        entity.enable();
      } else {
        entity.pause();
      }
    } else {
      var htmlCode;
      try {
        htmlCode = UrlFetchApp.fetch(url).getContentText();
      } catch(e) {
        Logger.log('There was an issue checking:'+url+', Skipping.');
        continue;
      }
      if(htmlCode.indexOf(OUT_OF_STOCK_TEXT) >= 0) {
        alreadyCheckedUrls[url] = 'Есть в наличии';
        entity.enable();    
          
      } else {
          alreadyCheckedUrls[url] = 'Нет в наличии';
        entity.pause();
      }
    }
    Logger.log('Url: '+url+' is '+alreadyCheckedUrls[url]);
  }
}
 
function cleanUrl(url) {
  if(WRAPPED_URLS) {
    url = url.substr(url.lastIndexOf('http'));
    if(decodeURIComponent(url) !== url) {
      url = decodeURIComponent(url);
    }
  }
  if(STRIP_QUERY_STRING) {
    if(url.indexOf('?')>=0) {
      url = url.split('?')[0];
    }
  }
  if(url.indexOf('{') >= 0) {
    //Let's remove the value track parameters
    url = url.replace(/\{[0-9a-zA-Z]+\}/g,'');
  }
  return url;
}
 
function buildSelector() {
  var selector = (URL_LEVEL === 'Ad') ? AdWordsApp.ads() : AdWordsApp.keywords();
  selector = selector.withCondition('CampaignStatus != DELETED').withCondition('AdGroupStatus != DELETED');
  if(ONLY_ACTIVE) {
    selector = selector.withCondition('CampaignStatus = ENABLED').withCondition('Status = ENABLED');
    if(URL_LEVEL !== 'Ad') {
      selector = selector.withCondition('AdGroupStatus = ENABLED');
    }
  }
  if(CAMPAIGN_LABEL) {
    var label = AdWordsApp.labels().withCondition("Name = '"+CAMPAIGN_LABEL+"'").get().next();
    var campIter = label.campaigns().get();
    var campaignNames = [];
    while(campIter.hasNext()) {
      campaignNames.push(campIter.next().getName());
    }
    selector = selector.withCondition("CampaignName IN ['"+campaignNames.join("','")+"']");
  }
  return selector;
}

Я тестировал, вроде все корректно. Для включения отключения вводил так как пишется на сайте, а не в html.
Может еще будет Вам полезно, примерно около 2х тысяч товаров из трех кампаний, время работы скрипта 21 минута. 
Лимит -30 минут. Так что учитывайте этот факт.

C уважением,
Павел

Re: Скрипт для остановки товаров не в наличии

Студент ✭ ✭ ✭
а можно использовать для mcc?

Re: Скрипт для остановки товаров не в наличии

Ведущий участник

Я думаю сложность тут только одна, скрипты не работают в МСС. Надеюсь только пока

C уважением,
Павел