【问题标题】:Google contacts API using angularjs使用 angularjs 的 Google 联系人 API
【发布时间】:2014-11-05 10:38:09
【问题描述】:

我正在尝试获取用户的 Google 联系人。我正在使用this 代码来实现auth2。

这是我的 services.js

**Services.js** : ....
.service('googleService', ['$http', '$rootScope', '$q', function ($http, $rootScope, $q) {
var clientId = 'MY_CLIENT_ID',
apiKey = 'MY_API_KEY',
scopes = 'https://www.googleapis.com/auth/userinfo.email https://www.google.com/m8/feeds/contacts/default/full',
domain = '{OPTIONAL DOMAIN}',
deferred = $q.defer();

this.login = function () {
    console.log("Inside login()");
    gapi.auth.authorize({ 
        client_id: clientId, 
        scope: scopes, 
        immediate: false,
        approval_prompt: "force"
    }, this.handleAuthResult);
    return deferred.promise;
}

this.handleClientLoad = function () {
    console.log("Inside handleClientLoad()");
    gapi.client.setApiKey(apiKey);
    gapi.auth.init(function () { });
    window.setTimeout(checkAuth, 1);
};

this.checkAuth = function() {
    console.log("Inside checkAuth()");
    gapi.auth.authorize({ 
        client_id: clientId, 
        scope: scopes, 
        immediate: true, 
    }, this.handleAuthResult);
};

this.handleAuthResult = function(authResult) {
    console.log("Inside handleResult()");
    if (authResult && !authResult.error) {
        var data = [];
        gapi.client.load('oauth2', 'v2', function () {
            var request = gapi.client.oauth2.userinfo.get();
            request.execute(function (resp) {
                data.push(resp.email);
                data.push(authResult.access_token);
                deferred.resolve(data);
            });
        });
        
    } else {
        deferred.reject('error');
    }
};

this.handleAuthClick = function() {
    console.log("Inside handleAuthClick()");
    gapi.auth.authorize({ 
        client_id: clientId, 
        scope: scopes,
        immediate: false,
        approval_prompt: "force"
    }, this.handleAuthResult);
    return false;
};

this.makeContactList = function(root){
    var plist = [];
    var contactsList = root.feed.entry;     
    if (contactsList != null && contactsList.length > 0) {
        for (var i = 0; i < contactsList.length; i++) {
            var contact = contactsList[i];
            var fname = "";
            var l = contact.gd$email;
            var address = null;
            var emailArr = [];
            if (l != null && l.length > 0) {
                var el = l[0];
                if (el != null) {
                    address = el.address;
                }
                if (l.length > 1) {
                    for (var k = 1; k < l.length; k++) {
                        var e = l[k];
                        if (e != null) {
                            emailArr[k - 1] = e.address;
                        }
                    }
                }
            }
            var lname = "";
            var dispName = contact.title.$t;
            if (dispName != null) {
                var sarr = dispName.split(' ');
                if (sarr.length > 0) {
                    if (sarr.length >= 1) {
                        fname = sarr[0];
                    }
                    if (sarr.length >= 2) {
                        for (var k = 1; k < sarr.length; k++) {
                            lname = lname +" "+sarr[k];
                        }
                        lname = lname.trim();
                    }
                }
            }
            var id = contact.id.$t;

            if (address != null && address.length > 0) {
                var p = {
                        firstName : "",
                        lastname : "",
                        email : "",
                        displayName : "",
                        otherEmails : [],
                        id : ""
                }
                p.firstName = fname;
                p.lastName = lname;
                p.email = address;
                p.displayName = dispName;
                p.otherEmails = emailArr;
                p.id = id;
                plist.push(p);
            }
        }
    } else {
        console.log("No contacts were obtained from the feed");
    }
    return plist;
};
this.disconnectUser = function(access_token){
    var revokeUrl = 'https://accounts.google.com/o/oauth2/revoke?token=' +access_token;
    $.ajax({
        type : 'GET',
        url : revokeUrl,
        async : false,
        contentType : "application/json",
        dataType : 'jsonp',
        success : function(nullResponse){
            console.log("Successfully disconnected access_token");
        },
        error : function(e){
            console.log("Failed to isconnect access_token");
            window.location.reload();
        }
    });
}
}]);

和控制器.js

.controller('ContactsController',  ['$scope','$window','$modal','$http', 'ContactsFactory','googleService','ImportFactory','NotifyFactory', function($scope, $window, $modal, $http, ContactsFactory, googleService, ImportFactory, NotifyFactory) {

$scope.login = function () {
    var promise =  googleService.login()
    promise.then(function (data) {
        if(angular.isObject(data) && data[0]!== undefined && data[1]!== undefined){
            console.log(data[0]);
            console.log(data[1]);
            $http.get("https://www.google.com/m8/feeds/contacts/"+data[0]+"/full?alt=json&access_token=" + data[1] + "&max-results=1000&v=3.0")
            .success(function(data, status, headers, config) {
                console.log("In success");
                var contactList = googleService.makeContactList(data);
                var response = MyFactory.post(contactList);
                response.$promise.then(function(data){
                    console.log(data);
                    NotifyFactory.success("Successfully synched with your google contacts!");
                    googleService.disconnectUser(access_token);
                    //$route.reload();
                    window.location.reload();
                });
            })
            .error(function(data, status, headers, config) {
                console.log("In error");
                console.log(data);
                NotifyFactory.error("Something went wrong. Please try again.11111111111");
            });
        }else{
            NotifyFactory.error("Something went wrong. Please try again.2222222222222");
        }
    }
    , function (err) {
        console.log('Failed: ' + err);
        NotifyFactory.error("Something went wrong. Please try again.333333333333");
    });
};

当用户按下“获取联系人”按钮时调用 $scope.login()。 从某种意义上说,这很好用,因为我知道如何获取登录的谷歌帐户的联系人。

当我按下按钮时,会弹出谷歌的登录屏幕。我输入 abc@gmail.com 的密码并按“接受”,然后 googleService.Login() 返回一个空对象并显示错误消息。

然后我再次按下获取联系人按钮,abc@gmail.com 的联系人甚至在我在同意屏幕上按“接受”之前就已获取(我在 auth 中提供了一个额外的参数以每次都强制同意)。我在同意屏幕上按“接受”

我第三次按获取联系人按钮时,在我按接受之前再次获取 abc@gmail.com 的联系人。我将同意屏幕上的电子邮件更改为 xyz@gmail.com 并按接受。

然后我再次按下获取联系人按钮 a 并在同意屏幕上询问 abc@gmail.com 的 concnt 而不是 xyz@gmail.com,我将其更改为 xyz@gmail.com。在所有后续按下“获取联系人”按钮时,仍会获取 abc@gmail.com 的联系人。

我真的不明白服务中的控制跟随,也不明白为什么我的“获取联系人”的事情正在做疯狂的事情。请帮帮我。

【问题讨论】:

    标签: javascript arrays angularjs google-api google-contacts-api


    【解决方案1】:

    我不知道这是否能解决您的所有错误,但我很确定您应该在将数据添加到您的数据数组后,在您的 request.executes 成功处理程序中调用 deferred.resolve(data);

    this.handleAuthResult = function(authResult) {
        console.log("Inside handleResult()");
        if (authResult && !authResult.error) {
            var data = [];
            gapi.client.load('oauth2', 'v2', function () {
                var request = gapi.client.oauth2.userinfo.get();
                request.execute(function (resp) {
                    data.push(resp.email);
                    data.push(authResult.access_token);
                    deferred.resolve(data);
                });
            });
        } else {
            deferred.reject('error');
        }
    };
    

    否则,当用户登录但数据数组仍然为空时,您的登录承诺会继续,这会导致错误。

    【讨论】:

    • 谢谢,解决了第一次尝试报错的问题。在随后的尝试中,在我按下同意屏幕上的“接受”按钮之前,正在获取联系人。
    • 我认为访问令牌没有被清除。并且谷歌服务获取联系人,因为有一个有效的令牌。
    • 在获取联系人后尝试撤销令牌:developers.google.com/+/web/signin/disconnect
    • 我已根据您提供的链接进行了更改。访问令牌已成功撤销。但是,在我什至按下谷歌同意屏幕上的“接受”按钮之前,随后按下“获取联系人”按钮仍会尝试使用旧电子邮件和 access_token 获取联系人。想知道为什么会这样。我可以通过使用 window.location.reload() 函数强制刷新来解决这个问题。想知道是否可以不重新加载?
    • 可能是因为您的deferred对象在您第二次点击获取联系人时仍然被解析,所以它立即跳转到then函数。在 googleServices login 函数的开头尝试 deferred = $q.defer();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多