在Rails下通过Google API Client访问Google Calendar接口

本文主要介绍通过使用[Google API Client](https://github.com/google/google-api-ruby-client)来在Rails应用里来访问Google Calendar接口来访问日程信息。

本文的主要代码可以从[这里下载](https://gist.github.com/liubin0329/5743405) 。


#1. 在Google网站创建应用程序

在[Google API Console](https://code.google.com/apis/console)创建应用：

a. 打开网址https://code.google.com/apis/console
b. 点击左边API Access 菜单
c. 在API Access里面（右边）创建一个Cliend ID，注意Application Type选择Web Application

最主要的是确保callback地址正确，本例是 http://localhost:3000/gcalendar/callback，基本上这样就可以。如果调试的时候出现错误，可根据错误信息酌情修改API设置。

#2. 在本地实现API调用

在服务端设置好之后，就可以在自己机器上实现API的调用代码了。

##2.1. 安装 Google API Client

在工程根目录下编辑Gemfile，加入：

    gem 'google-api-client'

然后执行：

    bundle install

##2.2. 实现Controller

首先，按oauth的流程，需要先生产一个认证地址，即用户将会被导向这个地址代表的Google服务器地址。这个地址通过API Client的

###2.2.1. 生产并导向授权地址

```ruby

@client = Google::APIClient.new
@client.authorization.client_id = '你的client id，从Google网站获得'
@client.authorization.client_secret = '你的secret，从Google网站获得'
# api 的类型
@client.authorization.scope = 'https://www.googleapis.com/auth/calendar'
# 根据自己情况设置callback
@client.authorization.redirect_uri = 'http://localhost:3000/gcalendar/callback'

# 用户将被导向此网址进行授权，
# 可以在view里提供此链接地址，或者直接redirect到这个网址。
@redirect_uri = @client.authorization.authorization_uri

```
上面的代码很简单，生产APIClient后，就往这个类的authorization里面设置相关属性，上面例子是最基本的用法。

### 2.2.2. 处理callback（授权后的回调）

在用户同意授权后，Google会调用此网址，我们需要在这个回调方法中处理里面的access token相关信息。这里只是简单的存到session里，供其它action使用：

```ruby
  # Google API 服务器授权后的回调接口
  def callback
    # 设置code，从Google 服务器返回的
    @client.authorization.code = params[:code] if params[:code]
    # 取得access token等信息
    @client.authorization.fetch_access_token!
 
    # 将token相关信息保存到session
    session[:access_token] = @client.authorization.access_token
    session[:refresh_token] = @client.authorization.refresh_token
    session[:expires_in] = @client.authorization.expires_in
    session[:issued_at] = @client.authorization.issued_at
 
    redirect_to :action => 'events'
  end
 
```

### 2.2.3. 调用Calendar相关接口
在上面的callback里，如果授权成功页面会转向到events这个action下去，在这里我们就可以尝试调用Calendar相关的API了。这里我们使用了两个API的例子，一个是取得Calendar列表，另一个就是取得某一天的某个Calendar下面的event列表。代码如下：


```ruby

  def events
 
    # 取得 calendar API的service
    @calendar = @client.discovered_api('calendar', 'v3')
    
    # 调用取得calendar 一览接口
    @calendarlist = @client.execute(:api_method => @calendar.calendar_list.list,
                              :authorization => @client.authorization)
 
    # 调用取得某一calendar里面某一天的events
    # 注意，日期格式要iso8601，且要注意时区信息
    day = Time.now
    @time_min = Time.local(day.year, day.month, day.day, 0,0,0).iso8601
    @time_max = Time.local(day.year, day.month, day.day, 23,59,59).iso8601
 
    @events = @client.execute(:api_method => @calendar.events.list,
                              :parameters => {'calendarId' => 'primary',
                                "timeMin" => @time_min,
                                "timeMax" => @time_max
                                },
                              :authorization => @client.authorization)
 
  end
 
```

请注意看一下里面的注释，尤其是跟日期相关的时区和格式问题。

# 3. 总结

看来，通过Google API Client来实现Google 相关服务的调用还是非常简单的，希望更多的第三方站点能集成Google的相关服务。
本文（部分）代码可以[在github下载](https://gist.github.com/liubin/5743405) 。