newerton/google-api-php-client

Google API 客户端库

v2.17.0 2024-07-10 14:57 UTC

README

PHP 的 Google API 客户端库

注意:请首先检查您想安装的包是否在我们的Google 云包列表中,因为这些是推荐的库。

参考文档
https://googleapis.github.io/google-api-php-client/
许可证
Apache 2.0

Google API 客户端库使您能够在服务器上使用 Google API,例如 Gmail、Drive 或 YouTube。

这些客户端库由 Google 正式支持。然而,这些库被认为是完整的,并且处于维护模式。这意味着我们将解决关键错误和安全问题,但不会添加任何新功能。

Google 云平台

对于 Google 云平台 API,如数据存储云存储发布/订阅计算引擎,我们建议使用 Google 云客户端库。有关支持的 Google 云客户端库的完整列表,请参阅googleapis/google-cloud-php

要求

开发者文档

文档文件夹提供了使用此库的详细指南。

安装

您可以使用 Composer 或直接 下载发布版

Composer

首选方法是使用 Composer。如果您尚未安装 composer,请遵循安装说明

安装完成后,在项目根目录中执行以下命令以安装此库

composer require google/apiclient:^2.15.0

如果您遇到超时错误,则可以增加 composer 的超时时间,方法是在命令中添加 env 标志,例如 COMPOSER_PROCESS_TIMEOUT=600 composer install,或者您可以在 composer schema 的 config 部分中添加此内容

{
    "config": {
        "process-timeout": 600
    }
}

最后,确保包含自动加载器

require_once '/path/to/your-project/vendor/autoload.php';

此库依赖于 google/apiclient-services。该库为大量 Google API 提供最新的 API 包装器。为了使用最新的 API 客户端,此库不会固定到 google/apiclient-services 的特定版本。为了防止意外安装带有破坏性更改的 API 包装器,强烈建议在将此库用于生产之前,自行固定到最新版本

清理未使用的服务

Google API 服务超过200个。很可能您并不需要全部服务。为了避免将这些依赖项与代码一起打包,您可以运行 Google\Task\Composer::cleanup 任务,并在 composer.json 中指定您想要保留的服务

{
    "require": {
        "google/apiclient": "^2.15.0"
    },
    "scripts": {
        "pre-autoload-dump": "Google\\Task\\Composer::cleanup"
    },
    "extra": {
        "google/apiclient-services": [
            "Drive",
            "YouTube"
        ]
    }
}

此示例在执行 composer update 或新的 composer install 时将删除除“Drive”和“YouTube”之外的所有服务。

重要:如果您在 composer.json 中添加了任何服务,则需要显式删除 vendor/google/apiclient-services 目录,以确保所做的更改生效。

rm -r vendor/google/apiclient-services
composer update

注意:此命令对服务名称进行精确匹配,因此要保留 YouTubeReportingYouTubeAnalytics,您需要显式添加每个服务。

{
    "extra": {
        "google/apiclient-services": [
            "Drive",
            "YouTube",
            "YouTubeAnalytics",
            "YouTubeReporting"
        ]
    }
}

下载发布版本

如果您不希望使用 composer,可以下载整个包。在 发布 页面上列出了所有稳定版本。下载任何名为 google-api-php-client-[RELEASE_NAME].zip 的文件,即可获得包含此库及其依赖项的包。

解压缩您下载的 zip 文件,并将自动加载器包含到您的项目中

require_once '/path/to/google-api-php-client/vendor/autoload.php';

有关安装和设置的其他说明,请参阅 文档

示例

请参阅 examples/ 目录中的关键客户端功能示例。您可以通过运行内置的 php 网络服务器来在浏览器中查看它们。

$ php -S localhost:8000 -t examples/

然后浏览到您指定的主机和端口(在上面的示例中为 https://:8000)。

基本示例

// include your composer dependencies
require_once 'vendor/autoload.php';

$client = new Google\Client();
$client->setApplicationName("Client_Library_Examples");
$client->setDeveloperKey("YOUR_APP_KEY");

$service = new Google\Service\Books($client);
$query = 'Henry David Thoreau';
$optParams = [
  'filter' => 'free-ebooks',
];
$results = $service->volumes->listVolumes($query, $optParams);

foreach ($results->getItems() as $item) {
  echo $item['volumeInfo']['title'], "<br /> \n";
}

使用 OAuth 进行身份验证

此示例可在 examples/simple-file-upload.php 中找到。

  1. 按照说明进行操作 创建网络应用程序凭据

  2. 下载 JSON 凭据

  3. 使用 Google\Client::setAuthConfig 设置这些凭据的路径

    $client = new Google\Client();
    $client->setAuthConfig('/path/to/client_credentials.json');
  4. 设置您将要调用的 API 所需的权限范围

    $client->addScope(Google\Service\Drive::DRIVE);
  5. 设置您的应用程序的重定向 URI

    // Your redirect URI can be any registered URI, but in this example
    // we redirect back to this same page
    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
    $client->setRedirectUri($redirect_uri);
  6. 在处理重定向 URI 的脚本中,将授权代码交换为访问令牌

    if (isset($_GET['code'])) {
        $token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
    }

使用服务帐户进行身份验证

此示例可在 examples/service-account.php 中找到。

某些 API(例如 YouTube 数据 API)不支持服务帐户。如果 API 调用返回意外的 401 或 403 错误,请查阅特定 API 文档。

  1. 按照说明进行操作 创建服务帐户

  2. 下载 JSON 凭据

  3. 使用环境变量 GOOGLE_APPLICATION_CREDENTIALS 设置这些凭据的路径

    putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json');
  4. 告诉 Google 客户端使用您的服务帐户凭据进行身份验证

    $client = new Google\Client();
    $client->useApplicationDefaultCredentials();
  5. 设置您将要调用的 API 所需的权限范围

    $client->addScope(Google\Service\Drive::DRIVE);
  6. 如果您已将域范围访问权限委派给服务帐户,并且您想代表用户帐户进行模拟,请使用 setSubject 方法指定用户帐户的电子邮件地址

    $client->setSubject($user_to_impersonate);

如何使用特定的 JSON 键

如果您想使用特定的 JSON 键而不是使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量,您可以这样做

$jsonKey = [
   'type' => 'service_account',
   // ...
];
$client = new Google\Client();
$client->setAuthConfig($jsonKey);

发送请求

google-api-php-client-services 中用于调用 API 的类是自动生成的。它们直接映射到在 APIs Explorer 中找到的 JSON 请求和响应。

Datastore API 的 JSON 请求如下所示

POST https://datastore.googleapis.com/v1beta3/projects/YOUR_PROJECT_ID:runQuery?key=YOUR_API_KEY
{
    "query": {
        "kind": [{
            "name": "Book"
        }],
        "order": [{
            "property": {
                "name": "title"
            },
            "direction": "descending"
        }],
        "limit": 10
    }
}

使用这个库,相同的调用可能看起来像这样

// create the datastore service class
$datastore = new Google\Service\Datastore($client);

// build the query - this maps directly to the JSON
$query = new Google\Service\Datastore\Query([
    'kind' => [
        [
            'name' => 'Book',
        ],
    ],
    'order' => [
        'property' => [
            'name' => 'title',
        ],
        'direction' => 'descending',
    ],
    'limit' => 10,
]);

// build the request and response
$request = new Google\Service\Datastore\RunQueryRequest(['query' => $query]);
$response = $datastore->projects->runQuery('YOUR_DATASET_ID', $request);

然而,由于JSON API的每个属性都有一个对应的生成类,上述代码也可以写成这样

// create the datastore service class
$datastore = new Google\Service\Datastore($client);

// build the query
$request = new Google\Service\Datastore_RunQueryRequest();
$query = new Google\Service\Datastore\Query();
//   - set the order
$order = new Google\Service\Datastore_PropertyOrder();
$order->setDirection('descending');
$property = new Google\Service\Datastore\PropertyReference();
$property->setName('title');
$order->setProperty($property);
$query->setOrder([$order]);
//   - set the kinds
$kind = new Google\Service\Datastore\KindExpression();
$kind->setName('Book');
$query->setKinds([$kind]);
//   - set the limit
$query->setLimit(10);

// add the query to the request and make the request
$request->setQuery($query);
$response = $datastore->projects->runQuery('YOUR_DATASET_ID', $request);

使用哪种方法取决于个人喜好,但如果不先理解API的JSON语法,将很难使用这个库,因此建议在使用这里的任何服务之前查看APIs Explorer

直接发送HTTP请求

如果希望外部应用程序使用Google身份验证,或者该库中尚未提供Google API,可以直接发送HTTP请求。

如果您仅安装此客户端以验证自己的HTTP客户端请求,请使用google/auth

authorize方法返回一个授权的Guzzle客户端,因此使用该客户端发出的任何请求都将包含相应的授权。

// create the Google client
$client = new Google\Client();

/**
 * Set your method for authentication. Depending on the API, This could be
 * directly with an access token, API key, or (recommended) using
 * Application Default Credentials.
 */
$client->useApplicationDefaultCredentials();
$client->addScope(Google\Service\Plus::PLUS_ME);

// returns a Guzzle HTTP Client
$httpClient = $client->authorize();

// make an HTTP request
$response = $httpClient->get('https://www.googleapis.com/plus/v1/people/me');

缓存

建议使用另一个缓存库来提高性能。这可以通过向客户端传递一个PSR-6兼容的库来实现

use League\Flysystem\Adapter\Local;
use League\Flysystem\Filesystem;
use Cache\Adapter\Filesystem\FilesystemCachePool;

$filesystemAdapter = new Local(__DIR__.'/');
$filesystem        = new Filesystem($filesystemAdapter);

$cache = new FilesystemCachePool($filesystem);
$client->setCache($cache);

在这个例子中,我们使用PHP Cache。使用composer将此添加到您的项目中

composer require cache/filesystem-adapter

更新令牌

当使用刷新令牌服务账户凭据时,当授予新的访问令牌时执行某些操作可能很有用。为此,将可调用的参数传递给客户端上的setTokenCallback方法

$logger = new Monolog\Logger();
$tokenCallback = function ($cacheKey, $accessToken) use ($logger) {
  $logger->debug(sprintf('new access token received at cache key %s', $cacheKey));
};
$client->setTokenCallback($tokenCallback);

使用Charles调试您的HTTP请求

通过查看原始HTTP请求来调试API调用通常非常有用。此库支持使用Charles Web Proxy。下载并运行Charles,然后使用以下代码通过Charles捕获所有HTTP流量

// FOR DEBUGGING ONLY
$httpClient = new GuzzleHttp\Client([
    'proxy' => 'localhost:8888', // by default, Charles runs on localhost port 8888
    'verify' => false, // otherwise HTTPS requests will fail.
]);

$client = new Google\Client();
$client->setHttpClient($httpClient);

现在,此库发出的所有调用都将出现在Charles UI中。

在Charles中查看SSL请求需要执行一个额外的步骤。转到Charles > 代理 > SSL代理设置,并添加您想捕获的域名。对于Google API,这通常是*.googleapis.com

直接控制HTTP客户端配置

Google API客户端使用Guzzle作为其默认的HTTP客户端。这意味着您可以像任何使用Guzzle的应用程序一样控制您的HTTP请求。

比如说,我们希望为每个请求应用一个引用。

use GuzzleHttp\Client;

$httpClient = new Client([
    'headers' => [
        'referer' => 'mysite.com'
    ]
]);

$client = new Google\Client();
$client->setHttpClient($httpClient);

其他Guzzle功能,如处理程序和中间件,提供了更多的控制。

部分同意和已授权限的范围

当使用OAuth2 3LO(例如,您是客户端,从第三方(如简单文件上传示例)请求凭据时),您可能想利用部分同意。

为了允许客户端在OAuth2屏幕上仅授予某些范围,在生成授权URL时传递enable_serial_consent的查询字符串参数

$authUrl = $client->createAuthUrl($scope, ['enable_serial_consent' => 'true']);

流程完成后,您可以通过在OAuth2对象上调用getGrantedScope来查看已授予的范围

// Space-separated string of granted scopes if it exists, otherwise null.
echo $client->getOAuth2Service()->getGrantedScope();

服务特定示例

YouTube: https://github.com/youtube/api-samples/tree/master/php

如何贡献代码?

请参阅贡献页面以获取更多信息。特别是,我们非常喜欢拉取请求,但请确保您已签署贡献者许可协议。

常见问题

如果出现问题无法正常运行怎么办?

对于库的支持,最佳提问方式是通过StackOverflow上的google-api-php-client标签: https://stackoverflow.com/questions/tagged/google-api-php-client

如果库中存在特定错误,请在GitHub问题跟踪器中提交问题,包括失败的代码示例和任何特定的错误信息。功能请求也可以提交,只要它们是核心库请求,而不是特定于API的:对于这些,请参考各个API的文档以确定最佳提交请求的位置。请尽量提供清晰的问题说明,说明该功能将解决什么问题。

我想看X的示例!

如果X是库的功能,请忽略!如果X是使用特定服务的示例,最佳去处是那些特定API的团队 - 我们更倾向于链接到他们的示例,而不是将它们添加到库中,因为这样他们可以针对库的特定版本进行链接。如果您有其他API的示例,请告诉我们,我们将很高兴在上面的README中添加链接!

为什么一些Google\Service类的名字很奇怪?

Google\Service类通常是从API发现文档自动生成的: https://developers.google.com/discovery/。有时API中会添加一些具有不寻常名称的新功能,这可能导致PHP类中出现一些意外的或非标准化的命名风格。

如何处理非JSON响应类型?

一些服务默认返回XML或类似内容,而不是JSON,而库支持的是JSON。您可以通过在方法调用的最后参数添加一个'alt'参数来请求JSON响应

$opt_params = array(
  'alt' => "json"
);

如何设置字段为null?

库会从发送到Google API的对象中删除null,因为所有未初始化属性默认值都是null。为了解决这个问题,将您想要设置为null的字段设置为Google\Model::NULL_VALUE。这是一个占位符,在通过网络发送时会替换为真正的null。

代码质量

使用PHPUnit运行PHPUnit测试。您可以在BaseTest.php中配置API密钥和令牌以运行所有调用,但这需要在Google开发者控制台中进行一些设置。

phpunit tests/

编码风格

要检查编码风格违规,运行

vendor/bin/phpcs src --standard=style/ruleset.xml -np

要自动修复(可修复的)编码风格违规,运行

vendor/bin/phpcbf src --standard=style/ruleset.xml