簡體   English   中英

通過java訪問Google日歷

[英]Google calendar access via java

我有一個與谷歌日歷一起工作的家庭綜合項目......好吧,它正在運作。 我已經使用它至少6個月,也許一年,我忘了。 突然谷歌改變了規則,我現在無法弄清楚如何讓事情發揮作用。

我不想使用整個庫來完成我需要做的極其基本的操作。 我的Tomcat應用程序中不需要一堆額外的庫。

以下是用於發布新日歷事件的完整代碼示例,並返回ID,以便我們以后可以刪除它,如果我們想要更新等。

我現在只收到403錯誤,用戶/通行證還可以,我可以獲得我的身份驗證令牌,我也可以使用瀏覽器登錄,我也可以使用驗證碼解鎖頁面等等。它剛剛停止工作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頁面。 他們不能......他們不與此互動。 這是一個構建日歷事件的自動服務器端應用程序。 沒有用戶在場或網絡瀏覽器。 所以我不知道該做什么...他們有服務帳戶項目,我下載了我的私鑰,但我看不到他們告訴你你應該用私鑰做什么...

我也很樂意做CalDAV,但是再一次,OAuth阻止我繼續進行。 登錄我對技術方面沒有任何問題,但我無法理解谷歌的登錄架構,以便更進一步。

--Ben

                            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);

所以我部分回答了我自己的問題......

“解決方案”具有刷新令牌。 這可以離線使用,以獲得大約1小時的新訪問令牌。 您將刷新令牌提交到:ht tps:// account s。 go ogle .c om / o / oauth2 / token它會返回一個“Bearer”訪問令牌,用於下一個小時。

要獲取刷新令牌,您需要轉到瀏覽器中的URL以獲取訪問權限,並且必須將允許的重定向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=力

所有這些信息都來自:

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

因此,通過所有這些,您現在可以直接執行常規日歷API調用並傳入Bearer授權標頭。

總而言之,你需要完全由0個谷歌庫來完成所有這些,他們只是讓你很難了解真正發生的事情。 甚至谷歌頁面上的一半“例子”都引用了無效的東西。 大多數人都花了大部分的例子來告訴你如何重新配置​​你的eclipse做例子......

另一個副作用是這也需要日歷條目的json格式,而不是gcal使用的以前的XML格式。 不是真正的缺點,只是改變。

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

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

其中calid應替換為要訪問的日歷的“日歷ID”。 這可以通過Google日歷網絡界面找到,如下所示:在日歷名稱旁邊的下拉菜單中,選擇日歷設置。 在結果頁面上,日歷ID顯示在標有日歷地址的部分中。 用戶主日歷的日歷ID與該用戶的電子郵件地址相同。

請參閱以下鏈接: - https://developers.google.com/google-apps/calendar/caldav/v2/guide

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM