はてなRSSがOPMLのインポートをサポートしたため、簡単にSageのデータをインポートできるようになりました。以下の面倒な手順を踏む必要はありません。
なにやらはてなRSSが面白そうなので使ってみようかと思った。……のはいいんだけども、Sageに登録されている情報を一々手で登録していたらハンパないので、スクリプトを適当に書いて一括登録してみる。
とりあえず、Firefoxの「Manage Bookmarks」をいじってURIのリストを製作できないか試してみる。どうやら項目をFirefox上のフォーム(textareaとか)までドラッグしてドロップすると「タイトルURI」形式(区切り記号無し)で出力されるらしい。これでなんとなりそうなので、Sageのフィードが溜まってるフォルダを開き、Ctrl+Aですべての項目を選択した後もう1度ドロップしてみると、各項目が改行で区切られたリストになった。あとは正規表現で整形すればよさそう。
スクリプトはPHPでガリガリ書き進める。登録ページのHTMLソースを覗いてPOSTすべき項目を調べたら、後はPEARのHTTPライブラリで実際に送信すればいい。1つだけ厄介なのがCookieで、クロスサイトスクリプティングな脆弱性を見つけない限りはてなドメインのCookieを自作スクリプトから参照することは不可能。仕方が無いのでLiveHTTPHeadersでキャプチャすることにした。これぐらいは手動でも我慢。ログオンした後はてなRSS内のページを適当に開けばCookieフィールドが送信されているので、それを右クリックしてコピーすればよし。
というわけで、完成した成果物を一応公開。
PHP5(たぶん4でも大丈夫)な環境にフォルダごと放り込めば適当に動くはず。フィードの数が多い場合は何回かに分割しないとPHPのタイムアウトが発生するので注意が必要。20個ずつぐらいにするか、php.iniらへんを書き換えるかして対応すべし。
それと、このスクリプトを使用して発生したいかなる利益、不利益ともに石川は一切関知しないのであらかじめご了承を。はてなのアカウントを削除されたりしても責任は取れないので、自己責任でお使いください。
「どんな感じー?」という人のために、一応ベタテキストで張っておく。
<form action="./stoh.php" method="POST">
ここにドラッグ:<br/>
<textarea size="30" rows="20" cols="80" name="rssList"></textarea><br/>
ユーザID:<input type="text" name="userId" size="10"/><br/>
Cookie:<input type="text" name="cookie" size="40"/>
<input type="submit" name="send" value="Send"/>
</form>
<?php
require_once "./Request.php";
$rssListStr = $_POST["rssList"];
$rssList = explode("\n", $rssListStr);
header("Content-Type: text/plain");
foreach ($rssList as $entry) {
preg_match("/(https?:\/\/.*?)$/", $entry, $uri);
if (array_key_exists("1", $uri)) {
$uri = $uri[1];
$req = new HTTP_Request("http://r.hatena.ne.jp/". $_POST["userId"] . "/add");
$req->setMethod(HTTP_REQUEST_METHOD_POST);
$req->addPostData("mode", "enter");
$req->addPostData("feedurl", $uri);
$req->addHeader("Cookie", preg_replace("/^[Cc]ookie: ?/", "", $_POST["cookie"]));
$req->addPostData("gid", "1");
$req->addPostData("save", "save");
$req->sendRequest();
print $uri . "\n";
}
}
print "\nCOMPLITE";
?>
ちなみに、グループ分けまでは自動でしないのでそこら辺は誰か改良してあげてください。PEAR部分はそれぞれのライセンス。stoh.phpとindex.htmlはパブリックドメインです。