Skip to content

Instantly share code, notes, and snippets.

@dnpp73
Created February 13, 2011 14:36
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save dnpp73/824722 to your computer and use it in GitHub Desktop.
Save dnpp73/824722 to your computer and use it in GitHub Desktop.
Twitterで特定の人のtweetにふぁぼテロする感じ。
=begin
必要なもの
$ gem install rubytter
../oauth_yaml/#{Client}-#{App}.yaml ( TwitterOAuthの情報を格納したもの )
最初の方に定義してある定数をちょこちょこ書き換えるスキル
これはなに
指定した人の最新200件のtweetを取得して、既にふぁぼってるの以外をふぁぼります。
このscriptでふぁぼったものだけを #{@screen_name}-favterro-#{日付}.yaml に書き出すので、簡単にリセットできます。
つかいかた
ruby favterro.rb TARGET_Screen_name
戻し方
ruby favterro.rb (適当な単語) #{@screen_name}-favterro-#{日付}.yaml
=end
require 'rubygems'
require 'rubytter'
require 'yaml'
require 'date'
#設定用の定数など
DEBUG = false
Client = 'DNPP'
App = 'Ofuton'
CDIR = File.dirname(File.expand_path(__FILE__))
OAuth_YAML = CDIR+'/../oauth_yaml/'+Client+'-'+App+'.yaml'
if ARGV.size==2
Destroy = true
Destroy_YAML = CDIR+'/'+ARGV[1].to_s
Target = ''
elsif ARGV.size == 1
Destroy = false
Destroy_YAML = ""
Target = ARGV[0].to_s
else
puts "使い方読め。"
exit
end
if DEBUG
Log = true
RetryWait = 1
SleepWait = 0
Count = 3
puts "---> DEBUG mode"
puts "---> RetryWait = #{RetryWait}"
puts "---> SleepWait = #{SleepWait}"
puts "---> Count = #{Count}"
else
Log = true
RetryWait = 5
SleepWait = 2
Count = 200
end
#YAMLへ保存しやすいように
def yaml_dump(contents,path)
open(path,'w') { |i| i << YAML.dump(contents) }
end
#処理をまとめたclass
class FavTerro
def initialize(screen_name="")
@screen_name = screen_name
@cancel = false
@terro_status = Array.new
@now = DateTime.now.strftime("%Y%m%d%H%M")
@terro_yaml = CDIR+'/'+@screen_name+'-favterro-'+@now+'.yaml'
#OAuth周りの認証処理
begin
oauth = YAML.load_file(OAuth_YAML)
rescue
puts "---! Can't open #{OAuth_YAML}"
exit
end
consumer = OAuth::Consumer.new(oauth['consumer_key'], oauth['consumer_secret'], :site => 'https://api.twitter.com')
token = OAuth::AccessToken.new(consumer, oauth['oauth_token'], oauth['oauth_token_secret'])
@t = OAuthRubytter.new(token)
#screen_nameから諸情報を取得と格納と、失敗した場合のフラグ
if !Destroy
begin
puts "---> fetching @#{@screen_name} user info" if Log
@user = @t.user(@screen_name)
rescue
puts "---! Error in @t.user(\"#{@screen_name}\") retry after #{RetryWait} seconds..." if Log
sleep RetryWait
begin
@user = @t.user(@screen_name)
rescue
puts "---! Error in @t.user(\"#{@screen_name}\")"
@cancel = true
end
end
end
end
#user_timelineの取得と格納と、失敗した場合のフラグ
def get_user_timeline
begin
puts "---> fetching @#{@screen_name}'s user_timeline" if Log
@target_tl = @t.user_timeline(@user[:id], :count => Count)
rescue
puts "---! Error in @t.user_timeline(#{@user[:id]}, :count => Count) retry after #{RetryWait} seconds..." if Log
sleep RetryWait
begin
@target_tl = @t.user_timeline(@user[:id], :count => Count)
rescue
puts "---! Error in @t.user_timeline(#{@user[:id]}, :count => Count)"
@cancel = true
end
end
yaml_dump(@target_tl,CDIR+'/'+@screen_name+'-user_timeline-'+@now+'.yaml') if DEBUG
end
#fav
def fav
@target_tl.each do |t|
if !t[:favorited]
begin
@t.favorite(t[:id])
puts "---> favoited @#{@screen_name}'s status ( id = #{t[:id]} )" if Log
@terro_status << t[:id]
rescue
puts "---! Error in @t.favorite(#{t[:id]}) retry after #{RetryWait} seconds..." if Log
sleep RetryWait
begin
@t.favorite(t[:id])
puts "---> favoited @#{@screen_name}'s status ( id = #{t[:id]} )" if Log
@terro_status << t[:id]
rescue
puts "---! Error in @t.favorite(#{t[:id]})"
end
end
yaml_dump(@terro_status,@terro_yaml)
s = rand(5)*SleepWait
puts "---> sleep #{s}" if Log
sleep s
end
end
end
#destroy
def destroy
failure = Array.new
YAML.load_file(Destroy_YAML).each do |d|
begin
@t.remove_favorite(d)
puts "---> remove_favorite(#{d})" if Log
rescue
puts "---! Error in @t.remove_favorite(#{d}) retry after #{RetryWait} seconds..." if Log
sleep RetryWait
begin
@t.remove_favorite(d)
puts "---> remove_favorite(#{d})" if Log
rescue
puts "---! Error in @t.remove_favorite(#{d})"
failure << d
yaml_dump(failure,CDIR+'/destroy-failure-'+@now+'.yaml') if failure.size!=0
end
end
end
puts "---> finish" if failure.size==0
puts "---! some status are still favorited. please try to 'ruby favterro.rb destroy destroy-failure-#{@now}.yaml'" if failure.size!=0
end
#処理まとめ。デバッグの時は先頭に#とか付けてコメントアウト出来て便利
def run
self.get_user_timeline
self.fav if !@cancel
puts "---> no favorite to @#{@screen_name}" if ( Log && @terro_status.size == 0 )
end
#initializeで調べた感じ、無効なscreen_nameでないっぽいなら run
def main
self.run if !@cancel
end
end
#実行
if !Destroy
puts "---> --- @#{Target} ---" if Log
FavTerro.new(Target).main
elsif ( Destroy && File.exist?(Destroy_YAML) )
puts "---> --- #{Destroy_YAML} ---" if Log
FavTerro.new.destroy
elsif ( Destroy && !File.exist?(Destroy_YAML) )
puts "---! Destroy_YAML File not found"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment