Webuilder240

外部カレンダーにデータを取り込んで情報を表示するやつを作ってくれと言われたときに見るブログ

2020-07-05 12:26:23 +0900

iCalender Rails Ruby

サンプルサービスの要件について

  • イベントサービスを作っていて、GoogleカレンダーやAppleのカレンダーアプリにそのイベントサービスのイベントの予定が同期されて、サービスサイトにアクセスしなくてもイベントがいつ開催されるかを確認できるようにしたい。
  • 筆者が慣れているので、サンプルアプリケーションはRuby on Railsで記載するが、各技術仕様については参考になると思います。

では、この要件を実現するにはどうすればいいでしょうか?
少し調べてみると、iCalenderなる規格があり、これがGoogleカレンダーやMacのカレンダーアプリで対応しているようです。

https://ja.wikipedia.org/wiki/ICalendar

iCalenderについての詳しい説明はこの記事を見ればざっくり理解することができます。

https://qiita.com/TomOse/items/31b5fb4782f06d19af79

独自フォーマットで、新しいイマドキの情報がそこまであるわけではないんですが、実際に使う項目はそんなにないし、とてもシンプルです。
ライブラリも各言語であるだろうし、自前で書いたとしても実装難易度は低いと思います。

Rubyの場合は `icalender` Gemがあり、それが一番人気っぽいので、このGemで.ics形式のデータをRailsで配信しましょう。

https://github.com/icalendar/icalendar

下記のようにControllerのコードを書けば、icalender形式のデータをRailsで配信することができます。
class EventController < ApplicationController
  events = Event.where("started_at > ? ", Time.now)
  cal = Icalendar::Calendar.new
  events.each do |event|
    cal.event do |e|
      e.uid         = event.id
      e.dtstart     = Icalendar::Values::DateTime.new(event.started_at)
      e.dtend       = Icalendar::Values::DateTime.new(event.ended_at)
      e.summary     = "【SampleSite】#{event.name}"
      e.description = event.description
      e.url = event_url(event)
    end
    cal.publish
  end
  
  render text: cal.to_ical
end

あとは、このControllerのURLをエンドユーザーに共有して、Macのカレンダーアプリなり、GoogleカレンダーなりにURLを入力してもらいましょう。

注意点

  • このiCalender形式のデータをクロールするのはユーザーではなく、各カレンダーアプリなので、原則ログイン情報を持たすことはできない。従ってURLにトークンをつけてユーザー認証だったりを行う手段が一般的になるかと思うので、エンドユーザーに対して、URLを他人に共有しないように注意喚起をする必要がある。
  • またクロール頻度も各アプリの仕様によって異なるとは思うが、Appleのカレンダーアプリの場合は、5分おきに同期する選択肢があったりするので、リクエスト数によってはレスポンスをキャッシュしておくことを検討しておいたほうがいいと思う。

関連しそうなブログ