通过java访问Google日历

时间:2014-11-20 15:33:37

标签: java calendar oauth-2.0 google-login caldav

我有一个与谷歌日历合作的家庭综合项目......好吧,它正在运作。我已经使用它至少6个月,也许一年,我忘了。突然谷歌改变了规则,我现在无法弄清楚如何让事情发挥作用。

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

以下是用于发布新日历事件的完整代码示例,并返回ID,以便我们以后可以删除它,如果我们想要更新等等。

我现在只收到403错误,用户/通行证还可以,我可以获得我的身份验证令牌,我也可以使用浏览器登录,我可以使用验证码解锁页面等等。它只是停止工作11 /二千零十四分之十八。它工作于11/17/2014。

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

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

我也很乐意使用OAuth2,但我无法克服所有文档指示使用库的方面,并且将向用户显示要接受的Google页面。他们无法......他们不与此互动。这是一个构建日历事件的自动服务器端应用程序。没有用户在场或网络浏览器。所以我不知道该做什么...他们有服务帐户项目,我下载了我的私钥,但我看不到他们告诉你你应该用私钥做什么... < / p>

我也很乐意做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);

2 个答案:

答案 0 :(得分:1)

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

“解决方案”正在使用刷新令牌。这可以离线使用,以获得大约1小时的新访问令牌。您将刷新令牌提交到:ht tps:// account s。 go ogle .c om / o / oauth2 / token它会返回一个“Bearer”访问令牌,用于下一个小时。

要获取刷新令牌,您需要转到浏览器中的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授权标头。

所以总的来说,你需要完全由0个谷歌库来完成所有这些,他们只是让你很难了解到真正发生的事情。甚至谷歌页面上的一半“例子”都引用了无效的东西。大多数人都花了大部分的例子来告诉你如何重新配置​​你的eclipse做例子......

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

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

答案 1 :(得分:0)

https://apidata.googleusercontent.com/caldav/v2/calid/user

其中calid应替换为&#34;日历ID&#34;要访问的日历。这可以通过Google日历网络界面找到,如下所示:在日历名称旁边的下拉菜单中,选择日历设置。在结果页面上,日历ID显示在标有日历地址的部分中。用户的主日历的日历ID与该用户的电子邮件地址相同。

请参阅以下链接: - https://developers.google.com/google-apps/calendar/caldav/v2/guide