123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- #!/usr/bin/env python
- # Copyright 2019 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 keyword ideas from a list of seed keywords."""
- import argparse
- import sys
- from google.ads.googleads.client import GoogleAdsClient
- from google.ads.googleads.errors import GoogleAdsException
- # 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
- _DEFAULT_LOCATION_IDS = ["1023191"] # location ID for New York, NY
- # A language criterion ID. For example, specify 1000 for English. For more
- # information on determining this value, see the below link:
- # https://developers.google.com/google-ads/api/reference/data/codes-formats#expandable-7
- _DEFAULT_LANGUAGE_ID = "1000" # language ID for English
- # [START generate_keyword_ideas]
- def main(
- client, customer_id, location_ids, language_id, keyword_texts, page_url
- ):
- keyword_plan_idea_service = client.get_service("KeywordPlanIdeaService")
- keyword_competition_level_enum = client.get_type(
- "KeywordPlanCompetitionLevelEnum"
- ).KeywordPlanCompetitionLevel
- keyword_plan_network = client.get_type(
- "KeywordPlanNetworkEnum"
- ).KeywordPlanNetwork.GOOGLE_SEARCH_AND_PARTNERS
- location_rns = _map_locations_ids_to_resource_names(client, location_ids)
- language_rn = client.get_service(
- "LanguageConstantService"
- ).language_constant_path(language_id)
- # Either keywords or a page_url are required to generate keyword ideas
- # so this raises an error if neither are provided.
- if not (keyword_texts or page_url):
- raise ValueError(
- "At least one of keywords or page URL is required, "
- "but neither was specified."
- )
- # Only one of the fields "url_seed", "keyword_seed", or
- # "keyword_and_url_seed" can be set on the request, depending on whether
- # keywords, a page_url or both were passed to this function.
- request = client.get_type("GenerateKeywordIdeasRequest")
- request.customer_id = customer_id
- request.language = language_rn
- request.geo_target_constants = location_rns
- request.include_adult_keywords = False
- request.keyword_plan_network = keyword_plan_network
- # To generate keyword ideas with only a page_url and no keywords we need
- # to initialize a UrlSeed object with the page_url as the "url" field.
- if not keyword_texts and page_url:
- request.url_seed.url = page_url
- # To generate keyword ideas with only a list of keywords and no page_url
- # we need to initialize a KeywordSeed object and set the "keywords" field
- # to be a list of StringValue objects.
- if keyword_texts and not page_url:
- request.keyword_seed.keywords.extend(keyword_texts)
- # To generate keyword ideas using both a list of keywords and a page_url we
- # need to initialize a KeywordAndUrlSeed object, setting both the "url" and
- # "keywords" fields.
- if keyword_texts and page_url:
- request.keyword_and_url_seed.url = page_url
- request.keyword_and_url_seed.keywords.extend(keyword_texts)
- keyword_ideas = keyword_plan_idea_service.generate_keyword_ideas(
- request=request
- )
- for idea in keyword_ideas:
- competition_value = idea.keyword_idea_metrics.competition.name
- print(
- f'Keyword idea text "{idea.text}" has '
- f'"{idea.keyword_idea_metrics.avg_monthly_searches}" '
- f'average monthly searches and "{competition_value}" '
- "competition.\n"
- )
- # [END generate_keyword_ideas]
- def map_keywords_to_string_values(client, keyword_texts):
- keyword_protos = []
- for keyword in keyword_texts:
- string_val = client.get_type("StringValue")
- string_val.value = keyword
- keyword_protos.append(string_val)
- return keyword_protos
- 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="v7")
- parser = argparse.ArgumentParser(
- description="Generates keyword ideas from a list of seed keywords."
- )
- # 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.",
- )
- parser.add_argument(
- "-k",
- "--keyword_texts",
- nargs="+",
- type=str,
- required=False,
- default=[],
- help="Space-delimited list of starter keywords",
- )
- # To determine the appropriate location IDs, see:
- # https://developers.google.com/google-ads/api/reference/data/geotargets
- parser.add_argument(
- "-l",
- "--location_ids",
- nargs="+",
- type=str,
- required=False,
- default=_DEFAULT_LOCATION_IDS,
- help="Space-delimited list of location criteria IDs",
- )
- # To determine the appropriate language ID, see:
- # https://developers.google.com/google-ads/api/reference/data/codes-formats#expandable-7
- parser.add_argument(
- "-i",
- "--language_id",
- type=str,
- required=False,
- default=_DEFAULT_LANGUAGE_ID,
- help="The language criterion ID.",
- )
- # Optional: Specify a URL string related to your business to generate ideas.
- parser.add_argument(
- "-p",
- "--page_url",
- type=str,
- required=False,
- help="A URL string related to your business",
- )
- args = parser.parse_args()
- try:
- main(
- googleads_client,
- args.customer_id,
- args.location_ids,
- args.language_id,
- args.keyword_texts,
- args.page_url,
- )
- 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)
|