work.log

エンジニアの備忘録的ブログ

PerlのXML::FeedPPモジュールでPubSubHubBub対応のRSSフィードを作成

投稿:2014-08-07 18:06  更新:

Perl で PubSubHubBub 対応の RSS フィードを作成するメモです。

PubSubHubBub って何だというのはググればわかると思うので割愛。とりあえず Ping の改良版みたいな感じで Ping より早く Google にインデックスされるよって認識で良いと思う。

オリジナルの CMS で作成したコンテンツのインデックスを促すために PubSubHubBub を使おうという魂胆です。

モジュールは XML::FeedPP を使います。そして、下記記事の続きです。

まずは PubSubHubBub 対応のコードから。

#!/usr/bin/perl

use strict;
use warnings;
use Encode;
use DateTime;
use XML::FeedPP;

    my $language  = 'ja';
    my $title = 'Example RSS フィード';
    my $url = 'http://example.jp/';

    my $dt = DateTime->now(time_zone => 'local');
    my $pubdate = $dt->strftime('%Y-%m-%dT%H:%M:%S%z');

    my $pub = {
           '-rel'  => 'self',
           '-type' => 'application/rss+xml',
           '-href' => $url . 'index.rdf',
       };

    my $sub = {
           '-rel'  => 'hub',
           '-href' => 'http://pubsubhubbub.appspot.com',
       };

    my $hub = {
           '-rel'  => 'hub',
           '-href' => 'http://pubsubhubbub.superfeedr.com',
       };

    my $item1 = {
           title       => 'タイトルその1',
           link        => 'http://example.jp/1.html',
           description => '<p>あああいいいうううえええおおお</p>',
       };

    my $item2 = {
           title       => 'タイトルその2',
           link        => 'http://example.jp/2.html',
           description => '<p>かかかきききくくくけけけこここ</p>',
       };

    my @items = ($item1, $item2);

    my $feed = XML::FeedPP::RSS->new();

    $feed->xmlns('xmlns:atom' => 'http://www.w3.org/2005/Atom');
    $feed->language($language);
    $feed->set( 'atom:link' => [$pub, $sub, $hub] );

    $feed->title($title);
    $feed->link($url);
    $feed->pubDate($pubdate);

    foreach my $item (@items) {

        $feed->add_item(
            link        => $item->{link},
            title       => $item->{title},
            description => $item->{description},
            pubDate     => $pubdate,
        );
    }

    print $feed->to_string('UTF-8');

前回とそんなに違いはないが、PubSubHubBub に必要な記述をいくつか追加している。

hub の URL は WordPress 用のプラグインを参考に二つ付けてみたが「pubsubhubbub.appspot.com」だけでも大丈夫だと思う。

これを実行すると下記のような感じに。

<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Example RSS フィード</title>
<link>http://example.jp/</link>
<atom:link rel="self" type="application/rss+xml" href="http://example.jp/index.rdf" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<atom:link rel="hub" href="http://pubsubhubbub.superfeedr.com" />
<language>ja</language>
<pubDate>Thu, 07 Aug 2014 17:58:14 +0900</pubDate>
<item>
<title>タイトルその1</title>
<link>http://example.jp/1.html</link>
<guid isPermaLink="true">http://example.jp/1.html</guid>
<pubDate>Thu, 07 Aug 2014 17:58:14 +0900</pubDate>
<description>&lt;p&gt;あああいいいうううえええおおお&lt;/p&gt;</description>
</item>
<item>
<title>タイトルその2</title>
<link>http://example.jp/2.html</link>
<guid isPermaLink="true">http://example.jp/2.html</guid>
<pubDate>Thu, 07 Aug 2014 17:58:14 +0900</pubDate>
<description>&lt;p&gt;かかかきききくくくけけけこここ&lt;/p&gt;</description>
</item>
</channel>
</rss>

これで受け ? は出来たので、後はこれを送信するための機能を作るだけです。

続きは次回書きます。

スポンサーリンク

コメント

コメントを残す

よく読まれている記事

  • 今日
  • 週間
  • 月間