2011-02-28 5 views
0

Sinatra, EventMachine, DataMapper, SQLite3 및 Twitter Stream API를 사용하여 트윗을 캡처하고 저장합니다. 명령 줄에서 응용 프로그램을 실행할 때 트윗 50에서 계속 실패하는 것 같습니다. 트윗을 저장하지 않으면 겉으로보기에는 영원히 돌아갈 수 있습니다.Sinatra를 사용하여 데이터베이스에 트윗을 저장할 때 오류가 발생했습니다.

다음은 'oscar'가 포함 된 트윗을 캡처하여 매우 빠른 스트림을 제공하는 앱 코드입니다. 트위터 사용자 이름과 암호를 입력하고 명령 줄에서 실행하십시오.

require 'rubygems' 
require 'sinatra' 
require 'em-http' 
require 'json' 
require 'dm-core' 
require 'dm-migrations' 

USERNAME = '<your twitter username>' 
PASSWORD = '<your secret password>' 
STREAMING_URL = 'http://stream.twitter.com/1/statuses/filter.json' 

DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/db/development.db") 

class Tweet 
    include DataMapper::Resource 

    property :id,   Serial 
    property :tweet_id,  String 
    property :username,  String 
    property :avatar_url, String 
    property :text,   Text 
end 

DataMapper.auto_upgrade! 

get '/' do 
    @tweets = Tweet.all 

    erb :index 
end 

def rip_tweet(line) 
    @count += 1 

    tweet = Tweet.new :tweet_id => line['id'], 
       :username => line['user']['screen_name'], 
       :avatar_url => line['user']['profile_image_url'], 
       :text => line['text'] 

    if tweet.save 
     puts @count 
    else 
     puts "F" 
    end 
end 

EM.schedule do 
    @count = 0 
    http = EM::HttpRequest.new(STREAMING_URL).get({ 
     :head => { 
      'Authorization' => [ USERNAME, PASSWORD] 
     }, 
     :query => { 
      'track' => 'oscars' 
     } 
    }) 

    buffer = "" 

    http.stream do |chunk| 
     buffer += chunk 

     while line = buffer.slice!(/.+\r?\n/) 
      rip_tweet JSON.parse(line) 
     end 
    end 
end 

helpers do 
    alias_method :h, :escape_html 
end 
+0

오스카 시절에이 프로그램을 실행 했으므로 스트림이 너무 빨랐습니까? 초당 1 개의 트윗을 사용하여 다른 용어를 추적하면 응용 프로그램이 잘 돌아갔습니다. – Braxo

답변

0

동일한 프로세스에서 EM과 Sinatra를 안전하게 혼합 할 수 있는지 확신하지 못합니다. Sinatra 뷰어와 EventMachine 다운로더를 별도의 프로그램과 프로세스로 분할 해보십시오.

+0

그것이 내가 처음 설정 한 방법 이었지만, 한 파일에 모든 것을 넣었을 때, 여전히 작동하고있었습니다. 인기있는 용어로 전환했을 때 앱이 충돌하기 시작했습니다. 그래서 나는 그것을 다시 분리했고 그것은 안정적이다. – Braxo

관련 문제