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)