Google Книги API: «Невозможно определить местоположение пользователя для географически ограниченных операций». - PullRequest
0 голосов
/ 28 февраля 2019

Уже три дня я получаю вышеупомянутое сообщение об ошибке при попытке получить доступ к 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 в классе 'Google_Service_Books_VolumeAccessInfo extends Google_Model' существует метод setCountry ($ country) , но я не знаю, как получить к нему доступметод.Кто-нибудь знает, как это решить?

1 Ответ

0 голосов
/ 01 марта 2019

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

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.Я предлагаю добавить дополнительную логику, чтобы ограничить изменение только этим запросом.

...