Google图书API:“无法确定受地理位置限制的操作的用户位置。”

时间:2019-02-28 13:57:55

标签: php google-cloud-platform google-api-client google-books

自三天以来,尽管我的IP并未更改,但在尝试访问Google Books API时出现了上述错误消息。我可以在命令行上用一个简单的方式重现它

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设置为我可以访问的IP地址的解决方案,但仍然给了我“地理位置受限”的错误消息。

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

我找到了除Java?RubyC#以外的PHP客户解决方案,但它们似乎对我没有帮助。

在PHP客户端中,“类Google_Service_Books_VolumeAccessInfo扩展了Google_Model”中存在一个 setCountry($ country)方法,但我不知道如何访问该方法。有人知道如何解决吗?

1 个答案:

答案 0 :(得分: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实例发送的每个请求中。我建议添加其他逻辑以仅将修改限制为该请求。