WEBサービス創造記

WEBサービスを作ったり保守したりしてる人のメモブログです。

PHPでPubSubHubbubにパブリッシュする

      2014/11/17

PubSubHubbubについて

インターネット上のpublish/subscribe パターン(出版/購読型などとも呼ばれる)で配信される情報のためのプロトコル。
Publisherはフィードを配信する側で、Subscriberはフィードを購読する側。WordPressで採用する場合はPublisherはWPを採用しているメディアでSubscriberはGoogle。

PubSubHubbubを利用することでメディア側でのコンテンツの更新を能動的にGoogleへ通知し、インデックスしてもらうことができる。
同様のことはPingなど他のプロトコルでも可能だが、PubSubHubbubでは、非常に高速にフィードをGoogle側に受け取ってもらうことが可能となる。
※PubSubHubbubではPublisherとSubscriberの間にHubというものを置いている。細かい点は時間が空いたらまとめる予定。

Google Trendで見たらけっこう前からあったみたいだし、特に最近話題の技術というわけではなさそう。

https://www.google.co.jp/trends/explore#q=pubsubhubbub

特にPubSubでインデックスのサイクル早くしても検索順位が劇的に上がるとかそういったことはなさそうだけど、スクレイピング対策にはかなり有効そう。

例えば、他のサイトのコンテンツを引用して自サイトのコンテンツのように公開しているキュレーション系のメディア(スクレイパー)が、引用元(オリジンメディア)より上位に表示されたり、ひどい場合は引用元がスパム扱いを受ける場合がある。
スクレイパーより先にGoogleにインデックスされることでオリジンメディアであることを主張できる。

スクレイピングの対象になっているようなメディアなら上記のような恩恵に預かれそうだし、そうでないサイトでも入れておいてまず損はなさそう。

PHPでのパブリッシュ実装

基本WordPressなどのCMSならプラグインを導入すればすぐに導入可能みたいだけど、なんらかの事情でPubSubHubbubへのパブリッシュを実装しなきゃいけない場合は下記のような感じでできる)。
下記はPHPでの例。

class Publisher{
    /* プロパティとセッター・ゲッター定義 */
    private $pubsubhubsub_hub;

    public function get_pubsubhubsub_hub() {
        return $this->pubsubhubsub_hub;
    }

    public function set_pubsubhubsub_hub($pubsubhubsub_hub) {
        $this->pubsubhubsub_hub = $pubsubhubsub_hub;
    }

    /* Publish通知をハブに送信 */
    public function publish($url) {
        $post_data = 'hub.mode=publish&hub.url=' . urlencode($url);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_URL, $this->pubsubhubsub_hub);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($post_data)));
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
        $response = curl_exec($ch);
        $info = curl_getinfo($ch);
        $result = (204 == $info['http_code']);
        curl_close($ch);

        return $result;
    }
}

/* ハブに送信 */
$url = 'http://linuxserver.jp/seo/pubsubhubbub.php';    // ここで通知したいURLを指定
$publisher = new Publisher();
$publisher->set_pubsubhubsub_hub('https://pubsubhubbub.appspot.com/'); // ハブのURLを指定
if ($publisher->publish($url)) {
    echo "パブリッシュしました。";
} else {
    echo "パブリッシュできませんでした。";
}

GoogleのPubSubHubbub Hubにパブリッシュするときは下記の規約(?)に従う必要がある。

  • リクエストメソッドはPOSTで行う
  • HTTPヘッダでコンテンツタイプに”application/x-www-form-urlencoded”を指定する(“Content-Type: application/x-www-form-urlencoded”)
  • hub.mode(値は”publish”であること)と、hub.urlのふたつのパラメータが必要。また、値はURLエンコードされていること

下記URLのフォームから手動でパブリッシュすることも可能。
https://pubsubhubbub.appspot.com/publish

 - SEO