読者です 読者をやめる 読者になる 読者になる

読売新聞のトップページの記事を抽出するプラグインを書いてみた

ひよっこなんで、多分すでに他の方法で新聞社系のページからフィード取得とかあると思いますが、Plaggerを理解するため、Perlの勉強のため、プラグインを書いてみました。
他のCustomFeedのプラグインを真似して作っただけなんで、不必要な部分とかあったらご指摘してください。
あとかなり不完全な部分があります。使われる際は、自己責任でお願いします。
私は、PSPを活用するために、こうしたニュースサイトのデータをローカルで管理したいと考えています。

  • Yomiuri.pm
package Plagger::Plugin::CustomFeed::Yomiuri;
use strict;
use base qw( Plagger::Plugin );

use Plagger::UserAgent;
use Plagger::Util;
use URI;
use URI::QueryParam;

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'customfeed.handle' => \&handle,
    );
}

sub handle {
    my($self, $context, $args) = @_;

    if ($args->{feed}->url =~ m!^http://www\.yomiuri\.co\.jp/index\.htm! && $args->{feed}->url !~ /output=(?:rss|atom)/){
        $self->aggregate($context, $args);
        return 1;
    }

    return;
}

sub aggregate {
    my($self, $context, $args) = @_;

    my $url = URI->new($args->{feed}->url);

    $context->log(info => "GET $url");

    my $agent = Plagger::UserAgent->new;
    my $res = $agent->fetch($url, $self);

    if ($res->is_error) {
        $context->log(error => "GET $url failed: " . $res->status);
        return;
    }

    my $content = Plagger::Util::decode_content($res);
    my $title   = Plagger::Util::extract_title($content);

    my $feed = Plagger::Feed->new;
    $feed->title($title);
    $feed->link($args->{feed}->url);

    while ($content =~ m!<a href="(.*?)" class="h">(.*?)</a>!g) {
        my $link = $1;
        unless ( $link =~ m!http://info\.yomiuri\.co\.jp/! ) {
            my $link = "http://www.yomiuri.co.jp" . $1;
            my $title = $2;

            my $news = $agent->fetch($link, $self);
            if ($news->is_error) {
                $context->log(error => "GET $link failed: " . $res->status);
            }
            my $body = Plagger::Util::decode_content($news);
            $body =~ m!<p>([\d\D]*)</p>!gs;

            $body = $1 . $2;

            my $entry = Plagger::Entry->new;
            $entry->title($title);
            $entry->link($link);
            $entry->body($body);

            $feed->add_entry($entry);
        }
    }

    $context->update->add($feed);
}

1;

あとconfig.yaml

plugins:
 - module: Subscription::Config
   config:
    feed:
     - http://www.yomiuri.co.jp/index.htm
 - module: CustomFeed::Yomiuri
 - module: Publish::PSP
   config:
     output_file: パス指定

こんな感じでいいのかな。

はじめてのプラグイン作成でした。

追記

↑感謝。。

こういう事だよね。

[>いまさら聞けない? 初心者向けPlagger設定覚え書き その1