2121import argparse
2222import datetime
2323import sys
24+ from typing import List
2425import uuid
2526
2627from google .ads .googleads .client import GoogleAdsClient
2728from google .ads .googleads .errors import GoogleAdsException
28-
29-
30- _DATE_FORMAT = "%Y%m%d"
31-
32-
33- def main (client , customer_id ):
34- campaign_budget_service = client .get_service ("CampaignBudgetService" )
35- campaign_service = client .get_service ("CampaignService" )
29+ from google .ads .googleads .v20 .services .services .campaign_budget_service import (
30+ CampaignBudgetServiceClient ,
31+ )
32+ from google .ads .googleads .v20 .services .types .campaign_budget_service import (
33+ CampaignBudgetOperation ,
34+ MutateCampaignBudgetsResponse ,
35+ )
36+ from google .ads .googleads .v20 .services .services .campaign_service import (
37+ CampaignServiceClient ,
38+ )
39+ from google .ads .googleads .v20 .services .types .campaign_service import (
40+ CampaignOperation ,
41+ MutateCampaignsResponse ,
42+ )
43+ from google .ads .googleads .v20 .resources .types .campaign_budget import (
44+ CampaignBudget ,
45+ )
46+ from google .ads .googleads .v20 .resources .types .campaign import Campaign
47+
48+
49+ _DATE_FORMAT : str = "%Y%m%d"
50+
51+
52+ def main (client : GoogleAdsClient , customer_id : str ) -> None :
53+ campaign_budget_service : CampaignBudgetServiceClient = client .get_service (
54+ "CampaignBudgetService"
55+ )
56+ campaign_service : CampaignServiceClient = client .get_service (
57+ "CampaignService"
58+ )
3659
3760 # [START add_campaigns]
3861 # Create a budget, which can be shared by multiple campaigns.
39- campaign_budget_operation = client .get_type ("CampaignBudgetOperation" )
40- campaign_budget = campaign_budget_operation .create
62+ campaign_budget_operation : CampaignBudgetOperation = client .get_type (
63+ "CampaignBudgetOperation"
64+ )
65+ campaign_budget : CampaignBudget = campaign_budget_operation .create
4166 campaign_budget .name = f"Interplanetary Budget { uuid .uuid4 ()} "
4267 campaign_budget .delivery_method = (
4368 client .enums .BudgetDeliveryMethodEnum .STANDARD
4469 )
4570 campaign_budget .amount_micros = 500000
4671
4772 # Add budget.
73+ campaign_budget_response : MutateCampaignBudgetsResponse
4874 try :
75+ budget_operations : List [CampaignBudgetOperation ] = [
76+ campaign_budget_operation
77+ ]
4978 campaign_budget_response = (
5079 campaign_budget_service .mutate_campaign_budgets (
51- customer_id = customer_id , operations = [campaign_budget_operation ]
80+ customer_id = customer_id ,
81+ operations = budget_operations ,
5282 )
5383 )
5484 except GoogleAdsException as ex :
5585 handle_googleads_exception (ex )
5686 # [END add_campaigns]
87+ # We are exiting in handle_googleads_exception so this return is not
88+ # strictly necessary, but it makes static analysis happier.
89+ return
5790
5891 # [START add_campaigns_1]
5992 # Create campaign.
60- campaign_operation = client .get_type ("CampaignOperation" )
61- campaign = campaign_operation .create
93+ campaign_operation : CampaignOperation = client .get_type ("CampaignOperation" )
94+ campaign : Campaign = campaign_operation .create
6295 campaign .name = f"Interplanetary Cruise { uuid .uuid4 ()} "
6396 campaign .advertising_channel_type = (
6497 client .enums .AdvertisingChannelTypeEnum .SEARCH
@@ -83,24 +116,28 @@ def main(client, customer_id):
83116 # [END add_campaigns_1]
84117
85118 # Optional: Set the start date.
86- start_time = datetime .date .today () + datetime .timedelta (days = 1 )
119+ start_time : datetime .date = datetime .date .today () + datetime .timedelta (
120+ days = 1
121+ )
87122 campaign .start_date = datetime .date .strftime (start_time , _DATE_FORMAT )
88123
89124 # Optional: Set the end date.
90- end_time = start_time + datetime .timedelta (weeks = 4 )
125+ end_time : datetime . date = start_time + datetime .timedelta (weeks = 4 )
91126 campaign .end_date = datetime .date .strftime (end_time , _DATE_FORMAT )
92127
93128 # Add the campaign.
129+ campaign_response : MutateCampaignsResponse
94130 try :
131+ campaign_operations : List [CampaignOperation ] = [campaign_operation ]
95132 campaign_response = campaign_service .mutate_campaigns (
96- customer_id = customer_id , operations = [ campaign_operation ]
133+ customer_id = customer_id , operations = campaign_operations
97134 )
98135 print (f"Created campaign { campaign_response .results [0 ].resource_name } ." )
99136 except GoogleAdsException as ex :
100137 handle_googleads_exception (ex )
101138
102139
103- def handle_googleads_exception (exception ) :
140+ def handle_googleads_exception (exception : GoogleAdsException ) -> None :
104141 print (
105142 f'Request with ID "{ exception .request_id } " failed with status '
106143 f'"{ exception .error .code ().name } " and includes the following errors:'
@@ -125,10 +162,12 @@ def handle_googleads_exception(exception):
125162 required = True ,
126163 help = "The Google Ads customer ID." ,
127164 )
128- args = parser .parse_args ()
165+ args : argparse . Namespace = parser .parse_args ()
129166
130167 # GoogleAdsClient will read the google-ads.yaml configuration file in the
131168 # home directory if none is specified.
132- googleads_client = GoogleAdsClient .load_from_storage (version = "v20" )
169+ googleads_client : GoogleAdsClient = GoogleAdsClient .load_from_storage (
170+ version = "v20"
171+ )
133172
134173 main (googleads_client , args .customer_id )
0 commit comments