【问题标题】:How do I get Gmail contacts using JavaScript?如何使用 JavaScript 获取 Gmail 联系人?
【发布时间】:2013-06-08 00:47:56
【问题描述】:

我应该使用什么 Ajax 调用来使用 JavaScript 获取 gmail 联系人?我已经拥有用户 OAuth 令牌,因为用户使用 Google 注册了我的网站。

【问题讨论】:

标签: javascript ajax oauth-2.0 gmail google-oauth


【解决方案1】:

如果您通过 JavaScript 使用 OAuth2,则可以使用 Google Contacts API,但您需要在获取访问令牌(https://www.google.com/m8/feeds)时通过向 Google 发送正确的权限范围来获得授权。 (reference)

正如您已经知道如何获取访问令牌一样简单,只需使用正确的查询调用 API。要获取用户的所有联系人,只需向 API 发出异步请求以获取所需信息即可。例如,{userEmail} 是用户的电子邮件,{accessToken} 是您的访问令牌,只需将 GET 地址设置为以下 URI:

https://www.google.com/m8/feeds/contacts/{userEmail}/full?access_token={accessToken}&alt=json

您可以发送的查询类型列表及其参数可在此处获得:

【讨论】:

  • (令牌无效 - AuthSub 令牌的范围错误)这是我得到的错误。我的 ajax 请求如下所示: $.ajax({ url: "google.com/m8/feeds/contacts" + email +"/full?access_token=" + gmail_access_token + "&alt=json", dataType: "JSONP", success: function(contacts_data) { console.log(contacts_data); } });
  • 我用谷歌搜索过,但解决方案似乎不起作用。
  • @DarwishGani:您的令牌范围(即权限集)错误。如果您在收到令牌时更改权限范围,那么您应该可以使用它。
  • 我在获取客户端 ID 之前在 google 中激活了联系人 API,是否需要在此页面上激活另一个 API? code.google.com/apis/console/#project:552738833011:services
  • 感谢到目前为止的帮助。
【解决方案2】:

要使用 OAuth 获取用户的联系人,首先您需要在请求中指定联系人的范围。如果你使用的是 ChromeExAuth,那么你会写:

var oauth = ChromeExOAuth.initBackgroundPage({
  'request_url' : 'https://www.google.com/accounts/OAuthGetRequestToken',
  'authorize_url' : 'https://www.google.com/accounts/OAuthAuthorizeToken',
  'access_url' : 'https://www.google.com/accounts/OAuthGetAccessToken',
  'consumer_key' : 'anonymous',
  'consumer_secret' : 'anonymous',
  'scope' : 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.google.com/m8/feeds/',
  'app_name' : 'MyApp'
});

上面的范围参数列出了 3 个范围:用户的电子邮件、个人资料和联系人 (google.com/m8/feeds/contacts)

要在用户授权令牌后获取他们的联系人,您可以发送如下请求:

var url = "http://www.google.com/m8/feeds/contacts/default/full";
oauth.sendSignedRequest(url, onContacts, {
  'parameters' : {
    'alt' : 'json',
    'max-results' : 99999
  }
});

请求的回调可能如下所示:

function onContacts(text, xhr) {
  contacts = [];
  var data = JSON.parse(text);
  for (var i = 0, entry; entry = data.feed.entry[i]; i++) {
    var contact = {
      'name' : entry['title']['$t'],
      'id' : entry['id']['$t'],
      'emails' : []
    };

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

    if (!contact['name']) {
      contact['name'] = contact['emails'][0] || "<Unknown>";
    }
    contacts.push(contact);
  }
};

要查看联系人数组,您可以在控制台上打印:

console.log(contacts);

您可以查看 Google OAuth 教程here

【讨论】:

  • 完美的好方法。我建议使用 Google 原生库(不是以浏览器为中心)来获得授权并使用 jqery 的 $.get() 方法。
  • 有没有办法选择性地获取自动完成 UI 的联系人。当用户键入 For 时,应该加载在运行时加载的匹配值
  • @CodeGuy 不能说。我已经很长时间没有使用谷歌 API 来处理这类事情了。一种方法是下载联系人,并使用诸如 TypeAhead 之类的库过滤它们。你可以在SO中搜索类似的问题,如果找不到,你可以问一个新的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2010-11-03
  • 1970-01-01
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多