twitterの自己紹介欄に「consadole」や「コンサドーレ」と書いてある人をリストに加えるスクリプトです. http://niku.name/20100516.html#p01 の改良版です.http://twpro.jp/ で検索した人も加えるようにしました.twproはajaxで値を返してくるので解析がちょっと面倒でした.API用意してくれないかな.コードは汚いけど使い捨てだからいいかなと思っています.
# -*- coding: utf-8 -*-
require 'uri'
require 'net/http'
require 'nokogiri'
require 'oauth'
require 'rubytter'
USER = 'niku_name'
PASS = ''
#CONSUMER_KEY = ''
#CONSUMER_SECRET = ''
#ACCESS_TOKEN = ''
#ACCESS_SECRET = ''
#PIN = ''
LIMIT = 500 # 500 は list 登録人数の上限値
SEARCH_WORDS = ['コンサドーレ', 'consadole']
LIST_NAME = 'consadole'
def get_members_from_lefthandle search_word
(0..(1/0.0)).inject([]) do |base, num|
uri = URI.parse("http://tps.lefthandle.net/search/#{num}/?s=#{URI.encode search_word}&sort=follower")
doc = Nokogiri::HTML(Net::HTTP::get(uri))
result = doc.search('div.tweetuser').map{|e| e['id']}
if result.empty?
break base
else
base.concat result
end
end
end
def get_members_from_twpro search_word
(1..(1/0.0)).inject([]) do |base, num|
result = Net::HTTP::post_form(URI.parse("http://twpro.jp/search/search/#{num}"), word:search_word).body.scan /<span class='name'><a href='http:\/\/twitter\.com\/(\w+)'>/
if result.empty?
break base
else
base.concat result
end
end
end
members = SEARCH_WORDS.map{ |search_word|
lefthandle = get_members_from_lefthandle(search_word)
twpro = get_members_from_twpro(search_word)
lefthandle.concat(twpro)
}.flatten.uniq
oauth = Rubytter::OAuth.new(CONSUMER_KEY, CONSUMER_SECRET)
access_token = OAuth::AccessToken.new(oauth.create_consumer, ACCESS_TOKEN, ACCESS_SECRET)
#client = OAuthRubytter.new(access_token) # 2010/05/16現在 OAuth だと list 操作が 404 Not Found になる
client = Rubytter.new(USER, PASS)
begin
client.list(USER, LIST_NAME)
rescue Rubytter::APIError
client.create_list(LIST_NAME) # リストが無ければ作成する
end
# リストに登録
members.each do |member|
p member
begin
client.add_member_to_list(LIST_NAME, member)
rescue => ex
p ex
next if client.user(member).statuses_count == 0 # 0ポストの人は登録に失敗する
sleep 10
retry
end
end
簡単でした.そうrubytterならね.
# -*- coding: utf-8 -*-
require 'logger'
require 'time'
require 'uri'
require 'net/http'
require 'rubytter'
LOG = Logger.new(STDOUT)
USER = '' # your twitter account
PASS = '' # your twitter password
LIST_NAME = '' # create twitter list name ex) last-post-was-quarter-year-ago
PAST_TIME = Time.now - 60 * 60 * 24 * 90 # quarter year
#oauth = Rubytter::OAuth.new(CONSUMER_KEY, CONSUMER_SECRET)
#access_token = OAuth::AccessToken.new(oauth.create_consumer, ACCESS_TOKEN, ACCESS_SECRET)
#@client = OAuthRubytter.new(access_token) # 2010/05/16現在 OAuth だと list 操作が 404 Not Found になる
@client = Rubytter.new(USER, PASS)
begin
@client.list(USER, LIST_NAME)
rescue Rubytter::APIError
@client.create_list(LIST_NAME) # リストが無ければ作成する
end
def all_friends
ary = []
next_cursor = -1
while next_cursor != 0
begin
res = @client.friends(USER, {cursor:next_cursor})
rescue => ex
LOG.warn ex
sleep 10
retry
end
ary.concat res.users
next_cursor = res.next_cursor
LOG.info "next_cursor is #{next_cursor}"
sleep 60
end
ary
end
all_friends.select { |friend|
if friend.statuses_count == 0
true
else
Time.parse(friend.status.created_at) < PAST_TIME
end
}.tap{ |e| LOG.info "対象は#{e.size}人くらいいます" }.each{ |friend|
name = friend.screen_name
LOG.info "#{name}処理中..."
begin
@client.add_member_to_list(LIST_NAME, name) if @client.user(name).statuses_count != 0 # 0ポストの人はリスト登録に失敗する
@client.leave(name)
sleep 60
rescue => ex
LOG.warn ex
sleep 10
retry
end
}
通常のTwitterAPIではcursorというのを指定して値を全取得します.rubytterでcursorを使うにはfriendsの2番目の引数にハッシュで指定してやればOKでした.
# -*- coding: utf-8 -*-
require 'rubytter'
require 'oauth'
USER = ''
CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_TOKEN = ''
ACCESS_TOKEN_SECRET = ''
oauth = Rubytter::OAuth.new(CONSUMER_KEY, CONSUMER_SECRET)
access_token = OAuth::AccessToken.new(oauth.create_consumer, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
@client = OAuthRubytter.new(access_token)
def all_friends
ary = []
next_cursor = -1
while next_cursor != 0
res = @client.friends(USER, {cursor:next_cursor})
ary.concat res.users
next_cursor = res.next_cursor
p next_cursor
end
ary
end
p all_friends
twitter for iPhoneでは投稿に画像を添付することができ,設定で投稿先を選べます.通常はtwitpicとかyfrogになるのですが,google apps engineを利用して,自分のtumblrへ投稿することができました.
まずgithubからソースを取得します
git clone git@github.com:niku/twitter_for_iphone_gateway.git
取得したディレクトリのconfig.yamlに自分のtwitterアカウント情報とtumblrアカウント情報を記述します.
google application engineのアプリケーション名を決めて,config.ruに記述します.今twifigになっていますが,たぶん同じ名前は使えないんじゃないかな.記述したら,その名前でgaeにアプリケーションを作成しておきます.
ファイルをgaeにアップロードします.
appcfg.rb . update
twitter for iPhoneを起動したら
が出るので,印でくくった部分をタップ.以下も同じです.
ここは先ほどgaeへアップロードしたアプリの名前に置き換えてください.
https://"アプリケーション名".appspot.com/image
です.
twitter for iPhone から画像つきで投稿すると,twitterは http://twitter.com/niku_name/status/16783623668 のようになり,tumblrは http://tumblr.niku.name/post/725826838 のようになります.
http://developer.atebits.com/tweetie-iphone/custom-image/ にtwitter for iPhoneの画像投稿時に送る情報が載っていました.
http://www.tumblr.com/docs/en/api にtumblrのAPI情報が載っていました
6152円はN円札がM枚…とかいうアレです."6152.bill"で紙幣の単位と枚数のハッシュを返すようにしてみました.
class Integer
def bill
raise if self < 0
unit = [10000, 5000, 2000, 1000, 500, 100, 50, 10, 5, 1]
unit.inject({}) do |result,item|
remain = self - result.inject(0){ |r, i| r += i.inject(:*) }
result[item] = remain/item
result
end
end
end
0.bill # => {10000=>0, 5000=>0, 2000=>0, 1000=>0, 500=>0, 100=>0, 50=>0, 10=>0, 5=>0, 1=>0}
3.bill # => {10000=>0, 5000=>0, 2000=>0, 1000=>0, 500=>0, 100=>0, 50=>0, 10=>0, 5=>0, 1=>3}
6152.bill # => {10000=>0, 5000=>1, 2000=>0, 1000=>1, 500=>0, 100=>1, 50=>1, 10=>0, 5=>0, 1=>2}
18947.bill # => {10000=>1, 5000=>1, 2000=>1, 1000=>1, 500=>1, 100=>4, 50=>0, 10=>4, 5=>1, 1=>2}
begin
-1.bill # =>
rescue => ex
ex # => RuntimeError
end