Hack 80 Program AWS with Perl


A lightweight XML parser is all you need to work with Amazon's data in Perl scripts.

Even without wrapper functions, retrieving data directly from Amazon with XML/HTTP is straightforward. You just need the ability to grab a file from the Web and parse the results.

80.1 What You Need

This hack requires two common Perl modules: one to handle the HTTP request and another to parse the XML. Once the Amazon request URL is built, LWP::Simple handles sending the request and receiving the XML with a get( ) function. You can find out more about LWP::Simple at CPAN (http://search.cpan.org/dist/libwww-perl/lib/LWP/Simple.pm).

XML::Simple (http://search.cpan.org/author/GRANTM/XML-Simple-2.04/lib/XML/Simple.pm) is a lightweight XML parser. It provides a quick, simple interface for working with XML.

Many ISPs have both of these modules installed already. If not, you can install them with CPAN:

perl -MCPAN -e shell
cpan> install XML::Simple

If you have a Win32 system, you can install them from the command line with the package manager like this:

ppm install XML::Simple

80.2 The Code

This code accepts a command-line argument and builds an Amazon URL with the argument as the keyword. Create the file amazon_http.pl with the following code:

# amazon_http.pl
# A typical Amazon Web API Perl script using the XML/HTTP interface
# Usage: amazon_http.pl <keyword> 

#Your Amazon developer's token
my $dev_key='insert developer token';

#Your Amazon affiliate code
my $af_tag='insert associate tag';

#Take the keyword from the command-line
my $keyword =shift @ARGV or die "Usage:perl amazon_http.pl <keyword>\n";

#Assemble the URL
my $url = "http://xml.amazon.com/onca/xml3?t=" . $af_tag . 
    "&dev-t=" . $dev_key .
    "&type=lite&f=xml&mode=books&" .
    "KeywordSearch=" . $keyword;

use strict;

#Use the XML::Parser  and LWP::Simple Perl modules
use XML::Simple;
use LWP::Simple;

my $content = get($url);
die "Could not retrieve $url" unless $content;

my $xmlsimple = XML::Simple->new(  );
my $response = $xmlsimple->XMLin($content);

foreach my $result (@{$response->{Details}}){
    #Print out the main bits of each result
    join "\n",
    $result->{ProductName}||"no title",
    "ASIN: " . $result->{Asin} . ", " .
    $result->{OurPrice} . "\n\n";

The foreach at the end of the code loops through the results from Amazon and prints them out. By changing the variable names, you can change the information that is displayed. For example, changing OurPrice on the last line to ListPrice would display that price instead of Amazon's price.

80.3 Running the Hack

From the command line, call the script like so:

perl amazon_http.pl hacks

Be sure to enclose phrases or multiple keywords in quotes, like so:

perl amazon.http.pl "google hacks"