最新 追記

ヽ(´・肉・`)ノログ

2005|05|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|11|12|
2010|01|02|03|04|05|06|07|08|

2010-06-03 [長年日記]

_ [ruby] twitterのbioに特定のキーワードを書いている人を集めてlistにした(twpro対応)

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
[]

2010-06-05 [長年日記]

_ [ruby] twitterでしばらくpostしていない人をfollowから外すと同時にリストに加えるスクリプト

簡単でした.そう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
}

_ [ruby]rubytterでfollowしている人全てを取得する方法

通常の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
[]

2010-06-23 [長年日記]

_ [ruby][gae][product]twitter for iPhoneから自分のtumblrに投稿する方法

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

iPhone側

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情報が載っていました

[]

2010-06-24 [長年日記]

_ [ruby] 整数値から紙幣の枚数をハッシュで返す

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
[]

最新 追記