はじめに
イベントを管理するのに使われているサイトが乱立していますが、これにより情報が分散してしまい、興味のあるイベントに終わった後で気がつくというのも珍しくなくなってきたように感じます。
そこで、APIで情報を取得できるイベント管理サイトから一度に情報を取得して、イベント参加に失敗しない工夫をしてみます。
対象サイト
対象サイトは以下のとおりです。
ちなみにeventonにはアクセス回数に制限があるようで、繰り返しアクセスしているとアクセスできなくなります。
Doorkeeper
https://www.doorkeeperhq.com/developer/apieventon
https://eventon.jp/info/api/connpass
http://connpass.com/about/api/ATND
http://api.atnd.org
取得する情報の選定
ここでは、取得する情報をタイトル、日付、会場、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
以上、何かの役に立ちますでしょうか(^_^;)