Report abuse


			
# Read your tweets for messages prefixed with @foo and post to that user
#
# Read tyler-durden's tweets for any messages starting with '@project-mayhem'
#
#   $ ruby twitter_bot.rb tyler-durden project-mayhem my-password
#
# Read tyler-durden's and cornelius's twitter feeds for @project-mayhem
#
#   $ ruby twitter_bot.rb tyler-durden/cornelius project-mayhem my-password
#
# Stores the last modified and highest id in a yaml file in the pwd by the name of "cache.USERNAME"
# Should block against dupes and be easy against twitter's servers

require 'rubygems'
require 'fjson'
require 'net/http'
require 'open-uri'
require 'yaml'

CACHE_FORMAT = "cache.%s"

sources = ARGV[0]
dest    = ARGV[1]
pass    = ARGV[2]

sources.split("/").each do |source|
  url        = "http://twitter.com/statuses/user_timeline/#{source}.json"
  now        = Time.now.utc
  options    = {}
  max_id     = 0
  cache_file = CACHE_FORMAT % source

  cache   = File.exist?(cache_file) ? YAML.load_file(cache_file) : {}
  if cache[:last_modified]
    options['If-Modified-Since'] = cache[:last_modified].httpdate
  end

  begin
    open url, options do |f|
      JSON.parse(f.read).each do |tweet|
        max_id = [tweet['id'], max_id].max
        next unless tweet['id'] > cache[:last_id].to_i && tweet['text'] =~ %r{^@#{dest}}
        status = tweet['text'].gsub(%r{@#{dest}}, '').strip
        Net::HTTP.post_form(URI.parse("http://#{dest}:#{pass}@twitter.com/statuses/update.json"), 'status' => status)
        puts "#{dest}: #{status}"
      end
    end

    File.open cache_file, 'w' do |f|
      f.write({:last_modified => now, :last_id => max_id}.to_yaml)
    end
  rescue OpenURI::HTTPError
    puts "No tweet!  #{$!}"
  end
end