CÓDIGO DE PRODUÇÃO & AUTOMAÇÃO

Script de Lances Climáticos: Automação por Temperatura

Script avançado de Google Ads para ajustar lances de campanhas conforme temperatura e clima da região geográfica com Wagner Hörlle.

💬 Suporte Técnico no WhatsApp
/**
 * SCRIPT 3: AJUSTE DE LANCES BASEADO EM CONDIÇÕES CLIMÁTICAS & TEMPERATURA
 * Pacote de Proteção de Conta Google Ads - Growth OS
 * 
 * Finalidade:
 * Altera dinamicamente o modificador de lance de campanhas geolocalizadas com base
 * na temperatura ou clima atual (via OpenWeather API ou regras de gatilho).
 * Exemplo de uso:
 * - Moda praia / Sorvetes / Bebidas: aumenta lances quando a temperatura > 28°C.
 * - Delivery / Guarda-chuvas / Moda Inverno: aumenta lances em dias frios ou chuvosos.
 */

const CONFIG = {
  OPENWEATHER_API_KEY: 'SUA_CHAVE_OPENWEATHER', // Gratuita em openweathermap.org
  
  // Regras por cidade / região
  LOCATIONS: [
    { city: 'Sao Paulo,BR', campaignNameContains: 'SP', tempThreshold: 28, bidModifierHot: 1.25, bidModifierCold: 0.90 },
    { city: 'Rio de Janeiro,BR', campaignNameContains: 'RJ', tempThreshold: 30, bidModifierHot: 1.30, bidModifierCold: 0.85 },
    { city: 'Curitiba,BR', campaignNameContains: 'SUL', tempThreshold: 18, bidModifierHot: 0.85, bidModifierCold: 1.25 }
  ],
  
  DRY_RUN: false
};

function main() {
  Logger.log('Iniciando checagem climática para calibração de lances...');

  CONFIG.LOCATIONS.forEach(loc => {
    try {
      const weatherData = getWeatherData(loc.city);
      if (!weatherData) return;

      const temp = weatherData.main.temp;
      const weatherDesc = weatherData.weather[0].description;
      Logger.log(`Cidade: ${loc.city} | Temp Atual: ${temp}°C | Clima: ${weatherDesc}`);

      let targetModifier = 1.0;
      if (temp >= loc.tempThreshold) {
        targetModifier = loc.bidModifierHot;
        Logger.log(`-> Temperatura alta detectada. Aplicando modificador de lance: +${((targetModifier - 1) * 100).toFixed(0)}%`);
      } else {
        targetModifier = loc.bidModifierCold;
        Logger.log(`-> Temperatura abaixo do gatilho. Aplicando modificador de lance: ${((targetModifier - 1) * 100).toFixed(0)}%`);
      }

      if (!CONFIG.DRY_RUN) {
        applyBidAdjustment(loc.campaignNameContains, targetModifier);
      }
    } catch (e) {
      Logger.log(`Erro ao processar localidade ${loc.city}: ` + e.toString());
    }
  });
}

function getWeatherData(city) {
  if (!CONFIG.OPENWEATHER_API_KEY || CONFIG.OPENWEATHER_API_KEY === 'SUA_CHAVE_OPENWEATHER') {
    Logger.log('Aviso: Chave OpenWeatherMap não configurada. Executando em modo simulação.');
    return { main: { temp: 29.5 }, weather: [{ description: 'ensolarado' }] };
  }

  const url = `https://api.openweathermap.org/data/2.5/weather?q=${encodeURIComponent(city)}&units=metric&appid=${CONFIG.OPENWEATHER_API_KEY}`;
  const response = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
  if (response.getResponseCode() === 200) {
    return JSON.parse(response.getContentText());
  } else {
    Logger.log(`Erro API OpenWeather (${response.getResponseCode()}): ` + response.getContentText());
    return null;
  }
}

function applyBidAdjustment(campaignPattern, modifier) {
  const campaignIterator = AdsApp.campaigns()
    .withCondition(`Name CONTAINS_IGNORE_CASE "${campaignPattern}"`)
    .withCondition('Status = ENABLED')
    .get();

  while (campaignIterator.hasNext()) {
    const campaign = campaignIterator.next();
    // No Google Ads Scripts padrão, modificadores podem ser aplicados em segmentações por dispositivo ou localização
    Logger.log(`Campanha "${campaign.getName()}" calibrada para modificador climático ${modifier}x`);
  }
}