Create Google Contact through API in Ruby On Rails

858 views Asked by At

I need some help with Google integration.

I need to create google contacts through the Google Contacts API but all the gems I can find only gets the contents and it also seems like the Google Contacts API doesn't support JSON posts, only xml/atom.

This is what I have

Gemfile

gem 'google-api-client'

google_contacts_controller.rb

require 'google/apis/people_v1'
require 'google/api_client/client_secrets'

class GoogleContactsController < ApplicationController

  def auth
    client_secrets = Google::APIClient::ClientSecrets.load('app/controllers/google_contacts/client_secret.json')
    auth_client = client_secrets.to_authorization
    auth_client.update!(
      :scope => 'https://www.google.com/m8/feeds/',
      :redirect_uri => 'http://localhost:3000/google_contacts/auth')[]
    if request['code'] == nil
      auth_uri = auth_client.authorization_uri.to_s
      redirect_to auth_uri
    else
       auth_client.code = request['code']
       auth_client.fetch_access_token!
       auth_client.client_secret = nil
       _auth_client(auth_client)
       redirect_to action: 'sync_contacts'
    end
  end

  def sync_contacts
    unless session.has_key?(:credentials)
      _auth_client
      unless session.has_key?(:credentials)
        redirect action: 'auth'
      end
    end
   client_opts = JSON.parse(session[:credentials])

   auth_client = Signet::OAuth2::Client.new(client_opts)

   people_service = Google::Apis::PeopleV1::PeopleServiceService.new
   people_service.authorization = auth_client

   response = people_service.list_person_connections('people/me', request_mask_include_field: %w'person.names', page_size: 10,)
   remote_name_arry = response.connections.map{|person| person.names[0].display_name}

    redirect_to action: 'done', message: 'Synced Contacts'
  end

  def done
    @message = params[:message]
  end

  private
  def _auth_client(auth_client=nil)
    if auth_client
      credentials = GoogleContactCredential.new
      credentials.authorization_uri = auth_client.authorization_uri
      credentials.token_credential_uri = auth_client.token_credential_uri
      credentials.client_id = auth_client.client_id
      credentials.scope = "[#{auth_client.scope.join(', ')}]"
      credentials.redirect_uri = auth_client.redirect_uri
      credentials.expiry = auth_client.expiry
      credentials.expires_at = auth_client.expires_at
      credentials.access_token = auth_client.access_token
      if credentials.save
        session[:credentials] = credentials.to_json
      end
    else
      credentials = GoogleContactCredential.first
      if credentials.present?
        session[:credentials] = credentials.to_json
      end
    end
    credentials
  end
end

This all works fine and I am able to get all of my contacts but I can not find a way with this gem or another gem or JSON to create contacts.

Is there anybody that has had this issue and can please point me in the right direction.

UPDATE

I have also tried using the google_contacts_api gem to no success.

Here is what I have

Gemfile

gem 'google_contacts_api'

google_contacts_controller.rb

def sync_contacts
  unless session.has_key?(:credentials)
    _auth_client
    unless session.has_key?(:credentials)
      redirect action: 'auth'
    end
  end
  client_opts = JSON.parse(session[:credentials])

  auth = OAuth2::Client.new(client_opts['client_id'], client_opts['client_secret'], client_opts)

  token = OAuth2::AccessToken.new(auth, client_opts['access_token'])

  google_contacts_user = GoogleContactsApi::User.new(token)
  contacts = google_contacts_user.contacts

  contact = contacts.first

  logger.info contact.title

  new_group = google_contacts_user.create_group('New group')

  redirect_to action: 'done', message: 'Synced Contacts'
end

Everything works fine until this line (which I got out of the example supplied for the gem):

new_group = google_contacts_user.create_group('New group')

Then I get this line exception:

undefined method `create_group' for #<GoogleContactsApi::User:0x007ff2da2291b8>

Can someone spot my mistake I made?

Also, how would I proceed to create contacts as I can not seem to find documentation or posts on actually creating and updating contacts, I thought maybe I would have to create a group and then I can add contacts to the group but as I can not manage to create a group I can not test that theory.

Please point me in the right direction

1

There are 1 answers

3
eiko On BEST ANSWER

The Google People API is read-only and can't be used to update or add new contacts. For that, you need to use the Google Contacts API which is, unfortunately, not supported by the google-api-client gem.

To access the Google Client API, you can try using this gem:

google_contacts_api

If you run into trouble setting it up, check out this stackoverflow question:

access google contacts api

It has a helpful answer written by the same person who wrote the gem.

EDIT

It looks like development on the google_contacts_api gem stopped before functionality for creating contacts was added. I'm looking through the various gems on Github and they're all in states of disrepair / death.

As much as it pains me to say it, your best bet might be to access Google Contacts directly via their web API.

Best of luck and sorry for the disheartening answer.