Created
October 29, 2010 04:05
-
-
Save zonoise/652891 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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¶m2&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