Получение HttpError 401 при создании сетевого отчета Google Admob с использованием скрипта python - PullRequest
0 голосов
/ 11 февраля 2020

Ниже приведен код, который я использую для генерации сетевого отчета Admob.

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
import os


base_path=os.path.dirname(os.path.realpath(__file__))
scopes=['https://www.googleapis.com/auth/admob.report']
key_file_location = base_path+'/config/service_account.json'

credentials = ServiceAccountCredentials.from_json_keyfile_name(key_file_location, scopes)



account_id='accounts/pub-XXXXXXXXXXXXXXXX'
network_report_filter = {
  'dateRange': {
    'startDate': {'year': 2020, 'month': 1, 'day': 1},
    'endDate': {'year': 2020, 'month': 2, 'day': 10}
  },
  'dimensions': ['DATE', 'APP', 'COUNTRY'],
  'metrics': ['CLICKS', 'ESTIMATED_EARNINGS'],
  'dimensionFilters': [
    {
      'dimension': 'COUNTRY',
      'matchesAny': {'values': [{'value': 'US', 'value': 'CN'}]}
    }
  ],
  'sortConditions': [
    {'dimension':'APP', 'order': 'ASCENDING'},
    {'metric':'CLICKS', 'order': 'DESCENDING'}
  ],
  'localizationSettings': {
    'currencyCode': 'USD',
    'languageCode': 'en-US'
  }
}


# Build the service object.
admob = build('admob', 'v1', credentials=credentials)

admob._resourceDesc=network_report_filter
accounts=admob.accounts()
network_report=accounts.networkReport().generate(parent=account_id)
data=network_report.execute()

Выдает приведенную ниже ошибку

*** HttpError: https://admob.googleapis.com/v1/accounts/pub-XXXXXXXXXXXXXXXX/networkReport: генерировать ? alt = json возвращено "В запросе отсутствуют необходимые учетные данные для проверки подлинности. Ожидаемый токен доступа OAuth 2, идентификатор входа в систему ie или другие действительные учетные данные для проверки подлинности. См. https://developers.google.com/identity/sign-in/web/devconsole-project.">

Я сгенерировал учетные данные учетной записи службы с помощью Admob API. Но не удалось выяснить, почему возникает ошибка аутентификации.

1 Ответ

0 голосов
/ 03 апреля 2020

Основная проблема - этот код пытается использовать служебную учетную запись для запроса API. Но это не поддерживается. Его можно запросить с помощью идентификатора клиента OAuth2.0

Шаги для создания идентификатора клиента OAth2.0:

Мне хорошо подходит следующее:

Libs:

pip3 install --upgrade google-api-python-client --user
pip3 install --upgrade oauth2client --user

Пример кода:

import json

import argparse
import sys
from googleapiclient import discovery
from googleapiclient.http import build_http
from oauth2client import tools
from oauth2client.file import Storage
from oauth2client.client import OAuth2WebServerFlow


class AdMobAPI:

    def __init__(self):
        scope = 'https://www.googleapis.com/auth/admob.report'
        name = 'admob'
        version = 'v1'

        flow = OAuth2WebServerFlow(client_id='<todo: replace with a client_id from the secret json>',
                                   client_secret='<todo: replace with a secret from the secret json>',
                                   scope=scope)
        storage = Storage(name + '.dat')
        credentials = storage.get()
        if credentials is None or credentials.invalid:
            credentials = tools.run_flow(flow, storage)
        http = credentials.authorize(http=build_http())
        self.admob = discovery.build(name, version, http=http)

    def generate_report(self, publisher_id):
        date_range = {'startDate': {'year': 2020, 'month': 4, 'day': 1},
                      'endDate': {'year': 2020, 'month': 4, 'day': 1}}
        dimensions = ['DATE', 'APP', 'PLATFORM', 'COUNTRY']
        metrics = ['ESTIMATED_EARNINGS', 'IMPRESSIONS', 'CLICKS',
                   'AD_REQUESTS', 'MATCHED_REQUESTS']
        sort_conditions = {'dimension': 'DATE', 'order': 'DESCENDING'}
        report_spec = {'dateRange': date_range,
                       'dimensions': dimensions,
                       'metrics': metrics,
                       'sortConditions': [sort_conditions]}

        request = {'reportSpec': report_spec}
        result = self.admob.accounts().networkReport().generate(
                parent='accounts/{}'.format(publisher_id),
                body=request).execute()

        # Display results.
        for report_line in result:
          print(report_line)
        print()

api = AdMobAPI()
api.generate_report('<todo: replace with publisher id, smth like pub-[0-9]+>')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...