- なんとなく名前を変更
- customfeed.handleをフックするのをやめてsubscription.loadをフックするようにした
- 「発売日が一ヶ月以上前の商品を省く」という処理はやめた
- 必要に応じてRuleを使う
- GitHub Pages · File Not Found · GitHubのソースを反映
- でも自分の環境では逆にencodeすると検索に失敗してしまうので(最初のソースもencodeするようにしていたんですがこれが原因で消していた)、ここはオプションで指定する形に
config
plugins:
- module: CustomFeed::AmazonWebService
config:
developer_token: XXXXXXXXXXXXX
keywords:
- げんしけん
- Perl
mode: books-jp
locale: jp
keyword_encoding: 0
- module: Filter::Rule
rule:
module: Fresh
duration: 43200
- module: Publish::iCal
config:
dir: /Users/user/Sites/plagger/amazon/
filename: books.ics
CustomFeed::AmazonWebService
package Plagger::Plugin::CustomFeed::AmazonWebService;
use strict;
use base qw( Plagger::Plugin );
use Net::Amazon;
use Net::Amazon::Request::Keyword;
use Encode;
sub register {
my($self, $context) = @_;
$context->register_hook(
$self,
'subscription.load' => \&load
);
}
sub load {
my($self, $context, $args) = @_;
my $feed = Plagger::Feed->new;
$feed->aggregator(sub { $self->aggregate(@_); });
$context->subscription->add($feed);
}
sub aggregate {
my($self, $context, $args) = @_;
for my $keyword (@{$self->conf->{keywords}}) {
$self->_search($context, $keyword);
}
}
sub _search {
my($self, $context, $keyword) = @_;
my $ua = Net::Amazon->new(
token => $self->conf->{developer_token},
locale => $self->conf->{locale},
);
$keyword = encode('UTF-8', $keyword) if $self->conf->{keyword_encoding};
my $req = Net::Amazon::Request::Keyword->new(
keyword => $keyword,
mode => $self->conf->{mode},
sort => "daterank",
);
my $res = $ua->request($req);
if($res->is_error) {
$context->log(error => $res->message);
return;
}
my $feed = Plagger::Feed->new;
for my $prop ($res->properties) {
my $e = Plagger::Entry->new;
$e->title($prop->ProductName);
$e->body($prop->ProductDescription);
my $date = Plagger::Date->strptime("%Y/%m/%d", $prop->ReleaseDate);
$date = Plagger::Date->strptime("%Y/%m", $prop->ReleaseDate) unless $date;
next unless $date;
$e->date($date);
$feed->add_entry($e);
}
$context->update->add($feed);
}
1;日付の取得に失敗するのは、フォーマットが年だけになってたりするのかな……。