google-drive-api - 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
我没有看到任何明显的事情发生在这里。
这里
有这句话
“通过确保您的应用程序设计良好并迅速响应通知消息(在几秒钟内),避免不必要的重试请求。”
现在,当我第一次设置通道时,我的端点立即返回,所以这似乎否定了上述观点。
另外,在我设置好频道后,我也会运行这些行
$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
', address
and 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
。
解决方案
简而言之:在观看文件夹时files().watch()
,当前无法接收有关添加到此文件夹的新文件的通知
您可以在类似问题的答案中找到几种解决方法以及解释:
使用
changes().watch()
:https://stackoverflow.com/a/26551651/11599789和https://stackoverflow.com/a/67787626/11599789
将 folderId 传递给令牌:
复制所有文件的元数据并查询更改:
另外:谷歌的问题跟踪器上有一个相关的功能请求。
它因不活动而关闭,但值得“主演”并对其进行评论以提高知名度。
推荐阅读
- excel - Excel:如果单元格有空格,则在第一个空格之前提取单元格中的字符
- php - 得到 null 作为响应,但数据正在插入数据库
- javascript - 如何在不将页面重新加载到新 url 的情况下完全更改 url?
- csv - 使用 bq 将 CSV 加载到 Bigquery
- revit-api - 从 Revit 中的 BuiltIn Parameter ElementId 获取 BuiltInParameterId
- python - 如何在 Django 中自定义related_name 参数
- hmail-server - 在 hMailServer 上运行诊断时出现 MXRecord 错误
- c# - 使用 CreateSwapChainForComposition 创建交换链时出现异常
- url-rewriting - 如何排除 urlrewriterules.xml 和 domainplittings.xml 被复制到 serverDeploy 任务上的配置目录
- rabbitmq - RabbitMQ - 处理不可靠的服务