アナログ金木犀

つれづれなるまままにつれづれする

未来のFacebookイベントを一括でGoogle Calendarに登録するスクリプト

FacebookイベントをGoogle Calendarに登録するスクリプトをつくってみた

スクリプト自体はすぐだけど、初回はトークンとかの準備のコスト高いかも。

FBでAccessToken取得

https://developers.facebook.com/tools/explorer/ にアクセスして、「Get Access Token」を押してuser_eventsにチェックを入れてアクセストークンを取得します。

「Get Access Token」を押した後に「Access Token:」っていうフィールドの中身をコピーしてメモっておきます。

Google Api consoleでクライアントキー等取得

https://console.developers.google.com にアクセスして、適当にプロジェクトを作ります。

Calendar APIをONにします。

「認証情報」を選択して「新しいクライアントIDを作成」を押します。

「インストールされているアプリケーション」、「その他」を選択して「クライアントIDを作成」をクリックして、その後表示される「クライアントID」と「クライアントシークレット」をメモします。

(必要なら) google-api-clientをインストールします

初回ならgoogle api clientをインストールします。

gem install google-api-client

トークンファイルを取得する

google-api oauth-2-login --scope=https://www.googleapis.com/auth/calendar --client-id=[クライアントID] --client-secret=[クライアントシークレット]

このコマンドを実行するとブラウザが開いて認証して、その後 ~/.google-api.yml というファイルができます。

".google-api.yml"は適宜好きな場所に置いてください。

 スクリプトを作る

下記をコピって[Facebookで取得したAccessToken]と[登録したいカレンダーの名前]を埋めるだけ。 とりあえず、1時間で登録しています。

require 'open-uri'
require 'json'
require 'yaml'
require 'date'
require "google/api_client"

open('https://graph.facebook.com/v2.3/me/events?access_token=[Facebookで取得したAccessToken]=all&format=json') do |data|
  json = JSON.load(data.read)

  oauth_yaml = YAML.load_file('.google-api.yaml')
  client = Google::APIClient.new({:application_name => "sample",:application_version => "1.0"})
  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')

  #カレンダーIDの取得
  gcal_list = client.execute(:api_method => service.calendar_list.list)
  gcal_id = nil
  gcal_list.data.items.each do |c|
    if c["summary"] == "[登録したいカレンダーの名前]"
      gcal_id = c["id"]
      break
    end
  end

  now = Time.now.to_datetime

  json["data"].each do |event|
    startTime = DateTime.parse(event["start_time"])
    if now > startTime
      next
    end
    endTime = startTime + Rational(1, 24)
    gevent = {}
    gevent["summary"] = event["name"]
    gevent["start"]   = {"dateTime" => startTime.iso8601}
    gevent["end"]     = {"dateTime" => endTime.iso8601}
    client.execute(:api_method => service.events.insert,
                   :parameters => {'calendarId' => gcal_id},
                   :body => JSON.dump(gevent),
                   :headers => {'Content-Type' => 'application/json'})
    puts event["name"]
  end

end

実行

あとは実行して確認するのみ!

微妙に面倒だけど、1回つくっちゃえばあとは好きなときにコマンド叩くだけだからまぁ楽か。tokenきれるかもけど。

参考

rubyでGoogle Calendarをいじる