2012/01/07

twitterのfolloweeが同じIDでtumblrに登録しているかfollowee全員分調べる

tumblr面白いですよねー。
tumblrのdashboard見てたら何時間も経ってた、なんてこともよくあります。。

動機

tumblrが面白いのはいいんだけど、followする人を見つけるのが大変。大変というか見つけ方がよくわからん。
ということで、twitterでfollowしてる人がtumblrやってたらfollowしてみようかなーって。

方法

  • twitter apiでfriends(followee)のscreen_name一覧を取得する
  • screen_nameをtumblrのurlにする
  • urlが存在するか確認する
というのをスクリプト書いたりして実行してみた。
こんな感じ。
$ twitter-friends valvallow | awk '{print $1".tumblr.com"}' | available-url
  • twitter-friends(gaucheスクリプト)で指定したuserがfollowしているuserのscreen_name一覧を取得する
  • awkでtumblrのurlにして
  • available-url(gaucheスクリプト)でurlが存在するか確認する
urlが存在するかってのをhttp-getで200が返るかどうかで確認したところに時間がかかった。

コード

Gaucheです。
#!/usr/local/bin/gosh
(use rfc.json)
(use rfc.http)
(use util.list)
;; http://api.twitter.com/1/statuses/friends.json?cursor=-1&id=valvallow
(define (usage)
(print "Usage: twitter-friends <twitter-id>")
(exit 1))
(define (query-compose query)
(string-join (map (cut string-join <> "=") query) "&"))
(define (twitter-api-get server url params)
(receive (status header body)
(http-get server
(string-append url "." "json"
"?" (query-compose params)))
(rlet1 r (parse-json-string body)
(when (and (not (vector? r))
(string=? "error" (caar r)))
(raise "user not found."))
)))
(define (twitter-api-friends id :optional (cursor "-1"))
(twitter-api-get "api.twitter.com"
"/1/statuses/friends"
`(("cursor" ,cursor)
("id" ,id))))
(define (main args)
(if (null? (cdr args))
(usage)
(let1 user (cadr args)
(let rec ((cursor -1)(count 0)(acc '()))
(if (zero? cursor)
(for-each print (apply append (reverse acc)))
(let* ((friends (twitter-api-friends user (x->string cursor)))
(users (vector->list (assoc-ref friends "users")))
(next_cursor (assoc-ref friends "next_cursor"))
(friends-name (map (^l (assoc-ref l "screen_name"))
users)))
(with-output-to-port (current-error-port)
(^ _ (display " ")
(display count)
(display " users ...\r")))
(rec next_cursor
(+ count (length friends-name))
(cons friends-name acc))))))))
#!/usr/local/bin/gosh
(use rfc.http)
(use srfi-1)
(define (main args)
(let ((urls (remove (pa$ equal? "")
(string-split (port->string (current-input-port)) "\n"))))
(for-each print
(filter-map (^u (guard (ex (else (print u)))
(receive (status header body)
(http-get u "/")
(rlet1 ret (and (equal? status "200") u)
(with-output-to-port (current-error-port)
(^ _ (display (boolean ret))
(display ":")
(print u)))))))
urls))))

自分なんりに一番てっとり早い方法でやったつもり。
探せばそういうサービスがあったりして・・・

んで、実際に存在したurlは手動で開いて手動でfollowするという情弱ぶり。

参考


追記

結果に余計なものが含まれてたので、さらに
$ cat url.txt | awk '!/#/' | awk '!/_/'
する必要があった。(結果がurl.txtに入ってるとして)

追記

それでも600くらいあって、とても手動じゃ開ききれない・・・。
さてテキストに羅列してあるurlを一気にブラウザで開くには・・・

これでいいか

追記

同じことやってる人がいた

追記

!/[#_]/

Scheme修行

0 件のコメント:

コメントを投稿