« Plagger::Plugin::Filter::RakutenWebService | メイン | Web::Scraperで配列の中にハッシュを入れる »

Plagger::Plugin::Filter::AddAmazonDescription

お次はこちら。EntryのlinkがAmazon商品へのURLだった場合に、 Amazon Web Serviceから情報を取得して、Entryのbodyとかに入れるFilter。 templatizeさせて、好きなようにbodyの中身を表示させることも可能。 これも俺しか使わないと思うよ。

package Plagger::Plugin::Filter::AddAmazonDescription;

use strict;
use base qw( Plagger::Plugin );
use Net::Amazon;
use Net::Amazon::Request::ASIN;

our $VERSION = '0.01';

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'update.entry.fixup' => \&filter,
    );
}

sub filter {
    my($self, $context, $args) = @_;
    my $entry = $args->{entry};
        $entry->link =~ 
                m!(?:www.amazon.co.jp/)(?:.*?)(?:ASIN|product-description|product|dp)/([^/]+)(?:/.*)*$!;
        return unless $1;

        # delete '?' etc.  param
        $1 =~ m!(.*?)\?.*!; 
        $1 =~ m!(.*?)%3f.*!;
        my $asin = $1;
    my $attr;
    $attr->{token}  = $self->conf->{developer_token};
    $attr->{locale} = $self->conf->{locale};
    $attr->{affiliate_id} = $self->conf->{associate_id};
        
        my $item = search_aws($attr, $asin);
        my $body = $entry->body;
        if( $self->conf->{template} ) {
                $body  = $self->templatize($self->conf->{template}, {item => $item} );
        }else{
                $body = $item->ProductDescription if $item->ProductDescription;
        }

        $entry->body( $body );
        $entry->title( $item->ProductName ) if $self->conf->{set_title};
        $entry->link( $item->url) if $self->conf->{set_url};
        $entry->icon({
                                    url    => $item->ImageUrlSmall,
                            });

        # add meta data for after use
        $entry->meta->{affiliate_url} = $item->url;
        $entry->meta->{icon_url} = $item->ImageUrlSmall;
        
}

sub search_aws {
    my($attr, $asin) = @_;
    my $ua = Net::Amazon->new(%$attr);
    my $req = Net::Amazon::Request::ASIN->new( asin  => $asin );
    my $response = $ua->request($req);
    my $item = ($response->properties())[0];
    return $item;
}

1;
__END__

=head1 NAME

Plagger::Plugin::Filter::AddAmazonInformation - Set information to entries from Amazon Web Service

=head1 SYNOPSIS

  - module: Filter::AddAmazonInformation
    config:
      associate_id: xxxxxxxxxx-22
      developer_token: XXXXXXXXXXXXXXXXXXXX
      locale: jp
      set_title: 1 # default is off
      set_url: 1 # default is off

=head1 DESCRIPTION

This plugin fetches related data from Amazon Web Service and
sets summary to the entry if entry link is amazon product URL.


=head1 AUTHOR

Yusuke Wada

=head1 SEE ALSO

L<Plagger>

=cut

トラックバック

このエントリーのトラックバックURL:
http://yusukebe.com/mt/mt-tb.cgi/2194

この一覧は、次のエントリーを参照しています: Plagger::Plugin::Filter::AddAmazonDescription:

» はてブでみんながほしいと感じた記事がひとめでわかる「これ☆ほしい」を作ってみた 送信元 ゆーすけべー日記
つい先日「iPod Touch」などを衝動買いしてしまった僕ですが、 そんな物欲をさらに加速させるようなサイト「これ☆ほしい」を作ってみました。... [詳しくはこちら]

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


ブログSEO対策:track word seo