#!/usr/bin/perl
#
# apf4_banner_test.cgi
#
# Version 4.091210 - 10th December 2009
#
# This version created by Labbs (http://www.labbs.com) from an original
# script by MrRat (http://www.mrrat.com), with collaborative help from
# users of the APF Forum (http://www.absolutefreebies.com/phpBB2/)
#
# You can support this script by making a donation at
# http://s1.amazon.com/exec/varzea/pay/T3M26803DZOCMK
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING ! WARNING !
# Do not change the subscription_id.
# Doing so will violate your license to use this product.
use strict;
our ( $debug,$link_to_apf,$location_of_apf,%associate_ids,%Internal_variables,%MY_variables,%FORM,%AWS_variables,%time_zones );
use vars qw( $debug $link_to_apf $location_of_apf %associate_ids %Internal_variables %MY_variables %FORM %AWS_variables %time_zones );
######################################################
### basic options
## if you want this script to link to the APF script set the next option to "yes" and put the URL of the APF script in the following option
$link_to_apf = "yes";
$location_of_apf = "/shop/amazon_products_feed.cgi";
# to turn on debug mode include "_test" in the name of the script
if ($ENV{SCRIPT_NAME} =~ /_test\.cgi/) {
if ($ENV{QUERY_STRING} !~ /cart_action/) {
$| = 1;
open (STDERR, ">&STDOUT");
if ($ENV{HTTP_REFERER} and $ENV{QUERY_STRING} !~ /myOperation/) {
$MY_variables{continue_page} = $ENV{HTTP_REFERER};
print qq[Set-Cookie: continue_page=$MY_variables{continue_page};\n];
}
print qq[Content-type: text/html\n\n];
}
#$debug .= "
cookie: $ENV{'HTTP_COOKIE'}
\n";
$Internal_variables{debug_state} = "on";
}
# load configuration
# begin find current directory
my $temp_path;
if($ENV{'PATH_TRANSLATED'}) {
$temp_path = $ENV{'PATH_TRANSLATED'};
} else {
$temp_path = $ENV{'SCRIPT_FILENAME'};
}
$temp_path =~ s|\\|/|g;
$Internal_variables{cwd} = substr($temp_path,0,rindex($temp_path,"/"));
# end find current directory
&load_config;
sub load_config {
my $config_file = $Internal_variables{cwd} . "/apf_config.ini" || die qq[Problem opening config file at $Internal_variables{cwd}];
if (!-s $config_file) {
print "Location:apf_config.cgi\n\n";
exit;
}
require $Internal_variables{cwd} . "/apf_config.ini";
}
&load_AWS_Keys;
sub load_AWS_Keys {
my $AWS_Keys_file = $Internal_variables{AWS_Keys_File_Path} . '/' . $Internal_variables{AWS_Keys_File_Name} || die qq[Problem opening AWS Keys file at $Internal_variables{AWS_Keys_File_Path} . '/' . $Internal_variables{AWS_Keys_File_Name}];
if (!-s $AWS_Keys_file) {
print "Location:apf_config.cgi\n\n";
exit;
}
require $Internal_variables{AWS_Keys_File_Path} . '/' . $Internal_variables{AWS_Keys_File_Name};
}
$debug .= qq[AWS Access Key: $MY_variables{AWSAccessKey}
\n];
$debug .= qq[AWS Secret Key: $MY_variables{AWSSecretKey}
\n];
## for best effect you should add a Unicode charset META tag to the
of your page
## like this:
### end basic options. that's all you need to change.
######################################################
### advanced options
## between and is the HTML that formats the result. feel free to change it to whatever you want.
## possible AWS_variables are: Title, FormattedPrice, Availability, ASIN, Author, Publisher
## possible MY_variables are: result_link, image_url_small, amazon_site
sub set_html {
my $banner_html = '';
if ($Internal_variables{debug_state} eq "on") {
$banner_html .= qq[$debug];
}
$banner_html .= qq[
|
$AWS_variables{Title}
In association with $Internal_variables{amazon_wwwsite}
Product price accurate as of $MY_variables{time_stamp}
and is subject to change.
|
$AWS_variables{FormattedPrice}
|
|
script by MrRat
, Updated by
LABBS
]; }
## if you are familiar with ResponseGroup in ECS you can change these to get different AWS_variables
$MY_variables{ResponseGroups} = "Images,ItemAttributes,OfferFull";
### end advanced options. the code is below.
######################################################
$MY_variables{subscription_id} = "09FVDRT8TEJ64C2A7Y02";
$Internal_variables{amazon_server} = "ecs";
$Internal_variables{amazon_domain} = "amazonaws";
$Internal_variables{amazon_wwwdomain} = "amazon";
get_url_input();
initialize_locale();
my $cwd = find_current_directory();
my $xml_result = get_url($cwd);
my ($random_details,$error_msg) = select_random_product($xml_result);
build_product($random_details);
my $html = set_html();
build_the_page($html,$error_msg);
exit;
sub find_current_directory {
my $temp_path;
if($ENV{'PATH_TRANSLATED'}) {
$temp_path = $ENV{'PATH_TRANSLATED'};
} else {
$temp_path = $ENV{'SCRIPT_FILENAME'};
}
if ($temp_path) {
$temp_path =~ s|\\|/|g;
return substr($temp_path,0,rindex($temp_path,"/"));
}
}
sub get_url_input {
my ($form_pair,$form_name,$form_value,$item);
if ($ENV{QUERY_STRING}) {
for $form_pair (split(/&/, $ENV{QUERY_STRING})) {
$form_pair =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form_pair =~ s/[\;|\`|\\|\"|\||\?|\~|\<|\>|\^|\[|\]|\{|\}|\$]/ /g;
($form_name, $form_value) = split(/=/, $form_pair);
if ($form_name eq $form_value) { $form_value = ""; }
$FORM{$form_name} = $form_value;
}
}
foreach $item (@ARGV) {
($form_name, $form_value) = split(/=/, $item);
$FORM{$form_name} = $form_value;
}
if ($FORM{locale}) { $MY_variables{current_locale} = $FORM{locale} }
if ($MY_variables{current_locale} !~ /^(ca|de|fr|jp|uk|us)$/) { $MY_variables{current_locale} = $MY_variables{default_locale}; }
}
sub initialize_locale {
$MY_variables{associate_id} = $associate_ids{$MY_variables{current_locale}};
my @associate_ids = @{$associate_ids{$MY_variables{current_locale}}};
if ($FORM{associate_ids} and @associate_ids[$FORM{associate_ids}-1]) {
$MY_variables{associate_id} = @associate_ids[$FORM{associate_ids}-1];
} else {
$MY_variables{associate_id} = @associate_ids[0];
}
my @time_zones = (@{$time_zones{$MY_variables{current_locale}}});
if ($MY_variables{current_locale} eq "ca") {
$Internal_variables{amazon_country} = "ca";
$MY_variables{amazon_base_url} = "http://www.amazon.ca/exec/obidos/ASIN/";
} elsif ($MY_variables{current_locale} eq "de") {
$Internal_variables{amazon_country} = "de";
$MY_variables{amazon_base_url} = "http://www.amazon.de/exec/obidos/ASIN/";
} elsif ($MY_variables{current_locale} eq "fr") {
$Internal_variables{amazon_country} = "fr";
$MY_variables{amazon_base_url} = "http://www.amazon.fr/exec/obidos/ASIN/";
} elsif ($MY_variables{current_locale} eq "jp") {
$Internal_variables{amazon_country} = "jp";
$MY_variables{amazon_base_url} = "http://www.amazon.co.jp/exec/obidos/ASIN/";
} elsif ($MY_variables{current_locale} eq "uk") {
$Internal_variables{amazon_country} = "co.uk";
$MY_variables{amazon_base_url} = "http://www.amazon.co.uk/exec/obidos/ASIN/";
} else {
$Internal_variables{amazon_country} = "com";
$MY_variables{amazon_base_url} = "http://www.amazon.com/exec/obidos/ASIN/";
}
$Internal_variables{amazon_url} = "http://www.amazon." . $Internal_variables{amazon_country} . "/gp/redirect.html?location=%2F&tag=$MY_variables{associate_id}&SubscriptionId=$MY_variables{subscription_id}";
$Internal_variables{amazon_site} = $Internal_variables{amazon_domain} . "." . $Internal_variables{amazon_country};
$Internal_variables{amazon_wwwsite} = $Internal_variables{amazon_wwwdomain} . "." . $Internal_variables{amazon_country};
if ($MY_variables{current_locale} eq 'jp') {
$Internal_variables{amazon_wwwsite} = $Internal_variables{amazon_wwwdomain} . ".co." . $Internal_variables{amazon_country};
}
# Get the system time value (which is referenced to UTC)
my $system_time = time();
# Calculate new time from UTC offset
my $time_difference = $time_zones[2] * 3600;
# Adjust the time value
my $adjusted_system_time = $system_time + $time_difference;
# Get the time for the locale
my @time_array = localtime($adjusted_system_time);
if ($time_array[8] == 0) {
push(@time_array, $time_zones[0]);
}elsif($time_array[8] == 1){
push(@time_array, $time_zones[1]);
}else{
push(@time_array, 'UNKNOWN');
}
# Adjust month number to real month number
$time_array[4] += 1;
# Adjust Year to be real year
$time_array[5] += 1900;
# Day
my $day = $time_array[3];
my $day_format = '%02d';
# Month
my $month = $time_array[4];
my $month_format = '%02d';
# Year
my $year = $time_array[5];
my $year_format = '%04d';
my $date_format = ''; # Initialize date format as blank string
my $i = 0; # Array index
for ($i = 3; $i <= 5; $i += 1 ) {
if ( $time_zones[$i] eq 'd' ) {
$date_format .= $day_format;
$time_array[$i] = $day;
}
if ( $time_zones[$i] eq 'm' ) {
$date_format .= $month_format;
$time_array[$i] = $month;
}
if ( $time_zones[$i] eq 'y' ) {
$date_format .= $year_format;
$time_array[$i] = $year;
}
unless ($i == 5) {
$date_format .= '/';
}
}
$MY_variables{time_stamp} = sprintf("$date_format %02d:%02d %s",
($time_array[3],
$time_array[4],
$time_array[5],
$time_array[2],
$time_array[1],
$time_array[9])
);
$debug .= qq[Time Stamp: $MY_variables{time_stamp}
\n];
}
sub get_url {
my $cwd = shift;
my ($this_xml_url,$xml_result,$url_options,$signed_value);
# my $base_url = "http://webservices.$MY_variables{amazon_site}/onca/xml?Service=AWSECommerceService&AssociateTag=$MY_variables{associate_id}&SubscriptionId=$MY_variables{subscription_id}&Version=2005-03-23&ResponseGroup=$MY_variables{ResponseGroups}";
my $base_url = "http://$Internal_variables{amazon_server}.$Internal_variables{amazon_site}/onca/xml?Service=AWSECommerceService&AssociateTag=$MY_variables{associate_id}&SubscriptionId=$MY_variables{subscription_id}&Version=2005-03-23&ResponseGroup=$MY_variables{ResponseGroups}";
if ($FORM{Operation}) {
if ($FORM{Operation} eq "ItemSearch") {
if ($FORM{Keywords}) {
$FORM{Keywords} =~ s/\s/\%20/g;
$FORM{Keywords} =~ s/\+/\%20/g;
$url_options = "&Keywords=$FORM{Keywords}";
}
if ($FORM{BrowseNode}) {
$url_options = "&BrowseNode=$FORM{BrowseNode}";
}
$this_xml_url = $base_url . "&Operation=ItemSearch&SearchIndex=$FORM{SearchIndex}&$url_options";
} elsif ($FORM{Operation} eq "ItemLookup") {
$this_xml_url = $base_url . "&Operation=ItemLookup&ItemId=$FORM{ItemId}";
}
}
$debug .= qq[this_xml_url: '$this_xml_url'
\n];
my $value = $this_xml_url;
$value =~ s/ /%20/g;
$value =~ s/BrowseNode=([^%&]+)%3A([^&]+)/BrowseNode=$1:$2/;
my ($cache_age,$cache_expire,$cache_time,%xml_cache,$xml_result,$dbm_error);
if ($FORM{ResponseGroup} =~ /Large|Medium|Offer|SellerListing/) {
$cache_age = 3600;
} else {
$cache_age = 86400;
}
$cache_expire = time() - $cache_age; $cache_time = $value . "_time";
# if ($Internal_variables{use_cache} eq "Yes" and $Internal_variables{debug_state} ne "on") {
if ($Internal_variables{use_cache} eq "Yes") {
$debug .= qq[Caching is ON
\n];
eval 'use Fcntl'; $dbm_error = $@;
eval 'use DB_File'; $dbm_error .= $@;
if (!$dbm_error) {
if (-s $Internal_variables{cache_file} > (7000 * $Internal_variables{cache_max_size})) { unlink $Internal_variables{cache_file}; }
eval 'tie(%xml_cache,"DB_File",$Internal_variables{cache_file},O_RDONLY)'; $dbm_error = $@;
$debug .= qq[Reading from Cache file
\n];
$debug .= qq[XML_CACHE value: '$xml_cache{$value}'
\n];
$debug .= qq[XML_CACHE cache_time: '$xml_cache{$cache_time}'
\n];
$debug .= qq[cache_expire: '$cache_expire'
\n];
}else{
$debug .= qq[!! DBM ERROR !!
\n];
}
}
if ($xml_cache{$value} and $xml_cache{$cache_time} > $cache_expire) {
$debug .= qq[Using Cached XML result
\n];
$xml_result = $xml_cache{$value};
untie %xml_cache;
} else {
$debug .= qq[NOT Using XML Cache
\n];
untie %xml_cache;
if ($cwd) {
$debug .= qq[XML Request
\n];
require $cwd . "/simpleget.pl";
# load request signing routine
my $test = require $cwd . "/sign_request.pl";
require $cwd . "/sign_request.pl";
$signed_value = sign_request($this_xml_url);
$debug .= qq[Signed XML Request
\n];
$xml_result = get($signed_value);
}
# if ($Internal_variables{use_cache} eq "Yes" and $Internal_variables{debug_state} ne "on" and !$dbm_error) {
if ($Internal_variables{use_cache} eq "Yes" and !$dbm_error) {
$debug .= qq[Caching is ON and DBM OK
\n];
my $count=0;
open(LOCK, ">$Internal_variables{cache_file}.lock");
until (flock(LOCK,2) or $count > 50) {
sleep .10;
++$count;
}
if ($count > 50) { $dbm_error = "lock failed"; }
if (!$dbm_error) {
eval 'tie(%xml_cache,"DB_File",$Internal_variables{cache_file},O_CREAT|O_RDWR)'; $dbm_error = $@;
if (keys(%xml_cache) > $Internal_variables{cache_max_size}) { undef %xml_cache; $debug .= "cleared cache
\n"; }
}
}
$xml_cache{$value} = $xml_result;
$xml_cache{$cache_time} = time;
$debug .= qq[Writing to Cache file
\n];
$debug .= qq[XML_CACHE value: '$xml_cache{$value}'
\n];
$debug .= qq[XML_CACHE cache_time: '$xml_cache{$cache_time}'
\n];
$debug .= qq[cache_expire: '$cache_expire'
\n];
untie %xml_cache;
close(LOCK);
}
return $xml_result;
}
sub select_random_product {
my $xml_result = shift;
my (@Details,$random_details,$error_msg);
if ($xml_result) {
$xml_result =~ s/- ]+)?>(.*?)<\/Item>/push @Details, $1;/gsie;
if (@Details) {
$random_details = $Details[rand @Details];
} else {
$error_msg = "Sorry no results are currently being returned for this query.";
$xml_result =~ s/([^<]+)<\/ErrorMsg>/$error_msg = $1;/esi;
}
}
return ($random_details,$error_msg);
}
sub build_product {
my $random_details = shift;
if ($random_details) {
$random_details =~ s/([^<]+)<\/URL>/$MY_variables{image_url_small} = $1/e;
$random_details =~ s/<([^>]+)>([^<]+)<\/\1>/$AWS_variables{$1} = $2;/gsie;
}
if (!$MY_variables{image_url_small}) { $MY_variables{image_url_small} = "http://g-images.amazon.com/images/G/01/books/icons/books-no-image.gif"; }
if ($link_to_apf eq "yes" and $AWS_variables{ASIN}) {
$MY_variables{result_link} = $location_of_apf . "?Operation=ItemLookup&ItemId=$AWS_variables{ASIN}&locale=$FORM{locale}";
} else {
$MY_variables{result_link} = $MY_variables{amazon_base_url} . $AWS_variables{ASIN} . "/" . $MY_variables{associate_id};
}
}
sub build_the_page {
my ($html,$error_msg) = @_;
if ($error_msg) { $html = $error_msg; }
if ($FORM{input_output} and $FORM{input_output} eq "javascript") {
$html =~ s/"/'/g;
$html =~ s/\n/"\);\ndocument.write\("/g;
$html = qq[document.write("] . $html . qq[");\n];
$html =~ s/(document.write\(")?<\/?SCRIPT[^>]*>("\);)?//gi;
}
print "Content-type: text/html; charset=utf-8\n\n";
print "$html\n";
}