简体   繁体   中英

Create Google Contact through API in Ruby On Rails

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM