Edited at

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

More than 1 year has passed since last update.


はじめに

イベントを管理するのに使われているサイトが乱立していますが、これにより情報が分散してしまい、興味のあるイベントに終わった後で気がつくというのも珍しくなくなってきたように感じます。

そこで、APIで情報を取得できるイベント管理サイトから一度に情報を取得して、イベント参加に失敗しない工夫をしてみます。


対象サイト

対象サイトは以下のとおりです。

ちなみにeventonにはアクセス回数に制限があるようで、繰り返しアクセスしているとアクセスできなくなります。


取得する情報の選定

ここでは、取得する情報をタイトル、日付、会場、URLに絞って実施します。

また、情報が多くなりすぎないよう、年月を指定して取得することにします。


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

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

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

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

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

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

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

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


集約する関数を作成

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

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


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

サイト別に取得した情報を日付別に再配置します。

ここではキーワードを「松江」で検索していますが、みなさんが興味のある単語に変えてご利用ください。

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


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

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

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

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