google-ads-python icon indicating copy to clipboard operation
google-ads-python copied to clipboard

bad argument type for built-in operation with KeywordPlanIdeaService.generate_keyword_ideas in Google Colab (Python Client Library)

Open JCZOPOLATO opened this issue 6 months ago • 1 comments

Hello Google Ads Python Client Library team,

I am encountering a persistent bad argument type for built-in operation error when trying to use the KeywordPlanIdeaService.generate_keyword_ideas method. I am running the code in a Google Colab environment.

Despite multiple attempts to adjust the syntax and ensure correct protobuf object assignment, the error persists.

Environment:

  • Google Colab (fresh runtime)
  • Python version (Colab default, usually 3.10 or newer)
  • google-ads library installed via pip install google-ads (latest version at time of execution)

Error Details: The specific error message is: ERRO: Não foi possível gerar ideias de palavras-chave. Verifique os termos, idioma ou IDs de localização. Erro: bad argument type for built-in operation

Code to Reproduce:

# Célula 5: Módulo de Planejamento de Palavras-Chave para Novas Campanhas (VERSÃO FINAL - V11)

import pandas as pd
import os

print("--- Iniciando Módulo de Planejamento de Palavras-Chave para Novas Campanhas ---")

def get_keyword_ideas(client, customer_id, keywords, language_id=1000, location_ids=None):
    """
    Obtém ideias de palavras-chave e suas métricas de planejamento da Google Ads API.

    Args:
        client: Uma instância do GoogleAdsClient.
        customer_id: O ID da conta do cliente.
        keywords: Uma lista de palavras-chave sementes para gerar ideias.
        language_id: O ID numérico do idioma (ex: 1000 para Inglês, 1014 para Português).
                     Você pode encontrar os IDs de idioma na documentação do Google Ads API.
        location_ids: Uma lista de IDs numéricos de localização para segmentação (ex: [2076] para Brasil, [2840] para EUA).
                      Se None, a segmentação é global.

    Returns:
        Um pandas DataFrame com as ideias de palavras-chave e suas métricas.
    """
    keyword_plan_idea_service = client.get_service("KeywordPlanIdeaService")

    # Cria a requisição principal
    request = client.get_type("GenerateKeywordIdeasRequest")
    request.customer_id = customer_id

    # --- Configurando as Palavras-Chave Sementes de forma EXPLICITA ---
    if not keywords:
        raise ValueError("A lista de palavras-chave sementes não pode estar vazia.")

    # Cria uma lista de objetos KeywordInfo
    keyword_protos = []
    for kw_text in keywords:
        keyword_info_proto = client.get_type("KeywordInfo")
        keyword_info_proto.text = kw_text
        keyword_protos.append(keyword_info_proto)

    # Atribui a lista de KeywordInfo ao campo keywords do KeywordSeed
    # Cria o KeywordSeed primeiro
    keyword_seed_proto = client.get_type("KeywordSeed")
    keyword_seed_proto.keywords.extend(keyword_protos) # Usa extend para adicionar a lista de protos

    # Atribui o KeywordSeed à requisição
    request.keyword_seed.CopyFrom(keyword_seed_proto) # Usa CopyFrom para garantir atribuição correta de Protobuf
    # -----------------------------------------------------------------

    # Configurando o Idioma usando o resource name formatado
    request.language = f"languageConstants/{language_id}"

    # Configurando as Localizações (Geotargeting) usando o resource name formatado
    if location_ids:
        for loc_id in location_ids:
            request.geo_target_constants.append(f"geoTargetConstants/{loc_id}")

    # Definindo o Tipo de Ideia
    request.idea_type = client.enums.KeywordIdeaTypeEnum.KEYWORD_MATCH_TYPE

    print(f"Buscando ideias de palavras-chave para: {keywords} (Idioma ID: {language_id}, Localizações: {location_ids if location_ids else 'Todas'})")

    response = keyword_plan_idea_service.generate_keyword_ideas(request=request)

    ideas_data = []
    for idea in response.results:
        keyword_text = idea.text
        metrics = idea.keyword_idea_metrics

        ideas_data.append({
            'palavra_chave_sugerida': keyword_text,
            'volume_mensal_medio': metrics.avg_monthly_searches,
            'competicao': metrics.competition.name, # COMPETITION_UNKNOWN, LOW, MEDIUM, HIGH
            'cpc_min_micros': metrics.low_top_of_page_bid_micros,
            'cpc_max_micros': metrics.high_top_of_page_bid_micros,
            'cpc_min_moeda': metrics.low_top_of_page_bid_micros / 1_000_000 if metrics.low_top_of_page_bid_micros else 0.0,
            'cpc_max_moeda': metrics.high_top_of_page_bid_micros / 1_000_000 if metrics.high_top_of_page_bid_micros else 0.0,
        })

    df_keyword_ideas = pd.DataFrame(ideas_data)
    return df_keyword_ideas

# --- Exemplo de Uso do Módulo de Planejamento (AQUI ESTÃO SUAS INFORMAÇÕES!) ---

seed_keywords = ["prodentim"] # Produto: Prodentim
# IMPORTANTE: Use o ID numérico do idioma
target_language_id = 1000 # Inglês (ID 1000)
target_location_ids = [2840] # Localização: EUA (ID 2840)

try:
    df_ideas = get_keyword_ideas(
        client=google_ads_client, # Usa o cliente definido na Célula 3
        customer_id=customer_id,   # Usa o customer_id definido na Célula 3
        keywords=seed_keywords,
        language_id=target_language_id, # Passando o ID numérico do idioma
        location_ids=target_location_ids
    )

    if not df_ideas.empty:
        print("\n--- Ideias de Palavras-Chave Geradas com Sucesso! ---")
        print(f"Total de ideias geradas: {len(df_ideas)}")
        print("\nPrimeiras 10 ideias de palavras-chave:")
        print(df_ideas.head(10).to_markdown(index=False, numalign="left", stralign="left"))

        output_ideas_path = os.path.join('/content/drive/MyDrive/projeto_google_ads_api/output/', 'df_keyword_ideas_prodentim_en_us.csv')
        os.makedirs(os.path.dirname(output_ideas_path), exist_ok=True)
        print(f"\nDataFrame 'df_keyword_ideas' exportado para: {output_ideas_path}")
    else:
        print("Nenhuma ideia de palavra-chave encontrada para os termos fornecidos.")

except Exception as e:
    print(f"ERRO: Não foi possível gerar ideias de palavras-chave. Verifique os termos, idioma ou IDs de localização. Erro: {e}")

print("\n--- Processamento da Célula 5 Concluído ---")
What I've Tried:
I have extensively tried to adjust the way KeywordInfo, KeywordSeed, language, and geo_target_constants are constructed and assigned to the GenerateKeywordIdeasRequest object. This includes using CopyFrom, extend, and various forms of resource names for language and geo targets. The provided code is the result of these attempts.

Question:
Could you please provide guidance on what specific argument type or format is expected by the generate_keyword_ideas method for these fields that might be causing the bad argument type error? Is there a known compatibility issue with specific versions of the library, or a common pitfall when integrating with Colab or certain account configurations?

Thank you for your help.

JCZOPOLATO avatar Jun 19 '25 15:06 JCZOPOLATO

@JCZOPOLATO could you share the full error logs, or tell me which line of your script the error is coming from?

BenRKarl avatar Jun 24 '25 17:06 BenRKarl

Closing this for now, @JCZOPOLATO please add more details if this is still an issue for you.

BenRKarl avatar Jul 10 '25 13:07 BenRKarl