Невозможно использовать тестовую учетную запись Google Ads: QuotaCheckError.INVALID_TOKEN_HEADER @; trigger: "Новые разработчики должны использовать Google Реклама API".
Прошло больше недели, а я не был, чтобы понять, где я ошибаюсь.
Я пытаюсь использовать планировщик ключевых слов и получаю постоянную ошибку аутентификации. У меня есть тестовая учетная запись менеджера, и я создал на ее основе тестовую учетную запись Google. У меня также есть client_id, client_secret и refresh_token с console.developer.google.com.
Я использую токен разработчика из производственной учетной записи, которая не проверена.
Заранее спасибо.
Вот сообщение об ошибке:
Your default encoding, cp1252, is not UTF-8. Please run this script with UTF-8 encoding to avoid errors.
Error summary: {'faultMessage': "[QuotaCheckError.INVALID_TOKEN_HEADER @ ; trigger:'New developers must use the Google Ads API.']", 'requestId': 'foobar', 'serviceName': 'TrafficEstimatorService', 'methodName': 'get', 'operations': '1', 'responseTime': '83'}
Traceback (most recent call last):
File "env\lib\site-packages\googleads\common.py", line 984, in MakeSoapRequest
return soap_service_method(
File "env\lib\site-packages\zeep\proxy.py", line 46, in __call__
return self._proxy._binding.send(
File "env\lib\site-packages\zeep\wsdl\bindings\soap.py", line 135, in send
return self.process_reply(client, operation_obj, response) File "env\lib\site-packages\zeep\wsdl\bindings\soap.py", line 229, in process_reply
return self.process_error(doc, operation)
File "env\lib\site-packages\zeep\wsdl\bindings\soap.py", line 329, in process_error
raise Fault(
zeep.exceptions.Fault: [QuotaCheckError.INVALID_TOKEN_HEADER @ ; trigger:'New developers must use the Google Ads API.']
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "test.py", line 181, in <module>
main(adwords_client)
File "test.py", line 97, in main
estimates = traffic_estimator_service.get(selector)
File "env\lib\site-packages\googleads\common.py", line 996, in MakeSoapRequest
raise googleads.errors.GoogleAdsServerFault(
googleads.errors.GoogleAdsServerFault: [QuotaCheckError.INVALID_TOKEN_HEADER @ ; trigger:'New developers must use the Google Ads API.']
Вот мой файл с рекламой Google:
adwords:
# AdWordsClient configurations
developer_token: mydevtoken1234
client_customer_id: 123-123-123
validate_only: False
client_id: myclientId.apps.googleusercontent.com
client_secret: myclientsecret
refresh_token: myrefreshtoken
# AdManagerClient configurations
ad_manager:
developer_token: EZ-x_JXs6mtX6tDO_8VauA
application_name: get-keyword-ideas
# path_to_private_key_file: INSERT_PATH_TO_JSON_KEY_FILE_HERE
client_id: myclientId.apps.googleusercontent.com
client_secret: myclientsecret
refresh_token: myrefreshtoken
И вот мой код Python для trafficEstimator
#!/usr/bin/env python
#
# Copyright 2016 Google Inc. All Rights Reserved.
#
# 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
#
# http://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 retrieves keyword traffic estimates.
The LoadFromStorage method is pulling credentials and properties from a
"googleads.yaml" file. By default, it looks for this file in your home
directory. For more information, see the "Caching authentication information"
section of our README.
"""
from googleads import adwords
def main(client):
# Initialize appropriate service.
traffic_estimator_service = client.GetService(
'TrafficEstimatorService', version='v201809')
# Construct selector object and retrieve traffic estimates.
keywords = [
{'text': 'mars cruise', 'matchType': 'BROAD'},
{'text': 'cheap cruise', 'matchType': 'PHRASE'},
{'text': 'cruise', 'matchType': 'EXACT'}
]
negative_keywords = [
{'text': 'moon walk', 'matchType': 'BROAD'}
]
keyword_estimate_requests = []
for keyword in keywords:
keyword_estimate_requests.append({
'keyword': {
'xsi_type': 'Keyword',
'matchType': keyword['matchType'],
'text': keyword['text']
}
})
for keyword in negative_keywords:
keyword_estimate_requests.append({
'keyword': {
'xsi_type': 'Keyword',
'matchType': keyword['matchType'],
'text': keyword['text']
},
'isNegative': 'true'
})
# Create ad group estimate requests.
adgroup_estimate_requests = [{
'keywordEstimateRequests': keyword_estimate_requests,
'maxCpc': {
'xsi_type': 'Money',
'microAmount': '1000000'
}
}]
# Create campaign estimate requests.
campaign_estimate_requests = [{
'adGroupEstimateRequests': adgroup_estimate_requests,
'criteria': [
{
'xsi_type': 'Location',
'id': '2840' # United States.
},
{
'xsi_type': 'Language',
'id': '1000' # English.
}
],
}]
# Create the selector.
selector = {
'campaignEstimateRequests': campaign_estimate_requests,
}
# Optional: Request a list of campaign-level estimates segmented by
# platform.
selector['platformEstimateRequested'] = True
# Get traffic estimates.
estimates = traffic_estimator_service.get(selector)
campaign_estimate = estimates['campaignEstimates'][0]
# Display the campaign level estimates segmented by platform.
if 'platformEstimates' in campaign_estimate:
platform_template = ('Results for the platform with ID: "%d" and name: '
'"%s".')
for platform_estimate in campaign_estimate['platformEstimates']:
platform = platform_estimate['platform']
DisplayEstimate(platform_template % (platform['id'],
platform['platformName']),
platform_estimate['minEstimate'],
platform_estimate['maxEstimate'])
# Display the keyword estimates.
if 'adGroupEstimates' in campaign_estimate:
ad_group_estimate = campaign_estimate['adGroupEstimates'][0]
if 'keywordEstimates' in ad_group_estimate:
keyword_estimates = ad_group_estimate['keywordEstimates']
keyword_template = ('Results for the keyword with text "%s" and match '
'type "%s":')
keyword_estimates_and_requests = zip(keyword_estimates,
keyword_estimate_requests)
for keyword_tuple in keyword_estimates_and_requests:
if keyword_tuple[1].get('isNegative', False):
continue
keyword = keyword_tuple[1]['keyword']
keyword_estimate = keyword_tuple[0]
DisplayEstimate(keyword_template % (keyword['text'],
keyword['matchType']),
keyword_estimate['min'], keyword_estimate['max'])
def _CalculateMean(min_est, max_est):
if min_est and max_est:
return (float(min_est) + float(max_est)) / 2.0
else:
return None
def _FormatMean(mean):
if mean:
return '%.2f' % mean
else:
return 'N/A'
def DisplayEstimate(message, min_estimate, max_estimate):
"""Displays mean average cpc, position, clicks, and total cost for estimate.
Args:
message: str message to display for the given estimate.
min_estimate: zeep.objects.StatsEstimate containing a minimum estimate from the
TrafficEstimatorService response.
max_estimate: zeep.objects.StatsEstimate containing a maximum estimate from the
TrafficEstimatorService response.
"""
# Find the mean of the min and max values.
mean_avg_cpc = (_CalculateMean(min_estimate['averageCpc']['microAmount'],
max_estimate['averageCpc']['microAmount'])
if 'averageCpc' in min_estimate
and min_estimate['averageCpc'] else None)
mean_avg_pos = (_CalculateMean(min_estimate['averagePosition'],
max_estimate['averagePosition'])
if 'averagePosition' in min_estimate
and min_estimate['averagePosition'] else None)
mean_clicks = _CalculateMean(min_estimate['clicksPerDay'],
max_estimate['clicksPerDay'])
mean_total_cost = _CalculateMean(min_estimate['totalCost']['microAmount'],
max_estimate['totalCost']['microAmount'])
print(message)
print(' Estimated average CPC: %s' % _FormatMean(mean_avg_cpc))
print(' Estimated ad position: %s' % _FormatMean(mean_avg_pos))
print(' Estimated daily clicks: %s' % _FormatMean(mean_clicks))
print(' Estimated daily cost: %s' % _FormatMean(mean_total_cost))
if __name__ == '__main__':
# Initialize client object.
adwords_client = adwords.AdWordsClient.LoadFromStorage('googleads.yaml')
main(adwords_client)
1 ответ
У меня была такая же проблема с основным токеном доступа при получении данных отчета.
Я использовал пакет google-ads вместо googleads, и это решило проблему.
IMO, они уже начали ограничение AdWords API для новых разработчиков.