Автоматизируем рекламу. Adwords API. Часть 1
Всем привет! Это первая статья в цикле. Для начала представлюсь. Меня зовут Леонид, я работаю в Chocofamily, занимаюсь маркетингом в проекте Chocofood.
Хочу сразу оправдать себя, я в первую очередь маркетолог, и программировать не умею, но учусь и стараюсь. Поэтому эти статьи не претендуют на истину в последней инстанции, а качество написанного говнокода оставляет желать лучшего. Основная цель всего этого — показать маркетолагам, что учить питон и другие штуки это классно, и сильно поможет в работе.
Итак, начинаем. Мы будем использовать для автоматизации Python 2.7 и официальную библиотеку для работы с Adwords от Google. Ссылка для скачивания, изучения примеров и т.д.: https://github.com/googleads/googleads-python-lib
Устанавливаем Python, если у вас его нет. В интернете миллиард гайдов, как это сделать.
Далее устанавливаем библиотеку для работы с Adwords, под названием GoogleAds. В консоли пишем:
$ pip install googleads
Результат должен быть таким:
3. Другие библиотеки, которые необходимы для корректной работы GoogleAds (при установке через pip устанавливаются автоматически):
- httplib2 -- https://pypi.python.org/pypi/httplib2/
- oauth2client -- https://pypi.python.org/pypi/oauth2client/
- suds-jurko -- https://pypi.python.org/pypi/suds-jurko/
- pysocks -- https://pypi.python.org/pypi/PySocks/
- pytz -- https://pypi.python.org/pypi/pytz
- pyYAML -- https://pypi.python.org/pypi/pyYAML/
- xmltodict -- https://pypi.python.org/pypi/xmltodict/
- mock -- https://pypi.python.org/pypi/mock
(only needed to run unit tests)
- pyfakefs -- https://pypi.python.org/pypi/pyfakefs
(only needed to run unit tests)
4. Теперь самое интересное: авторизация.
Для того чтоб работать с API, вам нужен токен разработчика, client id, client secret, refresh token и номер клиента.
Для того, чтобы получит токен разработчика, мы регистрируем Центр клиентов (MCC), заходим в “Настройки” > “Центр Adwords API”, и там заполняем форму для получения токена:
После этого мы получим токен, у которого есть доступ только к тестовым центрам клиентов (о том, как получить базовый доступ, я расскажу в следующих статьях).
Ну и, как вы понимаете, вам теперь необходим тестовый центр клиентов (тестовый MCC аккаунт), для этого нужно зарегистрировать новый gmail аккаунт и перейти по ссылке: https://adwords.google.com/um/StartNewMccAccount?testAccount=true
В результате вы должны получить такой MCC акк с красной плашкой, предупреждающей о том, что это тестовый аккаунт (в нем лучше сразу завести тестового клиента, с тестовой кампанией):
Переходим к получению client_id, client_secret (они нужны и для тестового аккаунта, и для боевого):
Идем по адресу: console.cloud.google.com. Авторизуемся с почты, на которой зарегистрирован тестовый MCC.
Регистрируем новый проект:
Для этого жмем на “Выберите проект” и жмем на +
После этого заходим в раздел «Credentials» или «Учетные данные» в боковом меню, и в открывшемся разделе жмем «Create credentials» (создать учетные данные) > oAuth Client ID. В “Application type” выбираем “Other”. Если все успешно, выскочит окошко с client id и client secret.
Отлично, теперь у нас есть токен разработчика, клиент айди и секрет. Нужен рефреш токен. Для этого создаем .py файл с этим кодом:
import argparse
import sys
from oauth2client import client
# Your OAuth2 Client ID and Secret. If you do not have an ID and Secret yet,
# please go to https://console.developers.google.com and create a set.
DEFAULT_CLIENT_ID = ‘ВСТАВЬТЕ ВАШ CLIENT ID’
DEFAULT_CLIENT_SECRET = ‘ВСТАВЬТЕ ВАШ CLIENT SECRET’
# The AdWords API OAuth2 scope.
SCOPE = u’https://www.googleapis.com/auth/adwords'
parser = argparse.ArgumentParser(description=’Generates a refresh token with ‘
‘the provided credentials.’)
parser.add_argument(‘ — client_id’, default=DEFAULT_CLIENT_ID,
help=’Client Id retrieved from the Developer\’s Console.’)
parser.add_argument(‘ — client_secret’, default=DEFAULT_CLIENT_SECRET,
help=’Client Secret retrieved from the Developer\’s ‘
‘Console.’)
parser.add_argument(‘ — additional_scopes’, default=None,
help=’Additional scopes to apply when generating the ‘
‘refresh token. Each scope should be separated by a comma.’)
def main(client_id, client_secret, scopes):
“””Retrieve and display the access and refresh token.”””
flow = client.OAuth2WebServerFlow(
client_id=client_id,
client_secret=client_secret,
scope=scopes,
user_agent=’Ads Python Client Library’,
redirect_uri=’urn:ietf:wg:oauth:2.0:oob’)
authorize_url = flow.step1_get_authorize_url()
print (‘Log into the Google Account you use to access your AdWords account’
‘and go to the following URL: \n%s\n’ % (authorize_url))
print ‘After approving the token enter the verification code (if specified).’
code = raw_input(‘Code: ‘).strip()
try:
credential = flow.step2_exchange(code)
except client.FlowExchangeError, e:
print ‘Authentication has failed: %s’ % e
sys.exit(1)
else:
print (‘OAuth2 authorization successful!\n\n’
‘Your access token is:\n %s\n\nYour refresh token is:\n %s’
% (credential.access_token, credential.refresh_token))
if __name__ == ‘__main__’:
args = parser.parse_args()
configured_scopes = [SCOPE]
if not (any([args.client_id, DEFAULT_CLIENT_ID]) and
any([args.client_secret, DEFAULT_CLIENT_SECRET])):
raise AttributeError(‘No client_id or client_secret specified.’)
if args.additional_scopes:
configured_scopes.extend(args.additional_scopes.replace(‘ ‘, ‘’).split(‘,’))
main(args.client_id, args.client_secret, configured_scopes)
Запустим его через консоль, предварительно вставив client_id&client_secret в нужные поля, в результате вы получите ссылку:
Перейдя по ней, нужно выбрать аккаунт, на который зарегистрирован тестовый MCC.
После выбора вы получите код:
Его нужно вставить в консоль, в результате вы получите ваш refresh token:
В будущем, когда вы получите базовый доступ для вашего токена разработчика, все эти манипуляции нужно будет повторить для основного MCC аккаунта.
Потненько, но мы почти у цели. У нас есть все, чтобы сделать первый запрос, а именно: получить список компаний в моем аккаунте.
Как это сделать, я расскажу во второй статье.
P.S. Мне лень замазывать токены, ключи и прочую лабуду, так что после публикация я их просто удалю.