如何在ruby中访问Google Contacts API

时间:2014-09-26 05:12:46

标签: ruby api google-api google-contacts

我很难访问Google通讯录API。首先我尝试了google-api-ruby-client gem但事实证明它不支持Contacts API

下一张照片是google_contacts_api gem。我使用oauth2来访问身份验证密钥(Getting authentication token guide question)。但是在将令牌正确传递给api之后,它会产生错误。

`<main>': undefined method `[]' for #<GoogleContactsApi::GroupSet:0x000000039fcad8>` (NoMethodError).

这是我的代码。

# get token using oauth2 gem, and use it below in the google_contacts_api.
google_contacts_user = GoogleContactsApi::User.new(token)
contacts = google_contacts_user.contacts
groups = google_contacts_user.groups

# group methods
group = groups[0]
group.contacts
puts group.contacts

# contact methods
puts contacts.count
puts groups.count
contact = contacts[0]
contact.primary_email
contact.emails

我做错了什么?

  

更新:

正如@alvin建议它现在正在运作。但是小组联系人没有被打印出来。而是打印#<GoogleContactsApi::ContactSet:0x000000020e49d8>。示例:此处是此代码打印的内容

groups = google_contacts_user.groups

# group methods
groups.each do |group|
  group_contacts = group.contacts
  puts group_contacts
end

输出:

#<GoogleContactsApi::ContactSet:0x000000020e49d8>
#<GoogleContactsApi::ContactSet:0x0000000504aec0>
#<GoogleContactsApi::ContactSet:0x0000000518dfd0>
#<GoogleContactsApi::ContactSet:0x000000052d9290>
#<GoogleContactsApi::ContactSet:0x000000054280d8>
#<GoogleContactsApi::ContactSet:0x0000000558c2f8>
#<GoogleContactsApi::ContactSet:0x00000005746eb8>
#<GoogleContactsApi::ContactSet:0x000000058a3ea0>

如何打印群组联系人?

1 个答案:

答案 0 :(得分:2)

已编辑以添加有关Enumerable实施的信息

(我写了宝石。)

文档中存在错误。 groupscontacts是实现Enumerable的类的实例,它们不提供[]方法,但提供first方法。

因此,请尝试groups.first而不是groups[0]。同样,请使用contacts.first代替contacts[0]。我的错! (我可能在脑子里做了to_a。)


对更新的回应

要回答问题的后半部分,您似乎找到了ContactGroup的相关便捷方法,尤其是Contact.primary_email方法。 See more methods in the (somewhat incomplete, sorry) YARD docs.

要获取所有电子邮件,您基本上需要迭代返回的联系人。正如我在对问题第一部分的更新回复中提到的那样,groupscontacts拥有Enumerable的所有方法。 (Enumerable documentation)。以下是一些例子:

# What are all the groups called?
user.groups.map(&:title)

# Find group by title. (Returns nil if no such group.)
group = user.groups.select { |g| g.title = "Group Name" }

# Get all primary emails from a group
group.contacts.map(&:primary_email)

# Get all primary emails from all contacts regardless of group
user.contacts.map(&:primary_email)

当没有提供便利访问器时,您只需要使用Hashie::Mash方法来访问数据(例如,如果Google开始返回宝石还没有考虑的额外数据)。您描述的用例并不需要这样做。

P.S。将来,您可能想要打开一个新问题,而不是编辑现有问题。