2929
3030import argparse
3131import sys
32+ from typing import List
3233
3334from google .ads .googleads .client import GoogleAdsClient
3435from google .ads .googleads .errors import GoogleAdsException
35-
36-
37- def main (client , customer_id , campaign_id ):
38- campaign_service = client .get_service ("CampaignService" )
39- campaign_criterion_operation = client .get_type ("CampaignCriterionOperation" )
40- campaign_criterion = campaign_criterion_operation .create
36+ from google .ads .googleads .v20 .common .types .criteria import (
37+ ListingDimensionInfo ,
38+ )
39+ from google .ads .googleads .v20 .enums .types .product_custom_attribute_index import (
40+ ProductCustomAttributeIndexEnum ,
41+ )
42+ from google .ads .googleads .v20 .enums .types .product_type_level import (
43+ ProductTypeLevelEnum ,
44+ )
45+ from google .ads .googleads .v20 .resources .types .campaign_criterion import (
46+ CampaignCriterion ,
47+ )
48+ from google .ads .googleads .v20 .services .services .campaign_criterion_service import (
49+ CampaignCriterionServiceClient ,
50+ )
51+ from google .ads .googleads .v20 .services .services .campaign_service import (
52+ CampaignServiceClient ,
53+ )
54+ from google .ads .googleads .v20 .services .types .campaign_criterion_service import (
55+ CampaignCriterionOperation ,
56+ MutateCampaignCriteriaResponse ,
57+ )
58+
59+
60+ def main (client : GoogleAdsClient , customer_id : str , campaign_id : str ) -> None :
61+ campaign_service : CampaignServiceClient = client .get_service (
62+ "CampaignService"
63+ )
64+ campaign_criterion_operation : CampaignCriterionOperation = client .get_type (
65+ "CampaignCriterionOperation"
66+ )
67+ campaign_criterion : CampaignCriterion = campaign_criterion_operation .create
4168 campaign_criterion .campaign = campaign_service .campaign_path (
4269 customer_id , campaign_id
4370 )
@@ -47,39 +74,53 @@ def main(client, customer_id, campaign_id):
4774 # must be met for a product to be included in a campaign.
4875 # A typical listing scope might only have a few dimensions. This example
4976 # demonstrates a range of different dimensions you could use.
50- dimensions = campaign_criterion .listing_scope .dimensions
77+ dimensions : List [ListingDimensionInfo ] = (
78+ campaign_criterion .listing_scope .dimensions
79+ )
5180
52- product_brand_dimension = client .get_type ("ListingDimensionInfo" )
81+ product_brand_dimension : ListingDimensionInfo = client .get_type (
82+ "ListingDimensionInfo"
83+ )
5384 product_brand_dimension .product_brand .value = "google"
5485 dimensions .append (product_brand_dimension )
5586
56- product_custom_attribute_index_enum = (
87+ product_custom_attribute_index_enum : ProductCustomAttributeIndexEnum = (
5788 client .enums .ProductCustomAttributeIndexEnum
5889 )
59- product_custom_attribute_dimension = client .get_type ("ListingDimensionInfo" )
90+ product_custom_attribute_dimension : ListingDimensionInfo = client .get_type (
91+ "ListingDimensionInfo"
92+ )
6093 product_custom_attribute = (
6194 product_custom_attribute_dimension .product_custom_attribute
6295 )
6396 product_custom_attribute .index = product_custom_attribute_index_enum .INDEX0
6497 product_custom_attribute .value = "top_selling_products"
6598 dimensions .append (product_custom_attribute_dimension )
6699
67- product_type_level_enum = client .enums .ProductTypeLevelEnum
68- product_type_dimension_1 = client .get_type ("ListingDimensionInfo" )
100+ product_type_level_enum : ProductTypeLevelEnum = (
101+ client .enums .ProductTypeLevelEnum
102+ )
103+ product_type_dimension_1 : ListingDimensionInfo = client .get_type (
104+ "ListingDimensionInfo"
105+ )
69106 product_type = product_type_dimension_1 .product_type
70107 product_type .level = product_type_level_enum .LEVEL1
71108 product_type .value = "electronics"
72109 dimensions .append (product_type_dimension_1 )
73110
74- product_type_dimension_2 = client .get_type ("ListingDimensionInfo" )
111+ product_type_dimension_2 : ListingDimensionInfo = client .get_type (
112+ "ListingDimensionInfo"
113+ )
75114 product_type = product_type_dimension_2 .product_type
76115 product_type .level = product_type_level_enum .LEVEL2
77116 product_type .value = "smartphones"
78117 dimensions .append (product_type_dimension_2 )
79118
80- campaign_criterion_service = client .get_service ("CampaignCriterionService" )
119+ campaign_criterion_service : CampaignCriterionServiceClient = (
120+ client .get_service ("CampaignCriterionService" )
121+ )
81122
82- campaign_criterion_response = (
123+ campaign_criterion_response : MutateCampaignCriteriaResponse = (
83124 campaign_criterion_service .mutate_campaign_criteria (
84125 customer_id = customer_id , operations = [campaign_criterion_operation ]
85126 )
@@ -89,8 +130,8 @@ def main(client, customer_id, campaign_id):
89130 f"Added { len (campaign_criterion_response .results )} campaign "
90131 "criteria:"
91132 )
92- for campaign_criterion in campaign_criterion_response .results :
93- print (campaign_criterion .resource_name )
133+ for criterion in campaign_criterion_response .results :
134+ print (criterion .resource_name )
94135
95136
96137if __name__ == "__main__" :
@@ -108,11 +149,13 @@ def main(client, customer_id, campaign_id):
108149 parser .add_argument (
109150 "-i" , "--campaign_id" , type = str , required = True , help = "The campaign ID."
110151 )
111- args = parser .parse_args ()
152+ args : argparse . Namespace = parser .parse_args ()
112153
113154 # GoogleAdsClient will read the google-ads.yaml configuration file in the
114155 # home directory if none is specified.
115- googleads_client = GoogleAdsClient .load_from_storage (version = "v20" )
156+ googleads_client : GoogleAdsClient = GoogleAdsClient .load_from_storage (
157+ version = "v20"
158+ )
116159
117160 try :
118161 main (googleads_client , args .customer_id , args .campaign_id )
0 commit comments