Amazlet Tool for はてなダイアリー (1)

id:Akkiesoft にインスパイアされて、改造版 amazlet ツール を作ってみました。はてなダイアリー市民向けに最適化してあります。検索後にテキストエリアに表示される文字列をコピペすると、asin:XXXX:detail で作ったのとそっくりなリンクが作れます。

アマゾンデベロッパートークンアマゾンアフィリエイトコード を持っていて、サーバーに SOAP::Lite がインストールされている方用の CGI を置いておきます。ちなみにロリポップでは正常動作することを確認しました。

サンプルサイト

amazlet.cgi

#!/usr/bin/perl -w

use strict;
use Jcode;
use CGI;
use SOAP::Lite;

&main();

sub main() {

    # アマゾンデベロッパートークン
    my $dev_token = 'hogehoge';

    # アマゾンアフィリエイトコード
    my $af_tag = 'fugafuga';

    # アマゾンWSDLファイル
    #my $amazon_wdsl = "http://soap.amazon.com/schemas3/AmazonWebServices.wsdl";
    my $amazon_wdsl = "http://soap.amazon.co.jp/schemas3/AmazonWebServices.wsdl";

    # パラメータ取得
    my $query   = CGI->new();
    my $keyword = '';
    my $mode    = '';
    if ( $query->param('keyword') ) {
        $keyword = jcode( $query->param('keyword') )->utf8;
    }
    if ( $query->param('mode') ) {
        $mode = $query->param('mode');
    }
    my @code_list  = qw(books-jp dvd-jp classical-jp music-jp software-jp videogames-jp);
    my @value_list = qw(和書 DVD クラシック CD ソフトウェア ビデオゲーム);

    # 検索フォーム
    printf(qq!Content-Type: text/html; charset=x-euc-jp\n\n!);
    printf(qq!<html><head><title>Amazlet for Hatena</title></head><body>\n!);
    printf(qq!<form method="post" action="amazlet.cgi">\n!);
    printf(qq!<input type="text" size="40" name="keyword">\n!);
    printf(qq!<select name="mode">\n!);
    for ( my $i = 0 ; $i < 6 ; $i++ ) {
        if ( $code_list[$i] eq $mode ) {
            printf( qq!<option value="%s" selected>%s</option>\n!, $code_list[$i], $value_list[$i] );
        }
        else {
            printf( qq!<option value="%s">%s</option>\n!, $code_list[$i], $value_list[$i] );
        }
    }
    printf(qq!</select>\n!);
    printf(qq!<input type="submit" value="検索">\n!);
    printf(qq!<input type="reset" value="クリア">\n!);
    printf(qq!</form>\n!);

    # 検索開始
    if ( $keyword && $mode ) {

        # アマゾンWSDLファイルを読んでSOAPを初期化
        my $amazon_search = SOAP::Lite->service($amazon_wdsl);

        # クエリーを生成
        my $results = $amazon_search->KeywordSearchRequest(
            SOAP::Data->name('KeywordSearchRequest')->type('KeywordRequest')->value(
                \SOAP::Data->value(
                    SOAP::Data->name( 'keyword' => $keyword ),
                    SOAP::Data->name( 'page'    => '1' ),
                    SOAP::Data->name( 'mode'    => $mode ),
                    SOAP::Data->name( 'tag'     => $af_tag ),
                    SOAP::Data->name( 'type'    => 'lite' ),
                    SOAP::Data->name( 'devtag'  => $dev_token ),
                    SOAP::Data->name( 'locale'  => 'jp' )
                )
            )
        );

        # 検索結果を出力する
        foreach my $result ( @{ $results->{Details} } ) {

            # 検索結果をハッシュに詰める
            my $hash;
            $hash->{ListPrice} = jcode( $result->{ListPrice}, 'utf8' )->euc || "未定";
            $hash->{OurPrice}  = jcode( $result->{OurPrice},  'utf8' )->euc || "未定";
            $hash->{UsedPrice} = jcode( $result->{UsedPrice}, 'utf8' )->euc || "未定";
            $hash->{ImageUrlSmall}  = $result->{ImageUrlSmall};
            $hash->{ImageUrlMedium} = $result->{ImageUrlMedium} || $result->{ImageUrlSmall};
            $hash->{ImageUrlLarge}  = $result->{ImageUrlLarge};
            $hash->{Availability}   = jcode( $result->{Availability}, 'utf8' )->euc || "不明";
            $hash->{Catalog}        = $result->{Catalog};
            $hash->{Asin}           = $result->{Asin};
            $hash->{Url}            = $result->{Url};
            $hash->{Manufacturer}   = jcode( $result->{Manufacturer}, 'utf8' )->euc || "不明";
            $hash->{ProductName}    = jcode( $result->{ProductName}, 'utf8' )->euc || "不明";

            # プレビュー用
            my $body = qq!<div class="hatena-asin-detail">!;
            $body .= sprintf(
                qq!<a href="http://www.amazlet.com/browse/ASIN/%s/%s"><img src="%s" class="hatena-asin-detail-image" alt="%s" title="%s"></a>!,
                $hash->{Asin}, $af_tag, $hash->{ImageUrlMedium},
                $hash->{ProductName}, $hash->{ProductName}
            );
            $body .= qq!<div class="hatena-asin-detail-info">!;
            $body .= sprintf( qq!<p class="hatena-asin-detail-title"><a href="http://www.amazlet.com/browse/ASIN/%s/%s">%s</a></p>!, $hash->{Asin}, $af_tag, $hash->{ProductName} );
            $body .= qq!<ul>!;
            $body .= sprintf( qq!<li><span class="hatena-asin-detail-label">出版社/メーカー:</span> %s</li>!, $hash->{Manufacturer} );
            $body .= sprintf( qq!<li><span class="hatena-asin-detail-label">価格:</span> %s</li>!, $hash->{ListPrice} );
            $body .= sprintf( qq!<li><span class="hatena-asin-detail-label">メディア:</span> %s</li>!, $hash->{Catalog} );
            $body .= qq!</ul>!;
            $body .= qq!</div>!;
            $body .= qq!<div class="hatena-asin-detail-foot"></div>!;
            $body .= qq!</div>!;
            printf( "%s\n", $body );

            # はてなダイアリー用
            $body =~ s/</&lt;/g;
            $body =~ s/>/&gt;/g;
            printf(qq!<form><textarea rows="10" cols="80">\n!);
            printf( "%s\n", $body );
            printf(qq!</textarea></form>\n!);
        }
    }
    printf(qq!</body></html>\n!);
}