ruby gem

una escueta búsqueda en rubygems, rubyforge, github, etc. nos ofrece unas cuantas gemas pero medio nuevas o no mantenidas. al contrario, la API de google >> dice tener una librería cliente en ruby, seguiremos esta pista.

gem install google-api-client

(me da la impresión que es para toda la API eso sí, no sólo GCalendar)

$ irb
1.9.3-p392 :001 > require 'google/api_client'
 => true

(rubygems no se importa porque viene en ruby 1.9)

OAuth

Perfect. Ahora, del lado de Google, hay que habilitar la API del Calendar en la consola de Google y en > API Access crearse una cuenta OAuth

ya que la Google Calendar API v3 requiere de autentificación OAuth 2.0 >>
(Nótese que te pedirá escoger un tipo de app, en este caso escogemos Installed App ya que estamos desde la consola, para una app Rails tendría que ser Web App).

Luego ejecutamos el comando de consola para crear el archivo de configuración >>

google-api oauth-2-login --scope=https://www.googleapis.com/auth/calendar --client-id=CLIENT_ID --client-secret=CLIENT_SECRET

que nos lleva a la clásica pregunta de si es que se le permite a nuestra app acceso a los datos de Google

después de lo cual efectivamente tenemos un archivo ~/.google-api.yaml que podemos usar para instanciar la configuración >>>

require 'yaml'
oauth_yaml = YAML.load_file('/home/numerico/.google-api.yaml')

después de lo cual todo ésto funciona

client = Google::APIClient.new
client.authorization.client_id = oauth_yaml["client_id"]
client.authorization.client_secret = oauth_yaml["client_secret"]
client.authorization.scope = oauth_yaml["scope"]
client.authorization.refresh_token = oauth_yaml["refresh_token"]
client.authorization.access_token = oauth_yaml["access_token"]

if client.authorization.refresh_token && client.authorization.expired?
  client.authorization.fetch_access_token!
end

service = client.discovered_api('calendar', 'v3')

=> #<Google::APIClient::API:0xc8a9c4 ID:calendar:v3>

evento

Con ésto ya debiéramos poder crear un evento simple >>

event = {
  'summary' => 'carrete',
  'location' => 'en la ofi',
  'start' => {
    'dateTime' => '2013-04-30T20:00:00.000-07:00'
  },
  'end' => {
    'dateTime' => '2011-06-03T10:25:00.000-07:00'
  },
  'attendees' => [{
    'email' => '<var>attendeeEmail</var>'
  }]
}

result = client.execute(:api_method => service.events.insert,
    :parameters => {'calendarId' => 'primary'},
    :body => JSON.dump(event),
    :headers => {'Content-Type' => 'application/json'})

y he ahí el evento creado

freebusy

La API también permite preguntar por la disponibilidad del usuario en un período >>>

query= {
"timeMin" => '2013-04-25T19:00:00.000-07:00',
"timeMax" => '2013-05-01T19:00:00.000-07:00',
"timeZone" => 'UTC-4',#TODO averiguar formato
"items" => [{
"id" => "webmaster@greenti.cl"
}]
}

result = client.execute(:api_method => service.freebusy.query,
:body => JSON.dump(query),
:headers => {'Content-Type' => 'application/json'})

y efectivamente me devuelve los horarios que ya tengo ocupados

"busy" => [{
  "start" => "2013-04-29T14:30:00Z",
  "end" => "2013-04-29T15:30:00Z"
},{
  "start" =>"2013-05-01T02:00:00Z",
  "end" => "2013-05-01T05:00:00Z"
}]

(o algo así)


nótese que la consola de comandos tiene una sintáxis más corta para todo lo anterior…

Otras librerías interesantes que encontré son

  • google_calendar: wrapper mínimo, loguea con usuario y pass y hace las queries a través del GET del web service (mayormente al menos)
  • G4CalRuby: supuestamente exhaustivo (aunque no encontré freebusy), usa el web service con XML.

es decir que ninguno de los dos usa el wrapper que ofrece Google para ruby (tal vez sean anteriores)

Este sitio utiliza cookies.    Leer más