【问题标题】:Unable to fetch contacts from using google APIs无法使用谷歌 API 获取联系人
【发布时间】:2015-07-14 05:52:24
【问题描述】:

我正在使用 Google Contacts API v3 来提取 Google 联系人。

我开始使用适用于 JavaScript 的 Google API 客户端库进行身份验证和授权。我对 API 访问的那部分没有任何问题。

但在完成身份验证部分后,我必须获取谷歌联系人(只读访问对我来说很好)。我正在为 Google Contacts API v3 使用 gdata-javascript-client。 我还参考了谷歌官方文档并复制了代码并进行了必要的更改以适合我。

我的问题是,

  1. 它不工作。它没有进入注册的回调函数。
  2. 我也尝试过使用只读模式。但这也行不通。

我在关注两段代码,一段是可编辑模式,另一段是只读模式。

可编辑模式访问:

function handleAuthResult(authResult){
    if (authResult && !authResult.error) {
        fetch_contacts_data(authResult);
    };
}

function auth() {
    var config = {
        'client_id': 'CLIENT_ID',
        'scope': 'https://www.google.com/m8/feeds'
    };
    gapi.auth.authorize(config, handleAuthResult);
}


function fetch_contacts_data(token) {
    $.ajax({
        url: "https://www.google.com/m8/feeds/contacts/default/full?access_token=" + token.access_token  + "&max-results=70000&alt=json" + "&callback=?",
        dataType: "json",
        success:function(data) {
            contacts = [];
            for (var i = 0, entry; entry = data.feed.entry[i]; i++) {
                var contact = {
                    'name' : entry['title']['$t'],
                    'id' : entry['id']['$t'],
                    'emails' : [],
                    'phoneNumber' : []
                };

                if (entry['gd$email']) {
                    var emails = entry['gd$email'];
                    for (var j = 0, email; email = emails[j]; j++) {
                        contact['emails'].push(email['address']);
                    }
                }
                if (entry['gd$phoneNumber']) {
                    var phoneNumber = entry['gd$phoneNumber'];
                    for (var j = 0, phone; phone = phoneNumber[j]; j++) {
                        contact['phoneNumber'].push(phone['$t']);

                    }
                }
                if (!contact['name']) {
                    contact['name'] = contact['emails'][0] || "<Unknown>";
                }
                contacts.push(contact);
            }
            numContacts = contacts.length;
            friend_list_json_str = '';
            for(var j=0;j<numContacts;j++) {
                name = (contacts[j])['name'];
                emails = (contacts[j])['emails'];
                phone = (contacts[j])['phoneNumber'];
                email_list= '';
                phone_list= '';
                for(var k=0;k<emails.length;k++) {
                    email_list += '"'+emails[k] + '",' ;
                }
                email_list = email_list.substring(0, email_list.length -1)

                for(var k=0;k<phone.length;k++) {
                    phone_list = '"'+phone[k] + '",';
                }
                phone_list += phone_list.substring(0, phone_list.length -1)

                friend_json_str = '';
                friend_json_str += '{"name":"'+name + '",';
                friend_json_str += '"emails":['+email_list+'],';
                friend_json_str += '"phoneNumber":['+phone_list+']' ;
                friend_json_str += '},';
                friend_list_json_str += friend_json_str;
            }
            friend_list_json_str = friend_list_json_str.substring(0, friend_list_json_str.length - 1);

            var user_data = get_user_data();
            var len = user_data.length;
            user_data = user_data.substring(0, len - 2);
            user_data += friend_list_json_str + ']}';
            data = "invite_data="+ user_data;
            url = '/invite';
            var posting = $.post( url, data );

            posting.done(function( response_data ) {
            });
        }
    });
}

只读访问权限:

function auth() {
    var config = {
        'client_id': 'CLIENT_ID',
        'scope': 'https://www.googleapis.com/auth/contacts.readonly'
        };
    gapi.auth.authorize(config, handleAuthResult);
}

注意:其余代码同上

在这两种情况下,ajax 调用都失败了,

 $.ajax({
            url: "https://www.google.com/m8/feeds/contacts/default/full?access_token=" + token.access_token  + "&max-results=70000&alt=json" + "&callback=?",
            dataType: "json",
            success:function(data)

谁能告诉我为什么这段代码不起作用?

【问题讨论】:

  • 请记住,您的客户 ID 必须始终保持安全。我已编辑您的问题并为您删除。
  • 非常感谢 DalmTo!
  • 从 ajax 请求中移除 ` + "&callback=?"`。我认为这是触发 JSONP 响应而不是使用您的成功回调。而client_ids可以认为是公开的,毕竟它们包含在客户端JS中。这是您必须保密的服务器密钥/秘密。
  • 你的意思是说我必须以不同的方式处理它,除了 cb 机制吗?你能建议我处理 jSONP 响应的方法吗...

标签: javascript api google-api google-api-java-client google-contacts-api


【解决方案1】:

您被浏览器的弹出窗口阻止程序阻止。

单击按钮后尝试调用auth() 方法,它应该可以工作。

要取消此问题,您需要:

  1. 首先,尝试使用参数{immediate:true} 调用gapi.auth.authorize。如果用户已经给予许可,它将尝试在后台获取令牌。
  2. 如果失败,则向用户显示一个按钮以进行身份​​验证。当用户点击它时,使用参数{immediate:false}调用gapi.auth.authorize

【讨论】:

  • 嗨,大卫,它对我不起作用..经过进一步调查,我发现我正在获取响应数据,但不知何故没有调用注册的回调..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2011-05-16
  • 2017-05-11
  • 2020-10-20
相关资源
最近更新 更多