codeorelse
12/2/2016 - 7:42 AM

adwords_uptime_robot.js

/**
 * Adwords Uptime Robot Monitoring script
 *
 * Script that checks whether the websites that the Adword campaigns rely on are still live
 * and respond fast enough, or if not, pause the related campaigns.
 *
 * Services used to determine uptime:
 * - Uptime Robot
 *
 * @version 0.1.0
 * @date 16/11/2016
 * @author codeorelse
 *
 */
var domains = ['http://www.yoursite.com'];
var businessHours = [8, 17];
var uptimeRobotKey = 'xxxxxxxxxxxxx';

function isDuringBusinessHours() {
  var today = new Date();
  var day = today.getDay();
  var hour = today.getUTCHours() + 1; // UTC
  if ([0, 6].indexOf(day) > -1) return false; // weekend
  return hour >= businessHours[0] && hour < businessHours[1];
}

function pauseCampaign() {
  var campaignIterator = AdWordsApp.campaigns().get();
  while (campaignIterator.hasNext()) { // Go over all campaings with company id in the name
    var campaign = campaignIterator.next();

    if (campaignNames.length === 0 || campaignNames.indexOf(campaign.getName()) > -1) {
      if (!campaign.isPaused()) {
        campaign.applyLabel('campaign_paused_by_code');
        campaign.pause();
        Logger.log("campaign " + campaign.getName() + " was paused.");
      }
    }
  }
  if (pausedCampaigns.length > 0) {
    sendMail('Campaigns in account ' + accountName + ' paused', 'Paused: \n' + pausedCampaigns.join('\n'));
  }
}

function enableCampaign() {
  var campaignIterator = AdWordsApp.campaigns().get();  

  while (campaignIterator.hasNext()) { // Go over all campaings with company id in the name
    var campaign = campaignIterator.next();
    var labelIter = campaign.labels().withCondition("Name = 'campaign_paused_by_code'").get();
    if(labelIter.hasNext()) {
      campaign.enable();
      campaign.removeLabel('campaign_paused_by_code');
      Logger.log("campaign " + campaign.getName() + " was enabled.");              
    }
  }  
}

function main() {

  if (isDuringBusinessHours()) {
    // Don't run the script when we're during office hours
    return;
  }

  var response = UrlFetchApp.fetch('https://api.uptimerobot.com/getMonitors?apiKey='+uptimeRobotKey+'&format=xml');
  if (response.getResponseCode() != 200) {
    throw Utilities.formatString(
      'Error returned by API: %s, Location searched: %s.',
      response.getContentText(), location);
  }

  var document = XmlService.parse(response.getContentText());
  var root = document.getRootElement();
  var entries = root.getChildren('monitor');
  var hasDownDomain = false;

  for (var i = 0; i < entries.length; i++) {
    var url = entries[i].getAttribute('url').getValue();
    var status = entries[i].getAttribute('status').getValue();
    var looksDown = status == '9';
    if (looksDown && domains.indexOf(url) > -1) {
      hasDownDomain = true;
      Logger.log(url + ' is down. We\'re going to pause the campaigns');
    }
  }

  if (hasDownDomain) {
    pauseCampaign();
  } else {
    enableCampaign();
  }
}