Meetup ストリーミング HTTP API に接続して、受信したイベントを別のレコードで解析しようとしています。私はシナトラの上にルビーを使用しています。接続を処理するために「em-http-request」gem を選択し、サーバーとして「thin」を選択しました。API ストリーミングの処理方法に関する情報を検索して見つけたのは、約 3 ~ 6 年前のもので、これは私が見つけた最良の例です。
この例では、作成者は正規表現を使用して各ツイートの終わりを見つけ、それらを異なるレコードに分割します。私の場合、meetUp イベントのストリームを分割する方法が見つかりませんでした。
これが私のコードです:
get '/' do
STREAMING_URL = 'http://stream.meetup.com/2/open_events'
http = EM::HttpRequest.new(STREAMING_URL).get
buffer = ""
http.stream do |chunk|
buffer += chunk
while event = buffer.slice!(/{\"utc_offset\"+.../)
eventRecord = event
puts eventRecord
end
end
//stream.meetup.com/2/open_events への接続呼び出しを開くと、次の形式でランダムに切り取られた文字列のストリームを受信し始めます。
{"utc_offset":-14400000,"venue":{"country":"us","city":"Novi","address_1":"43155 Main St Suite 2300N","name":"Game of Clues Escape Room","lon":-83.470833,"state":"MI","lat":42.478107},"rsvp_limit":0,"venue_visibility":"public","visibility":"public","maybe_rsvp_count":0,"description":"<p>Search the Emerald City for clues to help you solve riddles and puzzles to escape the room before the 60 minute timer is up. Work together to complete missions that will bring your group closer together in order to get a clue card.<\/p> \n<p>25.00 per person. Book online at www.gameofclues.com<\/p>","mtime":1467030326494,"event_url":"http:\/\/www.meetup.com\/Escape-Room-Lovers\/events\/232071150\/","yes_rsvp_count":1,"duration":3600000,"payment_required":"0","name":"Game of Clues Escape Room Novi,Mi","id":"232071150","time":1467507600000,"group":{"join_mode":"open","country":"us","city":"Novi","name":"Escape Room Lovers","group_lon":-83.52,"id":20101745,"state":"MI","urlname":"Escape-Room-Lovers","category":{"name":"games","id":11,"shortname":"games"},"group_lat":42.47},"status":"upcoming"}{"utc_offset":14400000,"venue":{"country":"ae","city":"Dubai","address_1":"Jumeirah Lake Towers, outside Dubai Marina Metro","name":"Illuminations Well-Being Center, 409, Fortune Executive Towers, Cluster T, Plot T1, ","lon":55.311668,"lat":25.264444},"rsvp_limit":0,"venue_visibility":"public","visibility":"public","maybe_rsvp_count":0,"description":"<p>Facilitator: Dr. Beryl Bazley<\/p> \n<p>Investment: Free!<\/p> \n<p>For more information call
.slice を使ってみた! 各イベントの開始時に表示される部分文字列である"{"utc_offset""をパラメータとして使用してバッファの内容を調べましたが、取得する部分文字列の各出現の間に囲まれたすべてのものを取得する正規表現を記述する方法がわかりませんでしたイベント全体の結果として。
また、変数バッファーにチャンクを追加してからメソッド.slice!を使用するかどうかもわかりません。これは、各イベントを取得する最良の方法です。
この状況を解決する最善の方法はどれですか?
ストリーミング API 経由で受信したデータをスライスして解析するにはどうすればよいですか?
ここで、コメントで@jordanが提案したソリューションの実装を追加します。
require 'yajl'
require 'uri'
require 'yajl/http_stream'
@parser = Yajl::Parser.new(:symbolize_keys => true)
STREAMING_URL = 'http://stream.meetup.com/2/open_events'
Yajl::HttpStream.get(STREAMING_URL, :symbolize_keys => true) do |hash|
puts hash.inspect
hash.each {|key, value| puts "#{key} is #{value}" }
end