未来の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きれるかもけど。