我正在尝试创建频道,以便在Google电子表格上进行修改时接收推送通知。代码将在App Engine Standard Java8项目上执行。
因为一个频道最长可以持续24小时,所以我创建了一个每天都会更新频道的cron。
这是我的配置:
xxxx@yyyy.iam.gserviceaccount.com
yyyy.appspot.com
(Webmaster Tools
)API & Services -> Domain Verification
部分)https://yyyy.appspot.com/api/drive/push
foo_bar
(由电子表格浏览器网址复制,如https://docs.google.com/spreadsheets/d/foo_bar/edit
)Can Edit
使用Java库google-api-services-drive:v3-rev102-1.23.0
我创建了这段代码
public static void main(String[] args) throws IOException {
String spreadsheetId = "foo_bar";
InputStream json = GoogleDriveApi.class.getClassLoader().getResourceAsStream("bar.json");
GoogleCredential credential = GoogleCredential.fromStream(json, new NetHttpTransport(), new JacksonFactory());
if (credential.createScopedRequired()) {
credential = credential.createScoped(Collections.singleton("https://www.googleapis.com/auth/drive.appdata"));
}
Drive service = new Drive.Builder(new NetHttpTransport(), new JacksonFactory(), credential).build();
Channel channel = new Channel();
channel.setAddress("https://example.com/api/drive/push");
channel.setType("web_hook");
channel.setId(UUID.randomUUID().toString());
Watch action = service.files().watch(spreadsheetId, channel);
System.out.println(action.execute().toPrettyString());
}
当我执行此代码时,我收到此错误:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 404 Not Found
{
"code" : 404,
"errors" : [ {
"domain" : "global",
"location" : "fileId",
"locationType" : "parameter",
"message" : "File not found: foo_bar.",
"reason" : "notFound"
} ],
"message" : "File not found: foo_bar."
}
来自documentation我引用
每个通知渠道都与特定用户相关联 和特定资源(或资源集)。观看请求会 除非当前用户或服务帐户拥有或,否则不会成功 有权访问此资源。
在我的情况下,服务帐户不会拥有资源(电子表格),但确实拥有该权限(Can Edit
权限,仅限Can View
)
是否可以使用服务帐户在Google云端硬盘上创建频道?
答案 0 :(得分:1)
file.watch
API需要insert
范围,在我仅使用https://www.googleapis.com/auth/drive
的主要示例中
使用以下行,该示例正常工作
https://www.googleapis.com/auth/drive.appdata