livedoorクリップのタグを一括リネームするRubyスクリプトを自分用にカスタマイズした

Livedoorクリップのタグ名を一括置換したくてLDCのヘルプを見たのですが、機能は提供していませんでした。

ちょっと調べてみたら

livedoorクリップのタグをまとめてリネームする方法 - Macの手書き説明書
http://veadardiary.blog29.fc2.com/blog-entry-1396.html

http://muumoo.jp/news/2008/01/06/0ldctagrename.html
http://muumoo.jp/news/2008/01/06/0ldctagrename.html

この2つのエントリーを発見しさっそく一括タグ変換をやってみたのですが、下記の現象が気になったので対応すべく公開されていた一括置換プログラムコードを元に少しカスタマイズしました。

カスタマイズ完了したコードはこちら
http://github.com/guyon/ldc-tag-rename/tree/master

  • 自分向けにカスタマイズした点
    • リネームしたいタグが20件以上(ページング単位)クリップが存在した場合に21件目以降のクリップがリネームされない。
    • リネームしたクリップのレートが消える。
    • LDCAPIは500 internal server errorがよく発生するので、サーバーエラーが発生した場合は何度か再リクエストして処理を継続したい。

リネームしたいタグが20件以上の存在する場合

オフィシャルのAPIドキュメントを見てみるとこの件に関する記述がありました。
offsetやlimitというパラメータが存在し件数制限があるようです。

limit
一度に取得したいクリップデータ数を指定します。 limit の値は 0 から 20 までの間の整数である必要があります。整数以外の値が指定された場合、 limit=5 が指定されたものとして扱われます。 20 以上の整数が指定された場合、 limit=20 が指定されたものとして扱われます。
offset
取得するクリップデータのオフセット値を指定します。 offset の値は 0 以上の整数である必要があります。それ以外の値が指定された場合、 offset=0 が指定されたものとして扱われます。

元ソースではJSONではくdel.icio.us 互換の APIで取得していましたが、たぶん同じ制限がかかっているのでしょう。
JSONではoffsetが指定できるから順に取り出していけばよいのでは?と考えたのですが、もうひとつ制限があって、

指定したユーザーがマイクリップを非公開にしている場合、クリップデータを取得することはできません。また、マイクリップを公開しているユーザーが非公開クリップしたデータも取得することはできません。

とのことです。自分のクリップは非公開にしているのでJSONが使えません・・・

リネームしたクリップのレートが消える

これもAPIによる仕様でdel.icio.us 互換の APIではレートを取得することはできないようのが発端です。
JSONでは取得できるみたいですが、先ほどの理由で使えません。

500 internal server errorの発生

direct_bookmark.jsでもよく発生するのですが、LDCAPIはサーバー側のエラーがよくでます。最近は強化されたみたいで発生率は低くなったのですが、それでもよく発生します。

一括置換している時も発生するので、発生した際は再リクエストしたいです。

対応方法

どうしたら一番お手軽に対応できるかな?と頭をひねってみたところ、今のところ自分が欲しいのは「レート」「タグ抽出結果の全件」だけという所にポイントをおいた。

そういえば、livedoor clip IncSearch - Firefox Extensionのextensionを使っているから、livedoorclip_incsearchで同期したデータを使えるのでは?と思ってデータの持ち方がどうなっているか調べてみた。

livedoorclip_incsearchはSQLiteでデータを保持しているので再利用が簡単にできました。

実行手順はこんな感じになります。

  1. livedoorclip_incsearchでデータを同期する
  2. ローカルに同期されたデータからタグ検索で抽出
  3. APIを使ってサーバーのデータを更新

ということで、実装してみた結果がこれです。
GitHubにソースを置いておきました。こちらのプログラムも使用は自己責任でお願いします。自分は使っていので対応しなかったのですが、18フラグや公開・非公開の設定はこのプログラムを使うと消えてしまうと思います。

使用方法

【手順1】
Rubyとgemを使えるようにしておき、gemを使ってライブラリをインストールしておきます。

gem install sqlite3-ruby

【手順2】
windowsを使っている人はsqlite3をインストールします。
http://www.sqlite.org/download.htmlからsqlitedll-3_XX_XX.zipをダウンロードし、展開したdllをwindows/system32に配置しておきます。
Macは確か最初から入っていた気がしますが、macports経由で新しくインストールしてもよいかもしれないです。

【手順3】
livedoorクリップをローカルで検索する為のFirefoxのExtention「livedoorclip IncSearch」をインストールしてsync(同期)しておきます。

【手順4】
最後にソースをGitHubからダウンロードして、下記コマンドを実行するとタグの一括変換ができます。

パラメータ順序

%ruby ldc_tag_rename.rb login_id apikey tag_before tag_after

実データ例

%ruby ldc_tag_rename.rb guyon b0578xxxxxxxxxxxxxxxxxxxxxxxxxxx putty PuTTY

apikeyはLivedoorクリップにログイン後こちらで確認できます。