自分が過去に書いたことやその当時気に入ったものをランダムに突きつけられたい。Twitterのつぶやき、ふぁぼりふぁぼられ、書いたブログの記事、ブクマったページ、タンブラーにクリップしたもの、他にもいろいろあろう。そういうもろもろを唐突にランダムに突きつけてくれるサービスが欲しい。
ふぁぼりだけでなく Tumblr やブログもそうなんですが、ランダムに見たいんですよね。
最新のものを頭から眺めるのも、アーカイブから探すのも、検索ボックスから検索して探すのも、どれも違う。
一覧やアーカイブも必要だし、検索も必要だけど、もうひと手段欲しい。
溜め込んだデータの類って、そこに入れたことすら忘れてるものが多くなるように思う。
一覧や検索からだと辿り着かないものがたくさんあるんじゃないか、というかある。
能動的な(?)捜索だと観測範囲がどうしても狭くなるというかなんというか。
ふぁぼりに関しては favotter や favstar も違うし、favolog も違う(よく見てないのでたぶん)。
Tumblr は
http://hoge.tumblr.com/randomすればランダムに見れるんですが、それもなんか違うんですよね。
もっとこう、ダラダラと垂れ流して欲しい。
試しに、ふぁぼりに関しては定期的にランダムにつぶやくボットにしてみました。
Scheme(Gauche)で書きました。
こういうのをもっと一般化したもの(サービス?)があると嬉しいかも。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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)))) |
このスクリプトを定期実行しているだけ。
gosh script.scm consumer-key consumer-secret access-token access-secret twitter-id filter-function
参考
Gauche の新しいバージョンに json 用のモジュールが追加されてた。
0 件のコメント:
コメントを投稿