TechTalk @ ppmz

テクな話題を説くと解く。そのココロは?

August 03, 2006

Feed Access Control: RSS/Atomでのrobots.txt

個人的な内容で、特定の人たちにのみ向けて書いているブログが、検索エンジンで引っかかる…そんな現状を改善しようと、Bloglines.comがRSS2.0/Atomフィードの拡張書式を提唱しています。 発想自体は、robots.txtの検索エンジン弾きと同じことをRSS/Atomフィードでもできるようにしよう、という事らしいです。

Feed Access Control の書式

以下はFeed Access Control RSS and ATOMの翻訳です。

ネームスペース宣言

Feed Access Control RSS and Atom のネームスペースは次のように定義されます。

http://www.bloglines.com/about/specs/fac-1.0

例えば、

<rss version="2.0" xmlns:access="http://www.bloglines.com/about/specs/fac-1.0">

あるいはAtomの場合、

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:access="http://www.bloglines.com/about/specs/fac-1.0">

のようになります。

<access:restriction>要素

<rss>または<feed>の子要素です。これらはフィードの再配布制限を示すのに使われます。'relationship'アトリビュートは、フィードがアクセスを「許可」あるいは「拒否」するかを示すのに使われます。 アクセスを「許可」するということは、フィードがサーチエンジンを含む他の公共ソースに再配布される可能性がある事を意味します。アクセスを許可するには、 <access:restriction relationship="allow" /> のようにして下さい。 アクセスを「拒否」するということは、フィードがサーチエンジンを含む他の公共ソースに再配布されるべきではない事を意味します。アクセスを拒否するには、 <access:restriction relationship="deny" /> のようにして下さい。 標準ではrelationshipはアクセスを許可します。しかし、もしフィードが現在「拒否」に設定されている場合、そのフィードを再登録(訳注:検索エンジンなどに)するためには、relationshipを明示的に「許可」に設定する必要があります(単純にフィードから削除するだけではアクセスを再び許可するには十分ではありません)。

フィードの例

RSS の例

<rss version="2.0" xmlns:access="http://www.bloglines.com/about/specs/fac-1.0">
  <access:restriction relationship="allow" />
  <channel>
    <title>Bloglines | News</title>
    <link>http://www.bloglines.com</link>
    <item>
      <title>Ping Away, Bloggers</title>
      <description>Hello World</description>
      <pubDate>Fri, 28 Apr 2006 12:03:11 PDT</pubDate>
      <guid>http://www.bloglines.com/about/news#103</guid>
    </item>
  </channel>
</rss>

Atom の例

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:access="http://www.bloglines.com/about/specs/fac-1.0">
  <access:restriction relationship="allow" />
  <title>Bloglines | News</title> 
  <link href="http://www.bloglines.com"/>
  <updated>2006-04-28T19:03:11Z</updated>
  <entry>
    <title>Ping Away, Bloggers</title>
    <link href="http://www.bloglines.com/about/news#103"/>
    <id>http://www.bloglines.com/about/news#103</id>
    <updated>2006-04-28T19:03:11Z</updated>
    <summary>Hello World</summary>
  </entry>
</feed>

bloglines.comのサービスは既にこの拡張フィードを解釈する機能が実装されているそうです。その他にも、大手検索エンジンなどがこの件に関してbloglines.comに問い合わせをしているらしいので、そのうち検索エンジンもこの拡張書式を解釈するようになるかもしれません。

参考ページ:

Posted by Pju at 06:47 PM

Comments (0)
TrackBacks (0)

August 02, 2006

PHPでweblogUpdates.ping その6: 初期版の完成

更新Pingを利用して複数ブログの更新情報一覧を生成するPHPスクリプトの初期版ができたので、ひとまずここに公開します。コードの改善点、セキュリティホールなどあったらご一報ください。なお、ライセンスはGPL version2です。
実際に動いているバージョンはppmz.comのトップページ、更新情報の欄をご覧ください。

ダウンロード

phpPingUpdateTracker version 0.1

システム要件

インストール方法

  1. include.phpを設定する。
  2. アップロード
  3. 出力先の設定

Posted by Pju at 09:04 PM

Comments (0)
TrackBacks (0)

PHPでweblogUpdates.ping その5: 更新情報処理の実装

一番難しいと思っていたネットワーク通信周りがいともあっさり片付いてしまったので、受信した情報を処理してHTMLを生成する部分を次に実装します。
weblogUpdates.pingには、必ず2つの情報(更新されたブログのタイトルと、そのブログのURL)が含まれていて、他2つの引数は任意なので、今回の実装では任意の引数は無視して、確実に含まれている情報のみを利用しようと思います。

実際の処理自体は、ごく基本的なファイルI/Oと配列の処理ばかりなので、処理の流れを説明してもしょうがない(というか面白くない…コードを見てもらえれば一目瞭然なので)ので、ここは一つ、JavaプログラマがPHPでプログラムを書いた時に引っかかるかな、と思われる点、つまりは自分がつまずいた点をリストしていきたいと思います。完成品のコード自体は次回に公開します。

コーディング中にいろいろ調べているうちに、結構いろんな人がPingサーバを作ってるらしい事も分かりました。まぁ車輪の再発明になってしまいましたが、自分としてはいい練習になってるので良しとしましょう。次回は完成品の公開です。

Posted by Pju at 07:30 PM

Comments (0)
TrackBacks (0)

PHPでweblogUpdates.ping その4: XML-RPCインターフェイス部の実装

大体の構想も固まったので、いよいよコーディングに入りたいと思います。XML-RPCを簡単に扱えるモジュールがないかな、とGoogleで検索していたら、とても役に立つ(というかまさにズバリ)というページ、その名もPHPとPEARでXML-RPCを見つけました。このページに簡単なサーバとクライアントの実装例があったので、基本的な部分はこれを拝借する事にしました。

といっても実際にはあまりやる事はなく、関数のシグネチャであるsample.sumAndDifferenceとなっている部分をweblogUpdates.pingに書き換えれば、基本的には更新pingを受け取るサーバは出来上がり…ってこんな簡単で良いんでしょうかね。まぁもちろんレスポンスの部分や、実際に受け取った情報の処理はまた別にしなければいけませんが、これだけの作業でサーバの外部とのインターフェイスを担当する部分は完了です。実際のコードはこんな感じです(クライアント、サーバ共にPHPとPEARでXML-RPCに掲載の物の改変)。


require_once("XML/RPC.php");
require_once("XML/RPC/Server.php");
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";

function pingReceived ($params) {
global $XML_RPC_erruser;
$p1 = $params->getParam(0);
$p2 = $params->getParam(1);
$name = $p1->scalarval(); //ブログ名
$url = $p2->scalarval(); //ブログのURL
//受信情報の処理はこの辺に…。
$value = new XML_RPC_Value("Thanks for the ping.", "string");
return new XML_RPC_Response($value);
}

$s = new XML_RPC_Server(array("weblogUpdates.ping" => array("function" => "pingReceived")));
?>

ちなみに、同じサイトのクライアントスクリプトの関数シグネチャをweblogUpdates.pingに書き換えて、第一引数にブログのタイトル、第二引数にブログのURLを入れてやれば、更新ping送信用のスクリプトの出来上がりです。コードはこんな感じです。


require_once("XML/RPC.php");
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";

$xmlrpc_host = "http://www.yahoo.co.jp"; //送信先ホスト
$xmlrpc_path = "/RPC2"; //送信先パス
$c = new XML_RPC_client( $xmlrpc_path, $xmlrpc_host, 80 );

//引数の一覧を作成
$params = array(
new XML_RPC_Value( 'ppmz.com', 'string' )
,new XML_RPC_Value( "http://www.ppmz.com/", 'string' )
);

//メッセージの作成
$message = new XML_RPC_Message('weblogUpdates.ping',$params);

//メッセージ送信
$response = $c->send($message);

//応答の処理 - 正常時とエラー時
if (!$response->faultCode()) {
print $response->serialize();
}else{
print "Fault Code: " . $response->faultCode() . "
";
print "Fault Reason: " . $response->faultString() . "
";
}
?>


次回は受け取った情報を処理する部分を実装しようと思います。

Posted by Pju at 06:51 PM

Comments (0)
TrackBacks (0)

PHPでweblogUpdates.ping その3: 設計

weblogUpdates.pingの仕様は大体理解したので、次はアプリケーションの設計に移ります。どうやらXML-RPCの部分は既製品のモジュールが使えそうなので、プログラム自体のサイズはそう大きくはならないでしょうが、全体を大雑把にどう分けるのか、という部分は考えておきたいと思います。

モジュールとその機能

実装に関する備考

Posted by Pju at 05:16 PM

Comments (0)
TrackBacks (0)

August 01, 2006

PHPでweblogUpdates.ping その2: 更新Pingの仕様を研究

更新Pingを処理するサーバを自前で作ってみよう企画の第二弾、今回は更新Pingの仕様、どういった動作が期待されているのかという事の研究です。とりあえず基本的にHTTPで何か送って、それに対して返事が来る、という部分は知っていましたが、実際にサーバを書くとなるともう少し詳しい仕様が必要になるので、調べてみました。

わかった事

…どうやら、weblogUpdates.pingそのものは非常に貧弱なプロトコルのようです。まぁ更新情報を通知するだけのプロトコルという事を考えるとそれも仕方ないですかね。さしあたってはping受け取りと同時にRSSを読みにいって云々はまた後ほどの実装ということにして、ごく最低限の、更新されたブログの名前とURLを取得する、という部分から実装しようかな、と思います。

参考にしたページ

Posted by Pju at 02:19 PM

Comments (0)
TrackBacks (0)

PHPでweblogUpdates.ping その1: どんな物を作るのか(Objective)

敵を知り己を知らば百戦してなお危うからず、とはかの有名な「孫子」からの引用ですが、まずプログラムを書くにあたってどんなプログラムを書こうとしているのかを明確にしておく必要があると思うので、ブレインストームがてら、現状整理をしつつ要件を書き出していこうかと思います。

さしあたって実現したいこと:

現状:

とまぁ現状こんな感じです。これを踏まえて、何をすべきか、というリストを作ってみます。

ToDo:

てなわけで、とりあえずは上のToDoに従ってやっていきたいと思います。

Posted by Pju at 09:08 AM

Comments (0)
TrackBacks (0)

暇だからPHPでも勉強してみるよ

現在休職(求職)中なわけですが、仕事が無いのをいいことに家でダラダラ過ごすのもあまり宜しくないので、これを良い機会として一つ新しいプログラミング言語を習得してみようかなと思ったわけです。
同時進行でサイトの再構成も行っているのですが、その際にある機能を実行するスクリプトが必要になって、その機能を満たすスクリプトがどうやらあまりフリーで出回ってないようなので、じゃぁ自分で作ってみようかね、と。

どんなスクリプトかというと、まぁブログのPingサーバ(受信側)です。自分は複数ブログ(ブログスクリプトを使っているという意味において)を持っているのですが、今のところ、それらの更新情報を一カ所でみられるページってのが存在しないんですね。それなのでそういう機能を実現するにはどういった仕組みが一番かな、と考えたらPingサーバだったわけです。
まぁそういうわけで、PHPに関してはズブの素人な訳ですが、とりあえず他の言語の経験はあるのである程度はなんとかなるかな、と楽観的に考えて、まずはPingサーバ規格の仕様書探しから始めようかと思います。

Posted by Pju at 06:52 AM

Comments (0)
TrackBacks (0)