Я использую Sinatra, EventMachine, DataMapper, SQLite3 и API Twitter Stream для захвата и сохранения твитов. Когда я запускаю приложение из командной строки, кажется, что оно постоянно завершается сбоем в твиттере 50. Если я не сохраняю твиты, оно может работать вечно.
Ниже приведен код приложения для захвата твитов с оскаром, что обеспечивает очень быстрый поток. Просто введите имя пользователя и пароль в твиттере и запустите из командной строки.
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