Integrando Dados de Geolocalização e Clima

Aprenda como Integrar Dados de Geolocalização e Clima com Python e Enviar para CRM e BigQuery


Autor: Réulison Silva Publicado em: Agosto 14, 2025

Empresas de delivery, farmácias, moda e turismo podem obter insights valiosos unindo informações de localização e clima para prever picos de demanda e personalizar ofertas. Neste artigo, você vai aprender como:

  1. Capturar o IP do visitante.
  2. Descobrir sua localização com a API ip-api.com.
  3. Obter dados meteorológicos com a API OpenWeatherMap.
  4. Enviar essas informações para o ActiveCampaign (CRM).
  5. Salvar no Google BigQuery para criar dashboards no Looker Studio.

1️⃣ Capturando o IP do visitante

No backend Python (Flask ou Django, por exemplo), o IP pode ser obtido diretamente do request:

from flask import Flask, request

app = Flask(__name__)

@app.route("/")
def get_ip():
    ip = request.headers.get('X-Forwarded-For', request.remote_addr)
    return {"ip": ip}

if __name__ == "__main__":
    app.run(debug=True)

💡 Dica: Se seu app estiver atrás de um proxy ou CDN (Cloudflare, Nginx), verifique se X-Forwarded-For está habilitado.

2️⃣ Descobrindo a localização com ip-api.com

A API ip-api não requer autenticação e retorna dados como cidade, estado, país, latitude e longitude.

import requests

def get_location(ip):
    url = f"http://ip-api.com/json/{ip}"
    response = requests.get(url)
    return response.json()

# Exemplo:
ip = "177.192.19.203"
location_data = get_location(ip)
print(location_data)

Resposta:

{
  "city": "Rio de Janeiro",
  "regionName": "Rio de Janeiro",
  "lat": -22.9072,
  "lon": -43.1883,
  "country": "Brazil"
}

3️⃣ Obtendo dados climáticos com OpenWeatherMap

Crie uma conta gratuita em openweathermap.org e obtenha sua API Key. Usaremos latitude e longitude obtidas no passo anterior.

def get_weather(lat, lon, api_key):
    url = f"https://api.openweathermap.org/data/2.5/weather"
    params = {
        "lat": lat,
        "lon": lon,
        "appid": api_key,
        "lang": "pt_br",
        "units": "metric"  # Celsius
    }
    response = requests.get(url, params=params)
    return response.json()

weather_data = get_weather(location_data["lat"], location_data["lon"], "SUA_API_KEY")
print(weather_data)

Exemplo de retorno simplificado:

{
  "weather": [{"description": "nuvens dispersas"}],
  "main": {"temp": 20.5, "humidity": 83},
  "wind": {"speed": 4.6}
}

4️⃣ Enviando dados para o ActiveCampaign

Você pode querer ter esses dados em seu CRM a fim de criar mensagens personalizadas ou integrar com a Meta e criar públicos customizados. Isso pode ser relevante para usar como testes, por exemplo, criar um público baseado em clientes que costuman comprar em dias ensolarados.

Documentação: Sync Contact Data

def send_to_activecampaign(api_url, api_token, email, custom_fields):
    headers = {
        "Api-Token": api_token,
        "Content-Type": "application/json"
    }
    payload = {
        "contact": {
            "email": email,
            "fieldValues": [
                {"field": "1", "value": custom_fields.get("cidade")},
                {"field": "2", "value": custom_fields.get("temperatura")}
            ]
        }
    }
    response = requests.post(f"{api_url}/api/3/contact/sync", headers=headers, json=payload)
    return response.json()

custom_fields = {
    "cidade": location_data["city"],
    "temperatura": weather_data["main"]["temp"]
}

send_to_activecampaign("https://SEUDOMINIO.api-us1.com", "SUA_API_TOKEN", "cliente@email.com", custom_fields)

🔹 Antes, crie os campos personalizados no ActiveCampaign e anote seus IDs.

5️⃣ Salvando no Google BigQuery

Com o BigQuery, você pode criar dashboards no Looker Studio para análise histórica.

from google.cloud import bigquery

def save_to_bigquery(project_id, dataset_id, table_id, row_data):
    client = bigquery.Client(project=project_id)
    table_ref = client.dataset(dataset_id).table(table_id)
    table = client.get_table(table_ref)
    errors = client.insert_rows(table, [row_data])
    if errors:
        print(f"Erro: {errors}")
    else:
        print("Dados inseridos com sucesso!")

row = (
    location_data["query"],            # IP
    location_data["city"],
    location_data["regionName"],
    location_data["country"],
    location_data["lat"],
    location_data["lon"],
    weather_data["main"]["temp"],
    weather_data["main"]["humidity"],
    weather_data["weather"][0]["description"]
)

save_to_bigquery("seu-projeto", "seu_dataset", "sua_tabela", row)

💡 Certifique-se de ter configurado o Service Account JSON e exportado a variável:

export GOOGLE_APPLICATION_CREDENTIALS="chave.json"

6️⃣ Possíveis Aplicações

  • Delivery de comida: prever aumento de pedidos de sopas em dias frios ou açaí em dias quentes.
  • Farmácias: campanhas para produtos sazonais (antigripais, protetor solar).
  • Moda: recomendações de roupas baseadas na previsão local.
  • Turismo: ofertas de passeios de acordo com clima favorável.

Estrutura dos dados no BigQuery

Vamos criar um exemplo hipotético de uma empresa de delivery e um dataset contendo informações de pedidos e clima. Sua tabela no BigQuery precisa ter pelo menos estas colunas

categoria clima qtd_pedidos
Sorvete Ensolarado 154
Sorvete Chuvoso 177
Sorvete Frio 163
Sorvete Nublado 96
Sorvete Quente 36
Sopa Ensolarado 164
Sopa Chuvoso 167
Sopa Frio 148
Sopa Nublado 106
Sopa Quente 125
Pizza Ensolarado 32
Pizza Chuvoso 31
Pizza Frio 31
Pizza Nublado 112
Pizza Quente 151
Hambúrguer Ensolarado 129
Hambúrguer Chuvoso 130
Hambúrguer Frio 31
Hambúrguer Nublado 21
Hambúrguer Quente 70
Salada Ensolarado 139
Salada Chuvoso 64
Salada Frio 89
Salada Nublado 181
Salada Quente 86

💡 Observações:

  • categoria → vem do seu sistema de pedidos.
  • clima → vem da API OpenWeather.
  • qtd_pedidos → geralmente 1 por linha, mas pode ser agregado.

Conectar BigQuery ao Looker Studio

  1. No Looker Studio, clique em CriarFonte de dados.
  2. Escolha BigQuery.
  3. Selecione o projeto, dataset e a tabela que contém os pedidos.
  4. Clique em Conectar e depois em Adicionar ao relatório.

Criar o gráfico

  1. No relatório, clique em Adicionar um gráfico.

  2. Escolha **Gráfico de barras empilhadas **(Stacked Bar Chart) — assim, cada barra é uma categoria de comida e cada cor representa um tipo de clima.

  3. Configure:

    • Dimensão: categoria
    • Dimensão de cor: clima
    • Métrica: SUM(qtd_pedidos)
  4. Em Estilo, habilite Empilhado 100% se quiser comparar proporções.

Você verá algo assim:

Gráfico de barras comparando o número de pedidos por categoria de comida em diferentes tipos de clima, com destaque para variações na demanda.

Confira o report no Looker Studio.

Você também pode usar o Python para gerar o gráfico diretamente usando a biblioteca matplotlib. Por exemplo:

import pandas as pd
import matplotlib.pyplot as plt

# Categorias de comida e tipos de clima
categorias = ["Sorvete", "Sopa", "Pizza", "Hambúrguer", "Salada"]
climas = ["Ensolarado", "Chuvoso", "Frio", "Nublado", "Quente"]

# Definir lógica de pedidos por categoria e clima
# Valores simulados com base em tendências reais
tabela_pedidos = {
    "Sorvete":    {"Ensolarado": 180, "Chuvoso": 40,  "Frio": 20,  "Nublado": 60,  "Quente": 160},
    "Sopa":       {"Ensolarado": 30,  "Chuvoso": 150, "Frio": 180, "Nublado": 100, "Quente": 20},
    "Pizza":      {"Ensolarado": 120, "Chuvoso": 140, "Frio": 160, "Nublado": 130, "Quente": 90},
    "Hambúrguer": {"Ensolarado": 140, "Chuvoso": 120, "Frio": 100, "Nublado": 110, "Quente": 150},
    "Salada":     {"Ensolarado": 150, "Chuvoso": 60,  "Frio": 40,  "Nublado": 80,  "Quente": 170}
}

# Gerar DataFrame
dados = []
for categoria in categorias:
    for clima in climas:
        pedidos = tabela_pedidos[categoria][clima]
        dados.append({"Categoria": categoria, "Clima": clima, "Pedidos": pedidos})

df = pd.DataFrame(dados)

# Criar gráfico
plt.figure(figsize=(10, 6))
for categoria in categorias:
    subset = df[df["Categoria"] == categoria]
    plt.plot(subset["Clima"], subset["Pedidos"], marker='o', label=categoria)

plt.title("Número de pedidos por Categoria de Comida x Tipo de Clima")
plt.xlabel("Tipo de Clima")
plt.ylabel("Número de Pedidos")
plt.legend(title="Categoria de Comida")
plt.grid(True, linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show()

# Salvar CSV para Looker Studio
csv_path = "pedidos_categoria_clima_realistas.csv"
df.to_csv(csv_path, index=False)
csv_path

Também é gerado o arquivo pedidos_categoria_clima_realistas.csv para você usar no Looker Studio, caso quiser testar.

Segue exemplo de resultado:

Gráfico mostrando a relação entre o número de pedidos por categoria de comida (Sorvete, Sopa, Pizza, Hambúrguer, Salada) e o tipo de clima (Ensolarado, Chuvoso, Frio, Nublado, Quente).

🎯 Conclusão

Com poucas linhas de código em Python, você conecta dados de IP, localização e clima para enriquecer seu CRM e gerar dashboards no Looker. Isso não apenas fornece insights para o marketing, mas também abre portas para estratégias de personalização em tempo real.


📌 FAQ: Integrando Dados de Geolocalização e Clima

🔹 1. Por que integrar dados de geolocalização e clima?

Resposta: Essa integração permite prever demandas sazonais (ex.: mais sopas em dias frios) e personalizar campanhas de marketing. Empresas de delivery, turismo e varejo usam esses dados para:

  • ✅ Otimizar estoques (antecipar picos de vendas).
  • ✅ Criar ofertas personalizadas (ex.: promoção de sorvetes em dias quentes).
  • ✅ Melhorar a experiência do cliente (recomendações baseadas no clima local).

🔹 2. Como obter a localização do usuário de forma precisa?

Resposta: Você pode usar a API gratuita ip-api.com:

import requests
def get_location(ip):
    response = requests.get(f"http://ip-api.com/json/{ip}")
    return response.json()  # Retorna cidade, país, lat/long

Dica: Se seu app estiver atrás de um proxy (ex.: Cloudflare), use request.headers.get('X-Forwarded-For') para capturar o IP real.

🔹 3. Qual API de clima usar e como acessá-la?

Resposta: A OpenWeatherMap oferece dados meteorológicos em tempo real. Exemplo em Python:

def get_weather(lat, lon, api_key):
    params = {"lat": lat, "lon": lon, "units": "metric", "lang": "pt_br"}
    response = requests.get("https://api.openweathermap.org/data/2.5/weather", params=params)
    return response.json()  # Retorna temperatura, umidade, descrição do clima

Observação: Crie uma conta gratuita no site para obter sua chave de API.

🔹 4. Como enviar esses dados para um CRM como o ActiveCampaign?

Resposta: Use a API do ActiveCampaign para atualizar campos personalizados:

payload = {
    "contact": {
        "email": "cliente@email.com",
        "fieldValues": [
            {"field": "1", "value": "Rio de Janeiro"},  # Cidade
            {"field": "2", "value": "25°C"}             # Temperatura
        ]
    }
}

Pré-requisito: Crie os campos personalizados no CRM antes de enviar os dados.

🔹 5. Por que salvar esses dados no BigQuery?

Resposta: O Google BigQuery permite:

  • Armazenar dados históricos para análise de tendências.
  • Criar dashboards no Looker Studio (ex.: gráficos de pedidos por clima).
  • Integrar com outras ferramentas (ex.: Google Analytics, Meta Ads).

Exemplo de código para inserção:

from google.cloud import bigquery
row = ("177.192.19.203", "Rio de Janeiro", -22.9072, -43.1883, 25.5, "nublado")
client.insert_rows(table, [row])  # Insere na tabela do BigQuery

🔹 6. Quais são as aplicações práticas para negócios?

Resposta:

  • Delivery: Aumentar promoções de sopas em dias frios.
  • Farmácias: Alertar sobre protetor solar em dias ensolarados.
  • Moda: Sugerir roupas adequadas ao clima local.
  • Turismo: Oferecer passeios em dias com previsão favorável.

🔹 7. Como visualizar os dados no Looker Studio?

Passo a passo:

  1. Conecte o BigQuery como fonte de dados.
  2. Crie um gráfico de barras empilhadas com:
    • Dimensão: Categoria de comida
    • Cor: Tipo de clima
    • Métrica: SOMA(Pedidos)
  3. Habilite “Empilhado 100%” para comparar proporções.

Exemplo de resultado:

Gráfico de barras comparando o número de pedidos por categoria de comida em diferentes tipos de clima, com destaque para variações na demanda.

🔹 8. Quais são os erros comuns e como evitá-los?

Problemas frequentes:

  • IP incorreto: Verifique headers como X-Forwarded-For em apps com proxy.
  • Limite de APIs gratuitas: APIs como ip-api.com têm limite de requisições/dia.
  • Dados incompletos no CRM: Certifique-se de mapear os campos personalizados corretamente.

Solução: Sempre inclua tratamentos de erro no código:

try:
    location = get_location(ip)
except requests.exceptions.RequestException as e:
    print(f"Erro ao obter localização: {e}")

🔹 9. Posso usar outras linguagens além de Python?

Resposta: Sim! As APIs mencionadas (ip-api.com, OpenWeatherMap, ActiveCampaign) são compatíveis com qualquer linguagem que suporte requisições HTTP (ex.: JavaScript, PHP, Ruby). Exemplo em Node.js:

const response = await fetch(`http://ip-api.com/json/${ip}`);
const data = await response.json();

🔹 10. Como garantir a privacidade dos dados?

Recomendações:

  • Anonimização: Armazene apenas a cidade/região, não o endereço exato.
  • LGPD: Adicione um termo de consentimento para coletar dados de localização.
  • Criptografia: Use conexões HTTPS e encrypte dados sensíveis no banco de dados.