Amazon Product Advertising API - Authentifizierung

10 07 2009

Amazon plant zum 15.08.2009 eine meiner Meinung nach recht komplizierte Änderung an der XML-Schnittstwelle zum Abfragen von Amazon-Daten.
Die Product Advertising API (ehemals Amazon Web Service) benötigt ab dem 15.08.2009 eine Authentifizierung sonst bekommt man keine Daten mehr ausgeliefert. Die Authentifizierungsmethode ist recht schwer zu verstehen finde ich, deshalb poste ich hier mal meine Lösung. Ist nicht gerade die eleganteste Lösung aber es müsste funktionieren. Aber ich übernehme keinen Gewähr ;-)

Die Abfrage ($api_url) ist eine Beispielabfrage und muss durch Eure eigene ersetzt werden. Aussderm müssen der “Access Key” und der “Secret Access Key” von Euch eingetragen werden.
Ganz wichtig ist dass die URL “urlencoded” sein muss. Und zwar aus dem UTF8-Zeichensatz heraus. Soll heissen erst den String (z.B. das übergebene Suchwort) nach UTF8 umwandeln und dann “urlencoden”.

Zum Beispiel:
$query_keyword = “Hängematte”;
$query_keyword = urlencode(utf8_encode($query_keyword));
Query:
http://webservices.amazon.de/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=xxx&Operation=ItemSearch&Keywords=”.$query_keyword.”&ResponseGroup=Medium&SearchIndex=Electronics&ItemPage=1

Solltet Ihr nicht aus Deutschland kommen dann muss noch die Local-Zone angepasst werden. Also in der URL und beim “$host” einfach .de durch Eure Local-Zone ersetzen.
Die Ergebnis-URL muss noch urlencoded werden und kann dann direkt z.B. mit simple_load_file geparst werden.
Also viel Spass damit und wenn es Fragen oder Anregungen gibt, immer her damit! Die Doku zur Amazon Product Advertising API ist übrigens auch recht schwer zu verstehen finde ich.

$api_url = "http://webservices.amazon.de/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=ACCESS_KEY&Sort=-price&Operation=ItemSearch&Keywords=KEYWORD&ResponseGroup=Medium&SearchIndex=SEARCH_INDEX&ItemPage=1";
 
#############################################################################################
## Amazon Product Advertising API Authentifizierung #########################################
#############################################################################################
function amazon_url_signer($raw_amazon_url){
	$file_03_01 = $raw_amazon_url."&Version=".date("Y-m-d");
	$file_03_02 = $file_03_01."&Timestamp=".str_replace(":", "%3A", str_replace("+00:00", "", gmdate("c")."Z"))."";
	$file_03_03 = str_replace(",", "%2C", $file_03_02);
	$file_03_04 = str_replace(";", "%3B", $file_03_03);
 
	$file_03_05 = parse_url($file_03_04);
	$file_03_06 = explode("&", $file_03_05["query"]);
		asort($file_03_06);
		for($i=0; $i < count($file_03_06); $i++){
			$file_03_06 = implode("&", $file_03_06);
		}
	$uri = "/onca/xml";
	$host = "webservices.amazon.de";
	$method = "GET";
	$file_03_07 = $method."\n".$host."\n".$uri."\n".$file_03_06;
 
	$file_03_08 = base64_encode(hash_hmac('sha256',$file_03_07,'SECRET_KEY',true));
	$file_03_09 = str_replace("%7E", "~", rawurlencode($file_03_08));
 
	$file_03_xx = $file_03_04."&Signature=".$file_03_09;
	return $file_03_xx;
}
############################################################################################# 
 
$file_for_xml = amazon_url_signer($api_url);


Zeichencodierung MySQL/PHP

16 02 2009

Um zwischen einem PHP-Script und der MySQL Datenbank (ab Version 4.1) einen Zeichensatz auszuhandeln den Beide in beiden Richtungen verwenden kann man nach dem Verbindungsaufbau zur MySQL-DB folgende Query senden:

SET NAMES 'utf8';

Um viele bereits falsch in der DB vorliegenden Zeichen zu korrigieren kann man das Programm DUK verwenden, welches automatisch falsch codierte Zeichen sucht und ersetzt.



Belegten Speicher nach einer MYSQL-Query wieder freigeben

23 10 2008

Um nach einer erledigten MYSQL-Query den davon belegten Speicher wieder freizugeben kann man die Funktion “mysql_free_result” verwenden.

Beispiel:
$query = mysql_query(”SELECT name FROM table”);
$result = mysql_fetch_array($query);

Mit mysql_free_result($query ); wird nun der durch die Query belegte Speicher freigegeben. Das macht aber eigetlich nur bei großen Abfragen (oder wenig Arbeitsspeicher) Sinn, da am Ende eines Scriptes der Speicher sowieso freigegeben wird.



Speicherbedarf eines PHP-Scriptes anzeigen

23 10 2008

Um den aktuellen Sepicherbedarf eines PHP-Scriptes anzeigen zu lassen kann man einfach die Funktion “memory_get_usage” verwenden.
So gibt..
echo memory_get_usage();
.. den aktuellen Speicherbedarf im Script in Bytes aus.



PHP: Remote Filesize

19 08 2008

Da die PHP-Funktion ‘filesize’ nur Datei handeln kann, die lokal auf dem Server liegen, kann man die Dateigröße von entfernten Dateien (Remote, Resource) mithilfe folgender Funktionen herausfinden.

PHP4:
function extern_filesize($url)
{
ob_start();
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_exec($ch);
curl_close($ch);

$head = ob_get_contents();
ob_end_clean();

$regex = ‘/Content-Length:\s([0-9].+?)\s/’;
$count = preg_match($regex, $head, $matches);

if (isset($matches[1]))
{
$size = $matches[1];
}
else
{
$size = ‘unbekannt’;
}
return $fsize;
}

Und in PHP5:

function urlfilesize($url,$thereturn) {
if (
substr($url,0,4)==‘http’) {
$x = array_change_key_case(get_headers($url, 1),CASE_LOWER);
$x = $x['content-length'];
}
else {
$x = @filesize($url); }
if (!
$thereturn) { return $x ; }
elseif(
$thereturn == ‘mb’) { return round($x / (1024*1024),2) ; }
elseif(
$thereturn == ‘kb’) { return round($x / (1024),2) ; }
}

echo urlfilesize(‘http://www.file.de/file.csv’,‘mb’)
Quelle: http://de2.php.net/manual/en/function.filesize.php#81906