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