Skip to content

Instantly share code, notes, and snippets.

@zonoise
Created October 29, 2010 04:05
Show Gist options
  • Save zonoise/652891 to your computer and use it in GitHub Desktop.
Save zonoise/652891 to your computer and use it in GitHub Desktop.
require 'uri'
require 'net/http'
require 'rexml/document'
require 'date'
Net::HTTP.version_1_2
class AtndApi
EventsPath='/events/'
UsersPath='/events/users'
Host='api.atnd.org'
Port='80'
#[イベントサーチAPI]
#[戻り値]イベント情報の配列を返します。
#例
def self.events(param={})
query_string = param.map do|key,value|
"#{URI.encode(key)}=#{URI.encode(value)}"
end.join("&")
http=Net::HTTP.start("api.atnd.org","80")
res=http.get("#{EventsPath}?#{query_string}")
http.finish
return get_events(res.body)
end
#[出欠確認API]
#[戻り値]ユーザー情報付きのイベント情報配列を返します。
#(例)
#複数のイベントの情報を取得するには次のようにします。
#ids=[8000,8001,8002]
#ex)AtndApi.users('event_id'=> ids.join(','))
def self.users(param={})
set_up_query(param)
http=Net::HTTP.start(Host,"80")
res=http.get("#{UsersPath}?#{set_up_query(param)}")
http.finish
return parse_users(res.body)
end
#
#年月を指定して、その月のすべてのイベントを取得し、イベントの配列を返します。
#引数がしていされていない場合、今月のイベントを取得します。
#(例) AtndApi.get_all_events_of_ym(:ym => 201010)
def self.month_events(param={})
result=[]
start=1
downloaded_count = 100
if param[:ym] == nil
today=Date.today #パラメータがしていされていない場合。今月のイベントが帰ってくる
ym ="#{today.year}#{today.month}"
else
ym = "#{param[:ym]}"
end
while downloaded_count >= 100
#100件より、少ないレスポンスがくるまでループ
events = AtndApi.events('ym'=> ym,
'count'=>'100',
'start'=>"#{start}")
downloaded_count=events.size if events != nil
result += events
sleep(1) #一応待つ
start += 100 # インクリメント
end
return result
end
private
# パラメータ文字列を組み立てる
# ハッシュから、param=hoge&param2&huga をつくる
def self.set_up_query(param={})
param.map do|key,value|
"#{URI.encode(key)}=#{URI.encode(value)}"
end.join("&")
end
# XMLパース
def self.parse_users(res)
events=Array.new
doc= REXML::Document.new(res)
#puts "returned = "+ doc.elements['/hash/results_returned/'].text
#puts "start = "+ doc.elements['/hash/results_start/'].text
doc.elements.each("/hash/events/event/") do |e|
users=Array.new
us = e.elements['users']
us.elements.each('user'){|u|
users << {
:user_id => u.elements['user_id'].text,
:nickname => u.elements['nickname'].text,
:twitter_id=> u.elements['twitter_id'].text,
:status => u.elements['status'].text}
}
events << {:event_id => e.elements['event_id'].text ,
:users => users }
end
return events
end
#parseXML arrayを返す
def self.get_events(res)
events=Array.new
doc= REXML::Document.new(res)
doc.elements.each("/hash/events/event/"){|e|
events <<{:event_id => e.elements['event_id'].text ,
:title => e.elements['title'].text ,
:catch => e.elements['catch'].text ,
:description => e.elements['description'].text ,
:started_at => e.elements['started_at'].text,
:ended_at => e.elements['ended_at'].text ,
:event_url => e.elements['event_url'].text ,
:address => e.elements['address'].text }
}
return events
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment