首页 > 解决方案 > Google Drive API 通知 - 文件监视未发送添加通知 - 可能的原因?

问题描述

我刚刚设置了 Google Drive API 更改通知,指定了folderId我的驱动器上的某个共享文件夹。如果我更改文件夹名称,它会发送通知,但如果我添加文件,它不会发送通知。

我成功设置了频道,就像发出这些 PHP 命令一样

    $client = new Google_Client();
    $client->setApplicationName('Some Name');
    $client->setAuthConfig( __DIR__  . '/service_account.json');
    $client->setScopes(Google_Service_Drive::DRIVE);
    $client->fetchAccessTokenWithAssertion();
    $token = $client->getAccessToken();
    $service = new Google\Service\Drive($client);
    $httpclient = new \GuzzleHttp\Client();
    $folderid = $someid;
    $body = [
        'kind' => "api#channel",
        'id' => uniqid(),
        'type' => 'web_hook',
        'resourceId' => $folderid,
        'resourceUri' => 'https://www.googleapis.com/drive/v3/files/'.$folderid,
        'address' => 'myendpoint'
    ];

    $apiendpoint = 'https://www.googleapis.com/drive/v3/files/' . $folderid . '/watch';
    $result = $httpclient->post($apiendpoint, [
        'headers' => ['Content-Type' => 'application/json', 'Authorization' => "Bearer {$token['access_token']}"],
        'body' => json_encode($body),
        "http_errors" => false]);

我看到成功返回,我的频道立即向sync我的端点发送一条消息,在那里我有这个

function myendpoint (WP_REST_Request $request) {
    $headers= getallheaders();
    write_log('in google drive webhook with headers '.print_r($headers, true));
    $body = $request->get_body();
    write_log('in google drive webhook with body '.print_r($body, true));
    global $wpdb;
    return http_response_code(200);
}

通过我的日志,我看到

[07-Nov-2021 12:52:35 UTC] in google drive webhook with headers Array
(
    [Host] => courses-test.com
    [User-Agent] => APIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html)
    [Content-Length] => 0
    [Accept] => */*
    [Accept-Encoding] => gzip, deflate, br
    [X-Forwarded-For] => 66.102.8.121
    [X-Forwarded-Proto] => https
    [X-Goog-Channel-Expiration] => Sun, 07 Nov 2021 13:51:26 GMT
    [X-Goog-Channel-Id] => 6187cbc82a08e
    [X-Goog-Message-Number] => 1
    [X-Goog-Resource-Id] => resid
    [X-Goog-Resource-State] => sync
    [X-Goog-Resource-Uri] => https://www.googleapis.com/drive/v3/files/folderid?acknowledgeAbuse=false&supportsAllDrives=false&supportsTeamDrives=false&alt=json
    [X-Original-Host] => mydomain
)

我在这里读到

https://developers.google.com/drive/api/v3/push

它说的地方

“要表示成功,您可以返回以下任何状态码:200、201、202、204 或 102。”

因此我要回来了return http_response_code(200);

并在这里阅读

https://developers.google.com/drive/api/v3/reference/files/watch

我没有看到任何明显的事情发生在这里。

这里

https://developers.google.com/search/docs/advanced/crawling/apis-user-agent?visit_id=637718909398077288-2640249237&rd=1

有这句话

“通过确保您的应用程序设计良好并迅速响应通知消息(在几秒钟内),避免不必要的重试请求。”

现在,当我第一次设置通道时,我的端点立即返回,所以这似乎否定了上述观点。

另外,在我设置好频道后,我也会运行这些行

        $optParams = array(
            'pageSize' => 10,
            'fields' => 'nextPageToken, files(id, name)'
        );
        $results = $service->files->listFiles($optParams);

并且确实看到了文件列表。

所以我真的很茫然。当我进入folderId我指定设置观看频道、添加文件或编辑文件的文件夹时,我没有收到任何通知。有问题的文件夹是共享的,但据我了解,共享只会在处理共享驱动器时成为问题,这不是我的情况。

我在这里读到,

https://developers.google.com/drive/api/v3/push#understanding-drive-api-notification-events

当文件是文件夹时,监视正在添加的文件确实应该在文件监视上工作,因为add它是资源的事件之一,它适用于Files.


**更新: 好的,我似乎有工作,但不是基于add事件。我唯一改变的是,我没有使用 Guzzle 进行 POST,如上所示,我使用了这个

    $channel->setId(uniqid());
    $channel->setAddress($body['address']);
    $channel->setType('web_hook');
    $test = $service->files->watch($folderid, $channel);

$body当我通过 Guzzle 使用 POST 时,可能在类似kind,中添加一些额外的参数resourceId会搞砸事情。或者现在我知道resourceId与 不一样folderid,也许这会在谷歌的一端抛出一个标志,以便发送有限数量的通知。无论如何,只使用id',address似乎type是要走的路,我认为这是在 Google Drive Push 文档中。只是在那些文档中,还提到在请求中添加其他参数,例如“resourceId”。我怀疑如果我重做使用 Guzzle,但指定正确resourceId,或者只是将其保留并使用id', addressand type,它会起作用。

所以现在,当我添加文件时,我在端点中得到了这种标题:

(
    [Host] => courses-test.com
    [User-Agent] => APIs-Google; (+https://developers.google.com/webmasters/APIs-Google.html)
    [Content-Length] => 0
    [Accept] => */*
    [Accept-Encoding] => gzip, deflate, br
    [X-Forwarded-For] => someip
    [X-Forwarded-Proto] => https
    [X-Goog-Changed] => children
    [X-Goog-Channel-Expiration] => Mon, 08 Nov 2021 09:46:10 GMT
    [X-Goog-Channel-Id] => chanid
    [X-Goog-Message-Number] => num
    [X-Goog-Resource-Id] => someid
    [X-Goog-Resource-State] => update
    [X-Goog-Resource-Uri] => https://www.googleapis.com/drive/v3/files/folderid?acknowledgeAbuse=false&supportsAllDrives=false&supportsTeamDrives=false&alt=json
    [X-Original-Host] => mydomain
)

所以我可以检测到[X-Goog-Changed]children跟踪我当前上传的文件并查看新文件是什么。或者也许以fields某种方式使用查询字符串我可以直接获取新文件ID?

获取有关新文件的信息是如此痛苦,这似乎仍然很奇怪。也许在谷歌云 API 中更容易,谷歌希望更多的人注册云。事实上,该add事件似乎只适用于 Cloud buckets

标签: google-drive-api

解决方案


简而言之:在观看文件夹时files().watch(),当前无法接收有关添加到此文件夹的新文件的通知

您可以在类似问题的答案中找到几种解决方法以及解释:

另外:谷歌的问题跟踪器上有一个相关的功能请求。

它因不活动而关闭,但值得“主演”并对其进行评论以提高知名度。


推荐阅读