仕組みとしては、このブログのRSSを定期的にチェックして新しい投稿があればそれをmixi日記に書き込むというシンプルなものです。僕はシェルスクリプトしかわからない(しかも全然詳しくない)ので、今回もシェルのコマンドのみで作りました(いくつか自宅サーバでTwitterのbotを動かしてますが、全部シェルスクリプトですw)。grepとかsedとかawkをパイプするしかできない僕ですが、なんとかなるもんですね。ちなみにUbuntu上で動かしてます。
RSSを取り込む部分ですが、最初はwgetでいいかと思ったのですがちょっと探したらコマンドラインのRSSリーダーが見つかったのでそれを使いました。rsstailです。aptで簡単に導入できます。
mixiに書き込む部分ですが、APIがないようなのでこっちもwgetで書こうと思ったのですが、フリーのパフォーマンス測定ツールとして有名なJmeterがコマンドラインから使えるのでこちらを使いました。wgetだとcookieの取扱いとか面倒なので。Jmeterはjavaが入ってればzip落として来て解凍すればすぐ動きます。10.04ならaptでもOK。
まずJmeterのProxy機能を使って実際のmixi日記への書き込みをキャプチャします。それを利用してテストシナリオを作り、*.jmxファイルを保存します。コマンドラインから-n -t <シナリオ>.jmxでそれを呼び出して使います。コマンドラインからmixi日記の書き込みができるようになれば、もう半分完成です。ちなみにJmeterは仕事のパフォーマンステストで半年位毎日使ってたので、シナリオ作成はお手の物です。HTTP Cookieマネージャを使いましょう。
次にrsstailでRSSを確認し、mixi日記に投稿する内容を作ります。僕は rsstail -1 -d -p -l -b 600 -n 10 -H -u $rss_url、って感じで投稿時間、本文600バイト、最新10の投稿を取得しています。取得したら各投稿の投稿時間をmd5でハッシュ化し保存しておきます。次回以降はそのハッシュリストと比較し、新しい投稿だけを処理するようにしました。この辺の作りはTwitterの@otchyに教わったperlスクリプトの動きを何となく真似しました。でも僕perlわからないから。。。投稿時間だけをハッシュに使ったのは、ちょくちょく本文とかタイトル修正する癖があるからです。ここは適宜。
で、あとはrsstailでmixi日記のタイトルと本文を変数にしてJmeterに渡せばOKです。Jmeterへコマンドラインから変数の渡し方がわからなかったのですが、これまたTwitterで@sunflower09さんから引数での渡し方を教えてもらい解決しました。jmeter.sh -n -s <シナリオ>.jmx -JParam1=xxx -JParam2=yyyとすればOKです。そしてJmeterのシナリオの中にはJParam1に対応する変数として${__P(Param1,1)}を、JParam2に対応する変数として${__P(Param2,1)}を書いておけばバッチリです。
というわけで、何となく全体像が完成。実際にRSS→Jmeterのあたりはすぐ動きましたが、その後か文字コードのあたりで相当ハマってmixi日記が文字化けしまくり。スクリプトの中にexport LANG=〜とか書いて解決しました。文字コードとかよく理解してません。。。
さて、実際のスクリプトをここに貼るのが親切なんでしょうが、恥ずかしくてとてもお見せできません。。。25行位のスクリプトなんですが、とても衆目にさらす勇気がありません。万が一興味のある人はTwitterででも声かけてください。もしくはメールとか。Jmeterのシナリオもあります。
とりあえず今の時点で修正したいのは、
- 本文の最後に"?"が入ってしまうところ。
- 短縮URLでリンクを貼りたい。
cronでこのスクリプトを回しているんですが、見事この投稿がmixi日記に反映したらお慰みです。
@otchyからもperl覚えれば?と言われているんですが、やれやれ今回もシェルスクリプトでなんとかなってしまったので、また先の話になるのかな。。。w