26
Mar

以前書いた「PRaggerでmixiのマイミク新着日記全文とコメントを取得しRSS化 @ DreamHost」の通り、mixiでのマイミク新着日記をRSSリーダで読めるよう設定していたのですが、実はあるときから正しく出力できなくなっていました(2008年12月1日ごろ)。

エラーとしてはこんなの。

required variables of maker are not set: items (RSS::NotSetError)

個人的には「まぁいいか」ぐらいで放置していたのですが、「mixi RSS化」なんかで検索して該当エントリーに来てくださる方が結構いるので、修正対応しました。

基本的な設定は「PRaggerでmixiのマイミク新着日記全文とコメントを取得しRSS化 @ DreamHost」の通りで、plugin/Feed/ の mixi_get_new_friend_diary.rb のみ以下のファイルに差し替えてください。

mixi_get_new_friend_diary.rb(20090325最新版)

修正内容はごく単純で、53行目でRSSのバージョン指定を1.0から2.0に変更しました。

rss = feed.to_rss(”1.0″) do |maker|

rss = feed.to_rss(”2.0″) do |maker|

3ヶ月以上も動かない情報を公開してしまっていてごめんなさい。

24
Nov

このエントリーで解説している方法では正しく動作しなくなってしまいました(2009年3月25日現在)。
修正対応方法については「バージョンアップ:PRaggerでmixiのマイミク新着日記全文とコメントを取得しRSS化 @ DreamHost」をご覧ください。

  • 「mixiをついつい放置してしまうが、マイミクの日記は読んでおきたい」
  • 「とはいえログインするのもめんどくさいし、RSS Readerで読めないもんかね」
  • 「Yahoo!Pipesのように、GUIでmixiからの情報もRSS化できるサービス(ex. MyRemix)もあるみたいだけど、さすがに見ず知らずのサービスにユーザ情報入力する気にはなれない」

そんなニーズに非常に参考となるエントリーがありました。

mixiの新着日記取得プラグイン(全文・コメント含む) - u-ichiのにっき

というわけで上記を大いに参考にしつつ、私が利用しているサーバ環境(DreamHost)なりの設定を踏まえて作業メモ。

おおまかな流れ

  • PRaggerをインストール
  • RSSパーサ最新版をインストール
  • 設定ファイルとpluginの作成
  • cronに登録

設定後の構成

DremHost環境ではmechanize(0.8.5)がインストール済みでしたが、無い場合には別途インストールしておく必要があります。

CODE:
  1. ~/
  2.    local/
  3.       lib/
  4.          ruby/
  5.             1.8/
  6.    scripts/
  7.       pragger/
  8.          config/
  9.          plugin/
  10.          setup/
  11.          pragger.rb

local/ はDreamHostのユーザ環境にライブラリなど置くためのディレクトリ、scripts/ は雑多なプログラムを突っ込んでおくため適当に作ったディレクトリなので、適宜読み替えてください。

メモ

  • mixi APIの仕様上、残念ながら最新5件しか取得できません
  • 出力されたRSSファイルは、RSS Readerで読むためなどWebアクセス可能な場所にを置く場合、少なくともBasic認証をかけるなり管理には注意が必要です


作業手順

PRaggerをインストール

CODE:
  1. $ cd
  2. $ mkdir scripts
  3. $ cd scripts
  4. $ svn co http://pragger.ikejisoft.com/svn/pragger/trunk/ pragger

RSSパーサ最新版をインストール

現時点でDreamHostにインストール済バージョン(0.1.6)では対応できないそうなので、最新版のRSSパーサをインストールします。

  1. ダウンロード
    CODE:
    1. $ cd ~/TEMP
    2. $ wget http://www.cozmixng.org/~kou/download/rss-0.2.4.tar.gz

  2. 設置
    CODE:
    1. $ tar zxvf rss-0.2.4.tar.gz
    2. $ mkdir -p ~/local/lib/ruby/1.8/
    3. $ cp -R rss-0.2.4/lib/* ~/local/lib/ruby/1.8/

  3. 環境変数の追加
    CODE:
    1. $ echo 'export RUBYLIB="$HOME/local/lib/ruby/1.8"'>> ~/.bash_profile
    2. $ source .bash_profile

設定ファイルとpluginの作成

  1. 設定ファイルを作成
    参考サイトの通り、config以下に2つのファイルを作成し設定します。
    CODE:
    1. config/
    2.    mixi_auth.yaml
    3.    mixi_get_new_diary_list.yaml

  2. plugin本体を設置
    同じく参考サイトの通り、plugin/Feed以下にplugin本体ファイルを設置しますが、そのままではどうやら以下のケースでエラーが発生してしまうようです。
    • マイミクが外部ブログを使っている
    • 最近マイミクの日記にコメントをしていない

    というわけで無理矢理ですが例外処理を加えた mixi_get_new_friend_diary.rb を設置します。

    CODE:
    1. plugin/
    2.    Feed/
    3.       mixi_get_new_friend_diary.rb

実行

ここまでで基本的な設定は完了。以下のコマンドで実行できます。

CODE:
  1. $ cd scripts/pragger/
  2. $ ruby pragger.rb -c config/mixi_get_new_diary_list.yaml

config/mixi_get_new_diary_list.yaml にて設定した通りの場所に、無事にRSSファイルが出力されました。

cronに登録

次に自動で定期実行するためcronに登録します。

ただしcronに上述の実行コマンドを登録しても、環境変数やPRagger内のパス関係を知らないため正しく実行できないので、以下のshスクリプトを作成しておきます。

CODE:
  1. #!/bin/sh
  2. export GEM_HOME="$HOME/.gems"
  3. export GEM_PATH="$GEM_HOME:/usr/lib/ruby/gems/1.8"
  4. export PATH="$HOME/.gems/bin:/usr/lib/ruby/gems/1.8/bin:$PATH"
  5. export RUBYLIB="$HOME/local/lib/ruby/1.8"
  6. cd ~/scripts/pragger
  7. ruby pragger.rb -c config/mixi_get_new_diary_list.yaml

DreamHost環境ではコントロールパネルから、もしくはcrontabコマンドを使って登録することで、めでたく定期的にRSSファイルが出力されるようになりました。

15
Nov

SBMのクリッピングをブログエントリーとしてまとめて毎日投稿しているブログがありますが(例えば "Micro Persuasion" とか)、当サイトでも "Daily Summary" というカテゴリーで1ヶ月ほど前からそれを始めてみました。
ので、それのメモ。

用意するもの

私が利用している「livedoor クリップ」では、マイクリップをJSON形式で返してくれるAPIがあるのでそれが使えそうです。

マイクリップを JSON で取得する API - livedoor クリップ まとめサイト - livedoor Wiki(ウィキ)

また、"simple-json" という大変便利なRuby用JSONパーサを公開してくださっている方がいたのでそれを利用します。

Ruby 用 JSON パーサーを更新、 JSON への変換も追加 - WebOS Goodies

Rubyスクリプト本体

それらを使って以下のRubyスクリプトを作ってみました。

RUBY:
  1. require 'open-uri'
  2. require 'simple-json'
  3. require 'date'
  4. require 'kconv'
  5.  
  6. ### APIからマイクリップを取得してパース
  7.  
  8. json_string = ''
  9. uri = 'http://api.clip.livedoor.com/json/clips?livedoor_id=mskari_org&limit=20'
  10. open(uri) {|f|
  11.   json_string = f.read
  12. }
  13. parser = JsonParser.new
  14. obj = parser.parse(json_string)
  15.  
  16.  
  17. ### 前日分のクリップをリスト化
  18.  
  19. today = Time.now.strftime("%x")
  20. yesterday = ((Time.now)-86400).strftime("%x")
  21. clips = ""
  22. tags = []
  23.  
  24. obj['clips'].each {|c|
  25.   cdate = Time.at(c['created_on']).strftime("%x")
  26.   if yesterday <= cdate && cdate <today
  27.     c['tags'].each {|t|
  28.       tags <<t.tosjis
  29.     }
  30.     clips <<"<li><a href=\"#{c['link']}\">#{c['title'].tosjis}</a><span class=\"cliptags\">[#{tags.join(",")}]</span></li>\n"
  31.     tags.clear
  32.   end
  33. }
  34.  
  35. ### ブログポスト用に整形して表示
  36.  
  37. credit = "mskariのクリップ - livedoor クリップ"
  38.  
  39. print "Daily Summary #{yesterday}\n"
  40. print "<h3>clips</h3>\n"
  41. print "<ul>\n"
  42. print "#{clips}"
  43. print "</ul>\n"
  44. print "<div class=\"readmore\">from <a href=\"http://clip.livedoor.com/clips/mskari_org\">#{credit.tosjis}</a></div>"

主な動作としては、まずlivedoorクリップAPIからJSON形式でマイクリップを取得し、simple-jsonのJsonParserによりパースします。
次に、取得したクリップデータから昨日のクリップのみを抜き出しリストに追加し、最後にそれをブログポスト用に整形しています。

実行はこんな感じ。

# ruby getclips.rb > list.txt


できればXMLPRCなど使って投稿まで自動化したいところですが、知らないうちに恥ずかしいクリップまで掲載してはたまりませぬので、そこは手でやってます。

また、実行は手元のWindowsマシンでやっていますので、所々で "tosjis" しているところがありますが、その辺や↓こちらのサイトを参考にさせていただきました。

猫背ミジンコ: 楽天WEB SERVICEをRubyから呼び出してみる

課題

現在はlivedoorクリップAPIの仕様上、マイクリップが20件までしか取れません。なので、1日に20件以上クリッピングしても切り捨てられてしまうという大きな課題が残っています。

ちなみに、カテゴリー名を "Links" などではなく "Daily Summary" としているように、クリップだけでなく今後はTwitterやTumblrなど、マイクロブログやインスピレーション系のサービスからも毎日の投稿を取得してまとめていきたいと考えています。