2023年2月2日

2023 使用 Google 新版 API 取得使用者個人資訊﹍實作範例

2023 使用 Google 新版 API 取得使用者個人資訊﹍實作範例

Wayne Fu 0 A+
之前寫的「使用 Google People API 取得使用者生日、性別等多種個人資訊」,因為「Google 更新登入 API 及相關模組」,官方公告在 2023/3/31 舊版程式碼會失效,連帶也使能夠取得 Google 帳號個人資訊的 People API 必須更新程式碼。 由於變動相當大,例如原本使用的 gapi.auth2 模組將被 google.accounts.oauth2 模組取代,載入 API 的方式也差別很大,詳情可參考官網文件「網站適用的 Google 第三方 JavaScript 程式庫」。直接更新上一篇原文可能會造成相當大的混亂,乾脆重新寫一篇。因此關於 Google People API 的介紹、測試方法請看上一篇,本篇直接提供新版操作流程及範例程式碼。 (圖片出處: pixabay.com)

一、準備動作

操作 API 之前需要先建立 Google API 專案,如果還沒建立過的話,請完成以下流程:

二、程式碼範例

以下使用「Bootstrap 按鈕」、jQuery 處理點擊按鈕,作為範例程式碼: <!--jQuery--> <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> <!--Bootstrap--> <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" /> <!--登入、登出按鈕--> <button id="google_login" class="btn btn-large btn-primary">GOOGLE 登入</button> <button id="google_logout" class="btn btn-large btn-warning">GOOGLE 登出</button> <p /> <p>目前狀態:</p> <div id="persoanl_info">尚未授權</div> <script> var client_id = "5432xxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com", apiKey = "AIzaxxxxxxxxxxxxxxxxxxxxxx", scope = "https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/user.gender.read https://www.googleapis.com/auth/user.birthday.read", personFields = "names,emailAddresses,photos,genders,birthdays", discovery_doc = "https://www.googleapis.com/discovery/v1/apis/people/v1/rest", resourceName = "people/me", $persoanl_info = $("#persoanl_info"), tokenClient; loadApi(); // 載入 google api function loadApi() { // 載入 gapi $.getScript("https://apis.google.com/js/api.js", function() { gapi.load("client", function() { gapi.client.init({ apiKey: apiKey, discoveryDocs: [discovery_doc], }); }); }); // 載入 gsi $.getScript("https://accounts.google.com/gsi/client", function() { tokenClient = google.accounts.oauth2.initTokenClient({ client_id: client_id, scope: scope, callback: signIn_callback, error_callback: error_callback }); }); // 登入後 callback function signIn_callback(res) { // 登入失敗時 if (res.error !== undefined) { console.log(res.error); $persoanl_info.html(res.error); } // 登入成功後 if (res && res.access_token) { // 顯示帳號資訊 listAccountInfo(); } } // 捕捉非 OAuth 錯誤 或是在傳回 OAuth 回應前遭到關閉 function error_callback(res) { console.log(res); $persoanl_info.html(res.message); } // 顯示帳號資訊 function listAccountInfo() { // 呼叫 people api 取得資料 gapi.client.people.people.get({ "resourceName": resourceName, "personFields": personFields, }).then(function(res) { // 顯示資料 var result = res.result, errorMessage = "請重新登入, 並勾選生日及性別!", html = "", id, name, imgUrl, email, gender, birthday, birthdayStr; // 沒有勾選生日、性別時 if (!result.genders || !result.birthdays) { alert(errorMessage); $persoanl_info.html(errorMessage); return; } id = result.resourceName.split("/")[1]; name = result.names[0].displayName; imgUrl = result.photos[0].url; email = result.emailAddresses[0].value; gender = result.genders[0].formattedValue; birthday = result.birthdays[1].date; birthdayStr = birthday.year + "-" + birthday.month + "-" + birthday.day; html += "ID: " + id + "<br/>"; html += "暱稱: " + name + "<br/>"; html += "頭像:<img style='width: 40 px;' src='" + imgUrl + "'/><br/>"; html += "email:" + email + "<br/>"; html += "性別:" + gender + "<br/>"; html += "生日:" + birthdayStr + "<br/>"; $persoanl_info.html(html); }); } } // 點擊登入按鈕 $("#google_login").click(function() { // 進動畫 $persoanl_info.html("<img src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgATuJvkpy3TyBQtXW_JJ59fpiTcu6m9jkBoXtHXpCwpiiOqDdLSLIP2VkH56AQHEg_JubYb6aueZcHrVC-1muR1XwNF3Fxkt_fbNxdMtl6TiakzPHvqPlXefdZMOu2u9IzU6-a-X8So4ok/s512/indicator-light.gif' /> <span>請稍後...</span>"); if (gapi.client.getToken() === null) { // 未登入則彈出登入視窗 tokenClient.requestAccessToken(); } else { // 已登入則不彈出視窗 tokenClient.requestAccessToken({ prompt: "" }); } }); // 點擊登出按鈕 $("#google_logout").click(function() { var token = gapi.client.getToken(); if (token !== null) { google.accounts.oauth2.revoke(token.access_token); gapi.client.setToken(""); // 登出後的動作 $persoanl_info.html("已登出"); } }); </script> 紅字字串參數請特別注意以下說明:
  • client_id:請置換為前面「處理 OAuth 憑證」流程取得的「用戶端 ID」
  • apiKey:請置換為前面「取得 Google API 金鑰流程」取得的「API 金鑰」字串
  • scope:請參考上一篇「一、People API 說明」填入需要的 scope 授權,每個網址字串用空格隔開
  • personFields:請參考上一篇「一、People API 說明」填入想取得的個人資料項目,每個項目用小寫逗號隔開
  • 範例程式碼請放在前面「處理 OAuth 憑證」流程設定的網站才能執行

三、DEMO 效果展示

以下為範例程式碼的執行效果,可進行操作並注意對應狀態的顯示資訊:
目前狀態:
尚未授權
更多 Google 相關文章:
0 0
如這篇文章對你有幫助,歡迎「分享」到 FB、「追蹤」粉絲團、「訂閱」最新文章

6 則留言:

  1. 請問要如何判斷是否已登入google帳戶?如果已登入如何取得資訊

    回覆刪除
  2. 可參考 https://www.wfublog.com/2023/01/google-identity-sign-in-api.html

    回覆刪除
  3. 大大您好
    文中的"並啟用「People API」"
    請問是誤打的嗎?
    我點選"取得 Google API 金鑰流程"文章後
    第二點是"啟用 Google API 服務"

    回覆刪除
    回覆
    1. 你沒啟用「People API」的話,根本無法執行本篇程式碼
      請仔細閱讀「取得 Google API 金鑰流程」→「一、建立專案」,這裡要看的是「一、建立專案」,不是你說的第二點「啟用 Google API 服務」,你看錯地方了。

      刪除
  4. 版主您好,我copy您上述的程式碼做測試,再要登入的時候console.log卻噴出『Cross-Origin-Opener-Policy policy would block the window.closed call』,不曉得版主有沒有遇到相關問題呢?
    https://drive.google.com/file/d/1AYVVPE_qrYKyLlzGLYpp0s-BJbEZa6b5/view?usp=drivesdk

    回覆刪除
    回覆
    1. 本頁面「三、DEMO 效果展示」可自行測試程式碼效果,我剛測試沒什麼問題。

      既然你會用console.log除錯,可以自行檢測是在哪個環節出錯,來找出你的網頁有什麼因素干擾到程式運作。

      另外就是把你報錯得到的那些字串拿去 google,看看網路上是怎麼解決的。

      刪除

張貼留言注意事項:

◎ 勾選「通知我」可收到後續回覆的mail!
◎ 請在相關文章留言,與文章無關的主題可至「Blogger 社團」提問。
◎ 請避免使用 Safari 瀏覽器,否則無法登入 Google 帳號留言(只能匿名留言)!
◎ 提問若無法提供足夠的資訊供判斷,可能會被無視。建議先參考這篇「Blogger 提問技巧及注意事項」。
◎ CSS 相關問題非免費諮詢,建議使用「Chrome 開發人員工具」尋找答案。
◎ 手機版相關問題請參考「Blogger 行動版範本的特質」→「三、行動版範本不一定能執行網頁版工具」;或參考「Blogger 行動版範本修改技巧 」,或本站 Blogger 行動版標籤相關文章。
◎ 非官方範本問題、或貴站為商業網站,請參考「Blogger 免費諮詢 + 付費諮詢
◎ 若是使用官方 RWD 範本,請參考「Blogger 推出全新自適應 RWD 官方範本及佈景主題」→ 不建議對範本進行修改!
◎ 若留言要輸入語法,"<"、">"這兩個符號請用其他符號代替,否則語法會消失!
◎ 為了過濾垃圾留言,所有留言不會即時發佈,請稍待片刻。
◎ 本站「已關閉自刪留言功能」。

TOP