日記
SharpReader+BlogThisUrlプラグインをMT以外で利用する (20:18)Edit

NET Framework(Windows)用RSSアグリゲータSharpReader(http://www.sharpreader.net/)と、SharpReaderで閲覧したアイテムに関する記事をMTで書くためのプラグインBlogThisUrlを使って、他の日記システムで手軽にRSS→Web記事を生成する方法。

BlogThisUrlプラグインは、標準ではMovableTypeに記事を投稿する用になっているんだけど、内部はテンプレートベースで汎用的に作られている。デフォルトのテンプレートは、

http://YOUR-WEB-SITE/cgi-bin/mt/mt.cgi?is_bm=1&
bm_show=trackback,category,allow_comments,allow_pings,convert_breaks&
__mode=view&_type=entry&link_title=<$//item/title$>&
link_href=<$//item/link$>&text=<$//item/description$>

※本来は改行はない

となっていて、要はテンプレートに記述されたとおりに、RSSの記事アイテムに関する各種要素をQUERY_STRINGに付加して、指定されたURLを呼び出す(Webブラウザで開く)って仕組みなんで、GETで好きな引数を受け取ってそれをFORM要素に展開するようなページを用意しておけばいい。

たとえばうちなんかの場合は、

http://example.com/pagename?site=<$//channel/title$>&
title=<$//item/title$>&link_href=<$//item/link$>

なんてテンプレートを用意することで、

  • site……サイト名
  • title……記事タイトル
  • link_href……記事URL
  • -[text……記事要約-

※「&text=<$//item/description$>」をつけておくと、descriptionに長文が含まれている場合なんかに、ShellExecuteのオーバーフローが起きるんで、つけない方がよさそう。

をGETで受け取り、それをベースに雛形記事を生成するフォームを用意している。ちょっと試してみているんだけど、結構便利。ただ、記事情報を受け取る際には、文字コード変換とかにも気を遣った方がいいかも。

あと、RSSでは記事URLをRSS専用のリダイレクタにしてあったりすることが多いんで(bulknewsとかCNETとかもそうだし)、それを手で直すのがちょっと面倒。リダイレクタURL→本来のURLに変換する処理とか書くともっと便利になるかな。HEADして返ってきたLocationを読めばいいのかな?


PHPで書いてみたリダイレクト用URLからリダイレクト先URLを得る関数。80ポート以外とかは考慮してないけど。本当は、BlogThisUrlプラグイン自体で処理しようかと思ったんだけど、BlogThisUrlプラグインの方はいろいろと不透明なことが多い(権利関係とか必要なライブラリとか)んで、やめ。

function get_redirect_url($srcurl) {
$urlinfo = parse_url($srcurl);
$curl = curl_init($srcurl);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 3);
$req = 'GET '.$urlinfo['path'.'?'.$urlinfo['query'.' HTTP/1.1'."\n";
$req .= 'Host:'.$urlinfo['host'."\n\n";
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $req);
ob_start();
curl_exec($curl);
$result = ob_get_contents();
curl_close($curl);
ob_end_clean();
if (preg_match("/Location: ?([^\n+)\n/i", $result, $matches)) {
$url = trim($matches[1);
if (preg_match('/^https?/i', $url)) {
return $url;
} else {
$url = strtolower($urlinfo['scheme').'://'.$urlinfo['host'.$url;
return $url;
}
} else {
return $srcurl;
}
}

Published At2003-10-05 00:00Updated At2003-10-05 00:00