Rubyで複数のイベント管理サイトからイベント情報を一度に取得するシンプルな手順

# はじめに

イベントを管理するのに使われているサイトが乱立していますが、これにより情報が分散してしまい、興味のあるイベントに終わった後で気がつくというのも珍しくなくなってきたように感じます。
そこで、APIで情報を取得できるイベント管理サイトから一度に情報を取得して、イベント参加に失敗しない工夫をしてみます。

# 対象サイト

対象サイトは以下のとおりです。
ちなみにeventonにはアクセス回数に制限があるようで、繰り返しアクセスしているとアクセスできなくなります。

- Doorkeeper
https://www.doorkeeperhq.com/developer/api

- eventon
https://eventon.jp/info/api/

- connpass
http://connpass.com/about/api/

- ATND
http://api.atnd.org

- Zusaar
http://www.zusaar.com/doc/api.html

# 取得する情報の選定

ここでは、取得する情報をタイトル、日付、会場、URLに絞って実施します。
また、情報が多くなりすぎないよう、年月を指定して取得することにします。

# サイト毎に取得する関数を作成

まず、どのサイトもJSON形式でデータを取得することとし、以下の関数を用意します。

```rb:
require 'net/http'
require 'uri'
require 'json'
require 'date'

def get_json(url)
  
  uri = URI.parse(URI.escape(url))
  json = Net::HTTP.get(uri)
  result = JSON.parse(json)

end
```

- Doorkeeper

```rb:
def doorkeeper(y, m, word)
  
  y2 = (m == 12) ? y+1 : y
  m2 = (m == 12) ? 1 : m+1
  
  result = get_json("http://api.doorkeeper.jp/events/?locale=ja&sort=starts_at&since=#{y}-#{m}-01&until=#{y2}-#{m2}-01&q=#{word}")
  
  puts "Doorkeeper #{result.length}"

  infos = []
  
  result.each do |row|
    vals = row["event"]
    infos << {
      "title" => vals["title"],
      "started_at" => vals["starts_at"],
      "event_url" => vals["public_url"],
      "address"=> vals["address"]
    }
  end
    
  return infos
  
end
```

- eventon

```rb:
def eventon(ym, word)
  
  result = get_json("http://eventon.jp/api/events.json?prefecture_id=32&ym=#{ym}&limit=100")
  
  puts "eventon #{result["count"]}"
  
  infos = []
  
  result["events"].each do |val|
    infos << {
      "title" => val["title"],
      "started_at" => val["started_at"],
      "event_url" => val["event_url"],
      "address" => val["address"] + " " + val["place"]
    }
  end
  
  return infos
  
end
```

- connpass

```rb:
def connpass(ym, word)
  
  result = get_json("http://connpass.com/api/v1/event/?keyword=#{word}&ym=#{ym}&count=100")
  
  puts "connpass #{result["results_available"]}, #{result["results_returned"]}"
  
  infos = []
  
  result["events"].each do |val|
    infos << {
      "title" => val["title"],
      "started_at" => val["started_at"],
      "event_url" => val["event_url"],
      "address" => val["address"]
    }
  end
  
  return infos
  
end
```

- ATND

```rb:
def atnd(ym, word)
  
  result = get_json("http://api.atnd.org/events/?format=json&keyword=#{word}&ym=#{ym}&count=100")
  
  puts "ATND #{result["results_returned"]}"
  
  infos = []
  
  result["events"].each do |row|
    val = row["event"]
    infos << {
      "title" => val["title"],
      "started_at" => val["started_at"],
      "event_url" => val["event_url"],
      "address" => val["address"] + " " + val["place"]
    }
  end
  
  return infos
  
end
```

- Zusaar

```rb:
def zusaar(ym, word)

  result = get_json("http://www.zusaar.com/api/event/?ym=#{ym}&count=100&keyword_or=#{word}")
  
  puts "Zusaar #{result["results_returned"]}"

  infos = []
  result["event"].each do |val|
    infos << {
      "title" => val["title"],
      "started_at" => val["started_at"],
      "event_url" => val["event_url"],
      "address" => val["address"] + " " + val["place"]
    }
  end
  
  return infos
  
end
```

# 集約する関数を作成

前述の関数で取得した情報を一つの配列として取得します。

```rb:
def get_events(year, month, word)
  
  ym = sprintf("%04d%02d", year, month)
  puts "[#{ym}]"
  
  infos = []
  infos += eventon(ym, word)
  infos += doorkeeper(year, month, word)
  infos += connpass(ym, word)
  infos += atnd(ym, word)
  infos += zusaar(ym, word)
  
  puts "Total #{infos.length}"
  
  return infos
  
end
```

# 取得した情報を日付別にわける

サイト別に取得した情報を日付別に再配置します。
ここではキーワードを「松江」で検索していますが、みなさんが興味のある単語に変えてご利用ください。

```rb:
cal = Array.new(32) do |map|
  []
end

y = 2016
m = 10

get_events(y,m,"松江").each do |row|
  date = DateTime.parse(row["started_at"])
  cal[date.day] << row
end

nil
```

# 取得した情報を一覧表示する

カレンダーのように日付別でイベントの情報を表示する。

```rb:
puts "#{y}年#{m}月"

i = 1
cal[1,cal.length].each do |events|
  puts "# #{i}日"
  events.each do |row|
    puts row["title"]
    puts row["event_url"]
    puts row["address"]
    puts
  end
  i += 1
end
```

以上、何かの役に立ちますでしょうか(^_^;)