gpt4 book ai didi

java - 通过 java 访问谷歌日历

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:29 26 4
gpt4 key购买 nike

我有一个使用谷歌日历的家庭集成项目......好吧,它正在运行。我已经使用它至少 6 个月,也许一年,我忘记了。谷歌突然更改了规则,我现在不知道如何让事情正常进行。

我不想使用整个库来完成我需要做的极其基本的操作。我的 Tomcat 应用程序中不需要一堆额外的库。

这是用于发布新日历事件并取回 ID 的完整代码示例,以便我们稍后可以在需要更新等时删除它。

我现在只收到 403 错误,用户/密码没问题,我可以获得我的身份验证 token ,我也可以使用浏览器登录,我做了验证码解锁页面等。它只是在 11/停止工作18/2014。它在 2014 年 11 月 17 日工作。

错误:java.io.IOException:服务器返回 HTTP 响应代码:403 URL:https://www.google.com/calendar/feeds/myuser@gmail.com/private/full

帮助? urlc.getInputStream() 抛出异常。

我也很乐意使用 OAuth2,但我无法克服所有文档指示使用库的方面,以及将向用户显示要接受的 google 页面。他们不可能……他们不与此互动。这是一个构建日历事件的自动化服务器端应用程序。没有用户存在或 Web 浏览器。所以我不知道该怎么办...他们有服务帐户项目,我下载了我的私钥,但我看不到他们告诉您应该如何使用私钥做什么...

我也很乐意做 CalDAV,但同样,OAuth 使我无法继续。 登录后,我对技术方面没有任何问题,但我无法理解谷歌的登录架构,无法做到这一点。

--本

                            HttpURLConnection urlc = (HttpURLConnection)new URL("https://www.google.com/calendar/feeds/myuser@gmail.com/private/full").openConnection();
urlc.setDoOutput(true);
urlc.setFollowRedirects(false);
urlc.setRequestMethod("POST");
urlc.setRequestProperty("Content-Type", "application/atom+xml");
urlc.setRequestProperty("Authorization", "GoogleLogin auth=" + authToken);

OutputStream out = urlc.getOutputStream();
out.write(b);
out.close();

int code = urlc.getResponseCode();

String location = "";
for (int x=0; x<10; x++)
{
System.out.println(x+":"+urlc.getHeaderFieldKey(x)+":"+urlc.getHeaderField(x));
if (urlc.getHeaderFieldKey(x) != null && urlc.getHeaderFieldKey(x).equalsIgnoreCase("Location")) location = urlc.getHeaderField(x);
}
String result = consumeResponse(urlc.getInputStream());
System.out.println(result);
urlc.disconnect();

urlc = (HttpURLConnection)new URL(location).openConnection();
urlc.setDoOutput(true);
urlc.setFollowRedirects(false);
urlc.setRequestMethod("POST");
urlc.setRequestProperty("Content-Type", "application/atom+xml");
urlc.setRequestProperty("Authorization", "GoogleLogin auth=" + authToken);
out = urlc.getOutputStream();
out.write(b);
out.close();

code = urlc.getResponseCode();
result = consumeResponse(urlc.getInputStream());
System.out.println("Raw result:"+result);
gcal_id = result.substring(result.indexOf("gCal:uid value='")+"gCal:uid value='".length());
gcal_id = gcal_id.substring(0,gcal_id.indexOf("@google.com"));
System.out.println("Calendar ID:"+gcal_id);

最佳答案

所以我部分地回答了我自己的问题......

“解决方案”是有一个刷新 token 。这可以离线使用以按需获取新的访问 token ,有效期约为 1 小时。您将刷新 token 提交给:ht tps://account s。 go ogle .c om/o/oauth2/token 它会给你一个“Bearer”访问 token ,供下一个小时使用。

不过,要获取刷新 token ,您需要转到浏览器中的 URL 以获得访问权限,并且您允许的重定向 URL 必须配置为您要“重定向”到的位置。它可以是无效的东西,只要你能得到它会给你的“代码”参数。您将需要此代码才能获取刷新 token 。

在您的开发者控制台中配置允许的重定向 URL。找到您自己的开发控制台链接。我显然没有要点告诉你。

要转到的示例 URL 如下所示:

https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar&state=&redirect_uri=url_encoded_url_to_redirect_to_that_is_in_developer_console&response_type=code&client_id=some_google_randomized_id.apps.googleusercontent.com&access_type=offline&approval_prompt=force

所有这些信息都来自:

https://developers.google.com/accounts/docs/OAuth2WebServer#refresh

有了所有这一切,您现在可以直接执行正常的日历 API 调用并传入 Bearer 授权 header 。

所以总的来说,你需要 0 个谷歌库来完成所有这些,它们只会让你很难了解真正发生的事情。即使在谷歌页面上,也有一半的“例子”引用了无效的东西。大多数人花费了示例的大部分时间来告诉您如何重新配置​​您的 eclipse 来执行该示例...

另一个副作用是这也需要日历条目的 json 格式,而不是 gcal 使用的以前的 XML 样式。算不上缺点,只是一个改变。

直到明年一切再次破裂......

关于java - 通过 java 访问谷歌日历,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27043409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com