googleads / google-ads-python

Google Ads API Client Library for Python
Apache License 2.0
526 stars 480 forks source link

Add keywords_historical_metrics python example in the repo #799

Closed urwa closed 1 year ago

urwa commented 1 year ago

Describe the problem you are trying to solve: Trying to add example for keywords_historical_metrics.

Describe the solution you'd like:

#!/usr/bin/env python
# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This example generates historical metrics for keyword planning.
# Guide: https://developers.google.com/google-ads/api/docs/keyword-planning/generate-historical-metrics

import argparse
import sys

from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException

def main(
    client,
    customer_id,
    keywords,
    location_ids,
    keyword_plan_network,
    language_id,
):
    ga_service = client.get_service("KeywordPlanIdeaService")

    location_rns = map_locations_ids_to_resource_names(client, location_ids)
    language_rn = client.get_service("GoogleAdsService").language_constant_path(
        language_id
    )
    request = {
        "customer_id": customer_id,
        "keywords": keywords,
        "geo_target_constants": location_rns,
        "keyword_plan_network": keyword_plan_network,
        "language": language_rn,
    }
    keywords_historical_metrics = ga_service.generate_keyword_historical_metrics(
        request=request
    )
    print(keywords_historical_metrics)

def map_locations_ids_to_resource_names(client, location_ids):
    """Converts a list of location IDs to resource names.

    Args:
        client: an initialized GoogleAdsClient instance.
        location_ids: a list of location ID strings.

    Returns:
        a list of resource name strings using the given location IDs.
    """
    build_resource_name = client.get_service(
        "GeoTargetConstantService"
    ).geo_target_constant_path
    return [build_resource_name(location_id) for location_id in location_ids]

if __name__ == "__main__":
    # GoogleAdsClient will read the google-ads.yaml configuration file in the
    # home directory if none is specified.
    googleads_client = GoogleAdsClient.load_from_storage(version="v14")

    parser = argparse.ArgumentParser(
        description=(
            "Displays basic information about the specified "
            "customer's advertising account."
        )
    )
    # The following argument(s) should be provided to run the example.
    parser.add_argument(
        "-c",
        "--customer_id",
        type=str,
        required=True,
        help="The Google Ads customer ID.",
    )

    args = parser.parse_args()

    keywords = ["mars cruise", "cheap cruise", "jupiter cruise"]
    # Location IDs are listed here:
    # https://developers.google.com/google-ads/api/reference/data/geotargets
    # and they can also be retrieved using the GeoTargetConstantService as shown
    # here: https://developers.google.com/google-ads/api/docs/targeting/location-targeting
    # Geo target constant 2840 is for USA.
    location_ids = ["2840"]
    keyword_plan_network = (
        googleads_client.enums.KeywordPlanNetworkEnum.GOOGLE_SEARCH_AND_PARTNERS
    )
    # Language criteria 1000 is for English. See
    # https://developers.google.com/google-ads/api/reference/data/codes-formats#languages
    # for the list of language criteria IDs.
    language_id = "1000"

    try:
        main(
            googleads_client,
            args.customer_id,
            keywords,
            location_ids,
            keyword_plan_network,
            language_id,
        )
    except GoogleAdsException as ex:
        print(
            f'Request with ID "{ex.request_id}" failed with status '
            f'"{ex.error.code().name}" and includes the following errors:'
        )
        for error in ex.failure.errors:
            print(f'\tError with message "{error.message}".')
            if error.location:
                for field_path_element in error.location.field_path_elements:
                    print(f"\t\tOn field: {field_path_element.field_name}")
        sys.exit(1)

Describe alternatives you've considered:

Additional context: I checked the contributing readme file which says to open a PR which I am unable to do. What is the best way to contribute this in the repo.

I tried following the example in Perl https://developers.google.com/google-ads/api/samples/generate-historical-metrics#perl

Thanks.

BenRKarl commented 1 year ago

@urwa - we just added the example, the previous one was removed because it was out of date.

https://github.com/googleads/google-ads-python/blob/main/examples/planning/generate_historical_metrics.py