PythonでGoogleカレンダーのAPIを叩く

ちょっとカレンダーを使った実験をしたくてGoogle CalendarのAPIを叩いてみたのですが、何度かバージョンが変わっている事もあって、少し手こずったのでメモしておきます。

まずAPIを叩く前に、https://code.google.com/apis/console/ にアクセスして使用するサービスを有効にしておきます。

google apis

現時点の最新APIバージョンは3なのですが、このバージョンのAPIを叩くにはgoogle-api-python-clientモジュールを使います。gdataという如何にもなモジュールもあるのですが、これは古いバージョンのAPI用なので注意しましょう。

$ pip install google-api-python-client

OAuthの認証周りが何となく複雑で面倒な気がしますが、コードを見ると別に特に難しくはないですね。基本的な処理の流れは以下の通りです。OAuthの認証をする際のscopeの値が解らなくて少し苦労しました。

  1. OAuth認証経由でCredentialsを作成
  2. Credentialsからserviceオブジェクトを取得
  3. リファレンスを見ながらAPI叩く
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import httplib2
from apiclient.discovery import build
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.file import Storage
from oauth2client.tools import run

def main():

    # get credentials with oauth
    storage = Storage('calendar.dat')
    credentials = storage.get()
    if not credentials or credentials.invalid:
        flow = OAuth2WebServerFlow(
            client_id='YOUR_CLIENT_ID',
            client_secret='YOUR_CLIENT_SECRET',
            scope=['https://www.googleapis.com/auth/calendar'],
            user_agent='Calendar Sample/1.0')
        credentials = run(flow, storage)

        
    http = httplib2.Http()
    credentials.authorize(http)

    service = build('oauth2', 'v2', http=http)
    userinfo = service.userinfo().get().execute()

    # カレンダーのイベント列挙
    sample_exists = False
    service = build('calendar', 'v3', http=http)
    calendars = service.calendarList().list().execute()
    for calendar in calendars['items']:
        events = service.events().list(calendarId=calendar['id']).execute()
        for event in events['items']:
            print event['summary'].encode('utf-8')
            if event['summary'] == 'event_from_api':
                sample_exists = True

    # カレンダーにイベントを追加
    if not sample_exists:
        now = time.time()
        print now
        event = {
            'start': {'date':'2012-05-15'},
            'end':   {'date':'2012-05-16'},
            'summary': 'event_from_api'
            }
        target_calendar_id = calendars['items'][0]['id']
        created_event = service.events().insert(calendarId=target_calendar_id, body=event).execute()
        print created_if
        

if __name__ == '__main__':
    main()

実はGoogleのAPI初めて叩いたんですけど、他のサービスも同じノリで使えるのでgoogle-api-python-client覚えるだけで、色々できるようになるので良いですね。一度 https://code.google.com/apis/console/ をみてサービスのリスト眺めておくと後々役に立つ事があるかもしれません。

Leave a Reply

Your email address will not be published. Required fields are marked *