API Google Книг: невозможно определить местоположение пользователя для работы с географическим ограничением.

Уже три дня я получаю вышеупомянутое сообщение об ошибке при попытке доступа к API книг Google, хотя мой IP не изменился. Я могу воспроизвести это в командной строке с помощью простого

curl "https://www.googleapis.com/books/v1/volumes?q=frankenstein"

Так что это не мой код. Это можно исправить, добавив код страны:

curl "https://www.googleapis.com/books/v1/volumes?q=frankenstein&country=DE"

Теперь, как мне это сделать в PHP-клиенте?

Я попытался добавить страну в качестве необязательного параметра:


$client = new Google_Client();
$client->setApplicationName("My_Project");
$client->setDeveloperKey( $google_books_api_key );
$service = new Google_Service_Books($client);
$optParams = array(
    'country' => 'DE'
);
$results = $service->volumes->listVolumes($terms, $optParams);

но это просто дает мне

{"error": {"errors": [{"domain": "global","reason": "backendFailed","message": "Service temporarily unavailable.","locationType": other","location": "backend_flow"}],"code": 503,"message": "Service emporarily anavailable."}}

Решение, которое я нашел где-то, чтобы установить IP-адрес пользователя на тот, к которому у меня есть доступ, по-прежнему выдавало мне сообщение об ошибке «географически ограничено».

$optParams = array(
    'userIp' => '91.64.137.131'
);

Я нашел решения для клиентов, отличных от PHP, таких как Java? или Ruby или C#, но мне они не показались полезными.

В PHP-клиенте существует метод setCountry($country) в классе Google_Service_Books_VolumeAccessInfo extends Google_Model, но я не знаю, как получить доступ к этому методу. Кто-нибудь знает, как это решить?


person fisch    schedule 28.02.2019    source источник
comment
Решение опубликовано на github.com/googleapis/google. -api-php-client/проблемы/   -  person fisch    schedule 28.02.2019
comment
Мы не делаем SOLVED в названиях здесь. Вы можете либо ответить на свой вопрос и принять его, либо удалить вопрос.   -  person j08691    schedule 28.02.2019
comment
Хотя я понимаю причины, было бы странно представлять решение как мое или удалять вопросы, поскольку их задавали так много раз в разных местах. Я спрошу человека, который решил это, если он тоже напишет здесь.   -  person fisch    schedule 01.03.2019


Ответы (1)


Вы можете сделать это аналогично другим языковым примерам, которыми вы поделились, используя промежуточное ПО:

use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Uri;
use GuzzleHttp\Middleware;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Handler\CurlHandler;

// Set this value to the country you want.
$countryCode = 'DE';

$client = new Google_Client();
$client->setApplicationName("My_Project");
$client->setDeveloperKey( $google_books_api_key );
$service = new Google_Service_Books($client);
$optParams = [];

$handler = new CurlHandler;
$stack = HandlerStack::create($handler);
$stack->push(Middleware::mapRequest(function ($request) use ($countryCode) {
    $request = $request->withUri(Uri::withQueryValue(
        $request->getUri(),
        'country',
        $countryCode
    ));

    return $request;
}));
$guzzle = new Client([
    'handler' => $stack
]);

$client->setHttpClient($guzzle);

$results = $service->volumes->listVolumes($terms, $optParams);

Промежуточное ПО — это набор функций, которые используются для изменения запросов и ответов. В этом примере добавляется промежуточное ПО запроса, которое перед отправкой запроса добавит country=$countryCode к строке запроса URI.

Этот пример несколько упрощен, и вам нужно немного поработать над ним. Большая проблема заключается в том, что это промежуточное ПО будет добавлять код страны к каждому запросу, отправленному из этого экземпляра Google_Client. Я предлагаю добавить дополнительную логику, чтобы ограничить модификацию только этим запросом.

person jdp    schedule 01.03.2019