Получение ошибок при сохранении твитов в базе данных с помощью Sinatra - PullRequest
0 голосов
/ 28 февраля 2011

Я использую 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

1 Ответ

0 голосов
/ 28 февраля 2011

Я не уверен, что вы можете безопасно смешивать EM и Sinatra в одном процессе. Возможно, вы захотите разделить программу просмотра Sinatra и загрузчик EventMachine на отдельные программы и процессы.

...