Я пытаюсь получить данные из учетной записи AdSense через API управления AdSense.
Я успешно получил данные с помощью Google API Explorer при подключении к моей учетной записи AdSense.
Сейчас я пытаюсь получить эти данные из сценария PHP, который будет запущен в crontab.
Я понимаю, что мне нужно Service account
который я создал и сгенерировал файл json.
Следующий код завершается ошибкой, если я пытаюсь использовать файл json с двумя разными ошибками:
если я использую setSubject с владельцем учетной записи AdSense:
«ошибка»: «неавторизованный_клиент»,
«error_description»: «Клиент не авторизован для получения токенов доступа с помощью этого метода.»
Если я комментирую setSubject:
«причина»: «noAdSenseAccount»,
«сообщение»: «У пользователя нет учетной записи AdSense».
Код:
<?php
require_once '../../vendor/autoload.php';
putenv('GOOGLE_APPLICATION_CREDENTIALS=../conf/Mercury-testlpstats.json');
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->addScope('https://www.googleapis.com/auth/adsense.readonly');
//$client->setSubject('[email protected]');$service = new Google_Service_AdSense($client);$startDate = '2017-05-01';
$endDate = '2017-05-01';
$optParams = array(
'metric' => array('INDIVIDUAL_AD_IMPRESSIONS', 'EARNINGS'),
'dimension' => 'DATE',
'filter' => array('AD_UNIT_ID==ca-pub-XXXX:YYYY'),
'useTimezoneReporting' => true
);
$report = $service->accounts_reports->generate('pub-ZZZZZ', $startDate, $endDate, $optParams);
2-я попытка с OAuth
Я создал учетную запись OAuth в https://console.cloud.google.com/apis/credentials/oauthclient/. Когда я проверяю AdSense API, моя учетная запись появляется в списке авторизованных пользователей в https://console.cloud.google.com/apis/api/adsense.googleapis.com/overview.
Я скачал соответствующий JSON и изменил свой код, но он по-прежнему говорит:
require_once '../../vendor/autoload.php';
$client = new Google_Client();
$client->setAccessType('online');
$client->setAuthConfigFile('/home/al1/lpstats/conf/client_secret_725834039890-klbuc13f8089rjh7eis439b93n7sqqfv.apps.googleusercontent.com.json');
$client->addScope('https://www.googleapis.com/auth/adsense.readonly');
$service = new Google_Service_AdSense($client);
$startDate = '2017-05-01';
$endDate = '2017-05-01';
$optParams = array(
'metric' => array('INDIVIDUAL_AD_IMPRESSIONS', 'EARNINGS'),
'dimension' => 'DATE',
'filter' => array('AD_UNIT_ID==ca-pub-5035025648894332:3442683203'),
'useTimezoneReporting' => true
);
$report = $service->accounts_reports->generate('pub-5035025648894332', $startDate, $endDate, $optParams);
unauthorized_client
Означает, что пользователь, с которым вы выполняете аутентификацию, не имеет доступа к учетной записи Adsence, к которой вы пытаетесь получить доступ.
Сервисная поддержка аккаунта
Существует ряд API Google, которые не поддерживают учетные записи служб. Наиболее заметно было бы API YouTube, у которого даже нет способа поделиться своим аккаунтом с другим пользователем.
Есть и другие, которые позволят вам поделиться своими данными с другим пользователем, но требуют, чтобы данный пользователь ответил на уведомление по электронной почте. Blogger — это одно, а Adsence — другое.
Решение
Вам нужно будет пройти аутентификацию с помощью Oauth2, используя пользователя, который имеет доступ к соответствующей учетной записи Adsence. Аутентифицируйте свой код после сохранения токена обновления и используйте токен обновления для запроса нового токена доступа в вашем задании cron.
Других решений пока нет …