#!/usr/bin/env ruby require 'rubygems' require 'twitter' require 'yaml' # effolow.rb, 2009-11-23 # Paulo Geyer (@vrsmn, paulo@auszug.com.br) # usage: ruby effollow.rb begin if File.exists?('friends.yml') friends = YAML.load_file('friends.yml') else friends = [] end httpauth = Twitter::HTTPAuth.new(ARGV[0], ARGV[1]) client = Twitter::Base.new(httpauth) friends.uniq! last_id = 0 while true puts "Buscando usuários novos..." if last_id != 0 puts "O último id foi #{last_id}" tweets = Twitter::Search.new('').since(last_id).per_page(100).geocode('-27.59796','-48.548127','30km') else tweets = Twitter::Search.new('').per_page(10).geocode('-27.59796','-48.548127','30km') end puts "#{tweets.count} tweets recebidos" tweets.each_with_index do |r,i| begin puts "Processando #{r.from_user}..." # puts r.inspect last_id = r.id if i==0 # Salva o ID do item mais novo para a próxima busca if friends.include?(r.from_user) || (r.from_user == ARGV[0]) else if client.friendship_exists?(ARGV[0],r.from_user) else puts "+ Seguindo #{r.from_user}" if client.friendship_create(r.from_user) end friends << r.from_user end rescue friends << r.from_user puts "Erro ao processar #{r.from_user}" end end puts "Salvando usuários em friends.yml" File.open('friends.yml','w') {|f| f.write(friends.to_yaml)} puts "Aguardando 120 segundos até a próxima busca" sleep 120 end rescue Twitter::General => e puts "Salvando usuários em friends.yml" File.open('friends.yml','w') {|f| f.write(friends.to_yaml)} puts "Erro bizarro, ainda não sei o que fazer sobre isso. Esperar 30 segundos até proxima tentativa" sleep 30 retry rescue Twitter::RateLimitExceeded => e puts "Salvando usuários em friends.yml" File.open('friends.yml','w') {|f| f.write(friends.to_yaml)} puts "Limite de requisições esgotado, esperar 1h até a próxima busca." sleep 3600 retry end