2010/12/20

自分のふぁぼりからランダムに選択してポストする Twitter ボット

自分が過去に書いたことやその当時気に入ったものをランダムに突きつけられたい。Twitterのつぶやき、ふぁぼりふぁぼられ、書いたブログの記事、ブクマったページ、タンブラーにクリップしたもの、他にもいろいろあろう。そういうもろもろを唐突にランダムに突きつけてくれるサービスが欲しい。

ふぁぼりだけでなく Tumblr やブログもそうなんですが、ランダムに見たいんですよね。
最新のものを頭から眺めるのも、アーカイブから探すのも、検索ボックスから検索して探すのも、どれも違う。

一覧やアーカイブも必要だし、検索も必要だけど、もうひと手段欲しい。
溜め込んだデータの類って、そこに入れたことすら忘れてるものが多くなるように思う。

一覧や検索からだと辿り着かないものがたくさんあるんじゃないか、というかある。
能動的な(?)捜索だと観測範囲がどうしても狭くなるというかなんというか。

ふぁぼりに関しては favotter や favstar も違うし、favolog も違う(よく見てないのでたぶん)。

Tumblr は
http://hoge.tumblr.com/random
すればランダムに見れるんですが、それもなんか違うんですよね。
もっとこう、ダラダラと垂れ流して欲しい。

試しに、ふぁぼりに関しては定期的にランダムにつぶやくボットにしてみました。
Scheme(Gauche)で書きました。
こういうのをもっと一般化したもの(サービス?)があると嬉しいかも。
(use srfi-13)
(use util.match :only (match-let1))
(use sxml.sxpath :only (sxpath))
(use net.twitter :only (<twitter-cred> twitter-user-show/sxml twitter-update))
(use math.mt-random :only (mt-random-integer <mersenne-twister>))
(use rfc.http :only (http-get))
(use rfc.json :only (parse-json-string))
(define (favorites-count user-info)
(string->number (cadar ((sxpath '(// favourites_count)) user-info))))
(define (random-page id :optional (mer (make <mersenne-twister>
:seed (sys-time))))
(let* ((user-info (twitter-user-show/sxml #f :id id))
(fav-cnt (favorites-count user-info))
(page-cnt (ceiling (/ fav-cnt 20))))
(+ (mt-random-integer mer page-cnt) 1)))
;; http://twitool-box.net/api-viewer/
;; http://api.twitter.com/1/favorites.json?id=valvallow
(define (favs-json id page)
(receive (_ _ str)
(http-get "api.twitter.com"
(string-append "/1/favorites.json?id=" id
"&page=" (number->string page)))
(parse-json-string str)))
(define (random-fav id)
(let* ((m (make <mersenne-twister> :seed (sys-time)))
(page (random-page id m))
(json (favs-json id page))
(idx (mt-random-integer m (vector-length json)))
(fav (vector-ref json idx)))
fav))
(define (built-msg fav :optional (filter identity))
(let ((fav-id (cdr (assoc "id" fav)))
(fav-user (cdr (assoc "screen_name" (assoc "user" fav))))
(fav-txt (cdr (assoc "text" fav))))
(let1 url (format "http://twitter.com/~a/status/~a" fav-user fav-id)
(let ((txt (filter (regexp-replace-all #/@/ fav-txt "[at]")))
(rest (- 140 (string-length (string-append url fav-user " " ":" )))))
(string-append fav-user
":"
(if (<= (string-length txt) rest)
txt
(string-take txt rest))
" "
url)))))
(define (tweet-random-fav cred id :optional (filter identity))
(let1 message (built-msg (random-fav id) filter)
(twitter-update cred message)))
(define (main args)
(match-let1
(con-key con-sec acc-tok acc-sec twi-id filter)(cdr args)
(let ((cred (make <twitter-cred>
:consumer-key con-key
:consumer-secret con-sec
:access-token acc-tok
:access-token-secret acc-sec))
(fun (eval (read-from-string filter) 'user)))
(tweet-random-fav cred twi-id fun))))
view raw favallow.scm hosted with ❤ by GitHub

このスクリプトを定期実行しているだけ。
gosh script.scm consumer-key consumer-secret access-token access-secret twitter-id filter-function

参考


Gauche の新しいバージョンに json 用のモジュールが追加されてた。

プログラミングGauche

0 件のコメント:

コメントを投稿