![]() |
Cover von Amazon?
Ich suche eine Möglichkeit diverse Cover von Amazon zu beziehen. Hat vielleicht irgend wer einen Lösungsansatz?
|
Re: Cover von Amazon?
Du brauchst einen Api Key von Amazon dafür. Such mal hier in der Dp nach Amazon.
|
Re: Cover von Amazon?
Amazon hat dafür eine
![]() |
Re: Cover von Amazon?
Hmm. Nur leider lässt sich diese API nicht finden. Werde nochmals meine Brille putzen.
|
Re: Cover von Amazon?
Erstell dir einen Account und die werden dir eine geben. (Vermute ich)
|
Re: Cover von Amazon?
@Larsi, leider ist dem nicht so. Ich habe jetzt zwar eine Access Key ID und einen Secret Access Key, nur irgendwie hilft mir das nun auch nicht weiter.
|
Re: Cover von Amazon?
Bis vor dem 1. August war das recht unkompliziert. Amazon bietet einen Webservice an, über den das relativ einfach ging. Benötigt wird der Access Key ID und der Secret Access Key und die WSDL-Definition des Webdienstes (etwas versteckt war die auch zum Download bei Amazon erhältlich). Diese kann man in Delphi dann importieren und bekommt eine Unit (AWSECommerceService.pas) erstellt mit einer Klasse die den Zugriff auf Amazon kapselt. Der Zugriff lief ungefähr so (SmallImage, MediumImage und LargeImage sind Images auf der Form, Util eine kleine Hilfsunit von mir ):
Delphi-Quellcode:
Problem ist: Seit August muss jede Anfrage auf eine bestimmte Weise signiert sein. Damit habe ich mich nur am Rande beschäftigt. Im Prinzip bleibt es so wie oben gezeigt, aber ein passender Hashwert muss dazu - falls das jemand mit Delphi hinbekommt wäre ich sehr interessiert (in der DP gibt es eine unschöne Lösung mit einer 3rd-Party-Komponente).
var
AmazonPort: AWSECommerceServicePortType; body: ItemLookup; aRequest: ItemLookUpRequest; aResponse: ItemLookupResponse; Id: Array_Of_string; groups: Array_Of_string; Item: Item4 memstr: TMemoryStream; begin AmazonPort := GetAWSECommerceServicePortType(true, '', HTTPrio); // Verbindung aufbauen. HTTPrio wird gebraucht, um Umlaut per UTF8InHeader zu verarbeiten body := ItemLookup.Create; body.AWSAccessKeyId := 'DEIN ACCESSKEY'; body.SubscriptionId := 'Dein Amazon Associate Benutzername'; body.AssociateTag := 'Dein Amazon Associate Benutzername'; aRequest := ItemLookupRequest.Create; { Abfrage per ASIN-ID - der Amazon-Produktschlüssel} SetLength(Id, 1); Id[0] := 'Die ASIN zum Suchen'; aRequest.ItemId := Id; { Abfrage Gruppen (s. Dokumentation von Amazon) } SetLength(groups, 4); groups[0] := 'EditorialReview'; groups[1] := 'Images'; groups[2] := 'ItemAttributes'; groups[3] := 'Medium'; aRequest.ResponseGroup := groups; { Abfrage mit Body verbinden } SetLength(arr_request, 1); arr_request[0] := aRequest; body.Request := arr_request; aResponse := AmazonPort.ItemLookup(body); // Abfrage durchführen item := aResponse.Items[0].Item[0]; // Rückgabewert verarbeiten (Quick & Dirty fürs kurze zeigen) { Laden der Coverbilder } memstr := TMemoryStream.Create; Util.DownloadFromToStream(aResponse.Items[0].Item[0].SmallImage.URL, memstr); memstr.Seek(0, 0); SmallImage.LoadFromStream(memstr); memstr.Clear; Util.DownloadFromToStream(aResponse.Items[0].Item[0].MediumImage.URL, memstr); memstr.Seek(0, 0); MediumImage.LoadFromStream(memstr); memstr.Clear; Util.DownloadFromToStream(aResponse.Items[0].Item[0].LargeImage.URL, memstr); memstr.Seek(0, 0); LargeImage.LoadFromStream(memstr); memStr.Free; end; |
Re: Cover von Amazon?
Zitat:
|
Re: Cover von Amazon?
Ich habs nicht mehr im Kopf, aber es der Name war angegeben - ist kein Algorithmus von Amazon
Edit: Es ist ein HMAC Hash mit dem SHA256 Algorithmus gemäß RFC 2104 Ein Demo für C# gibt's wohl ![]() |
Re: Cover von Amazon?
Hi,
was ist das für eine unschöne variante mit ner 3rd Party Komponente? Würde mich interessieren. Ich find dazu nichts. Gruß tom |
Re: Cover von Amazon?
Zitat:
![]() |
Re: Cover von Amazon?
cool thanx :-)
|
Re: Cover von Amazon?
So Leute, ich habe es geschafft mein Cover-Load auf die AWS Version 4.0 umzustellen.
Da sich ja leider bei Amazon ab dem 08.08.2009 leider bei Amazon einiges geändert hat, ist das Abrufen von Cover wesentlich erschwert worden. Vor den oben genannten Datum funktioniert folgende Variant einwandfrei.
Delphi-Quellcode:
Jetzt greife ich via PHP über mein Tool (Delphi) auf den AWS zu.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, jpeg, ExtCtrls, JvGIF, StdCtrls, InvokeRegistry, Rio, SOAPHTTPClient, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, ComCtrls, amazonwebservices; procedure TCover.Button3Click(Sender: TObject); var AmazonService : AmazonSearchPort; myrequest : KeywordRequest; ret : ProductInfo; begin myrequest := KeywordRequest.Create; HTTPRio1.WSDLLocation := 'http://soap-eu.amazon.com/schemas3/AmazonWebServices.wsdl'; try myrequest.keyword := Edit1.Text; myrequest.page := '1'; myrequest.mode := 'music-de'; myrequest.sort := '+salesrank'; myrequest.tag :='webservices-20'; myrequest.type_ :='lite'; myrequest.devtag := 'xxxxxxxxxxxxxxxxxxxxx'; myrequest.locale :='de'; ret:=ProductInfo.Create; try try Amazonservice := HTTPRio1 as AmazonSearchPort; ret:=AmazonService.KeywordSearchRequest(myrequest); except exit; end; {process Productinfo} finally ret.free; end; finally myrequest.free; end; end; Hier der Beweis: ![]() Und wenns interessiert, poste ich nachher mal meine vollständige Lösung. |
Re: Cover von Amazon?
Zitat:
;) |
Re: Cover von Amazon?
Ich habe leider jetzt noch einen Zahnarzttermin. Danach poste ich die vollstänig Lösung.
|
Re: Cover von Amazon?
Na dann wollen wir mal.
Die Lösung ist zwar nicht ganz sauber und funktioniert nur über den Umweg "PHP". Zunächst benötigt ihr erst einmal einen Webspace mit PHP-Unterstützung, um später darauf euer Script ablegen und aufrufen zu können. Webspaceanbieter gibt es zu hauf, auch kostenlose!!! Solltet ihr bereits eine Domain euer Eigen nennen können, könnt ihr euch das Beschaffen von Webspace klemmen. :) Als nächster Schrit steht eine kostenlose Registrierung bei Amazon-Webservice an. Hier geht ihr wie folgt vor: 1. ruft folgende URL auf: ![]() 2. klickt danach auf die Schaltfläche "Sign up now" (oben rechts) um ein neuen Account anzulegen 3. Gebt alle benötigten Infos ein. 4. ihr bekommt darauf hin eine Mail mit weiteren Instruktionen 5. Nachdem ihr euch erfolgreich registriert habt, ruft ihr wieder oben genannte URL auf 6. Klickt dieses mal unter "Your Account" auf "Security Credentials" 7. Einloggen 8. Auf der Seite "Security Credentials", wo ihr jetzt hoffentlich seit, seht ihr eure persöhnlichen Identifikationsdaten (mehr im mittleren Bereich der Seite). Ihr benötigt eure "Access Key ID" sowie, und dafür auf "Show" klicken, euren "Secret Access Key". Am besten aufschreiben, speichern!!!! Das war die Amazon-Kiste. Als nächstes erstellen wir uns ein PHP-Script. Dieses ruft unsere gewünschten Infos aus unserer Suchabfrage, zu der wir später kommen, vom Server ab. Ihr könnt hierfür einen Texteditor, oder wer über Dreamweaver oder ähnliche Editoren verfügt, auch diesen verwenden. Nur mal so am Rande. Dreamweaver verfügt über ein brauchbares Syntax Highlighting und mach die ganze Sache übersichtlicher. Naja, soviel Codezeilen sind es ja nicht. :) Mein vollständiger PHP-Code:
Code:
Speichert nun diese Datei als name.php. Name ist natürlich durch euren Dateinamen zu ersetzen.
<?php
session_start(); //Könnte man sich auch schenken, da wir ja nach der Abfrage nichts //mehr vom Server wissen möchte $rubrik2 = $_REQUEST["rubrik1"]; //in dieser Variable steht die zu durchsuchende Rubrik drin $seite2 = $_REQUEST["seite1"]; //hier wird in dieser Variabel logischer Weise eine 1 //drin, da wir ja den ersten Treffer zurück haben wollen $schluesselwort2 = $_REQUEST["schluesselwort1"]; //hier steht der gesuchte Begriff //Damit man die Seite nicht von außen aufrufen kann, habe ich jetzt einen Sicherheitscheck eingebaut //Somit ist nun gewährleistet, dass man nur aus eurem Programm auf das Script zugreifen kann //und verarbeitet wird $check2 = $_REQUEST["check1"]; if ( $check2 == 'nennen wir diesen jetzt mal "sehr einfallsreich' ) { //sollte die Variable $check2 mit dem Request gepasst haben ist //alles OK $secret_access_key = "Eurer secret_access_key"; //hier muß eurer secret_access_key rein $access_key_id = "Eure access_key_id"; //hier muß eure access_key_id rein $associate_id = "ihredomainphantasie-23"; //Die associate_id könnt ihr wie oben übernehmen } else { //Sollte von aussen zugeriffen werden, wird der Else-Block ausgeführt und beendet //das Script echo 'keine Berechtigung'; die; } ?> //Den Rest könnt ihr jetzt übernehmen <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Unbenanntes Dokument</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <?php $dierubrik = "Music"; $meinthema = "Nena"; $tableweite = "width=\"100%\""; $cellspacg = "cellspacing=\"0\" cellpadding=\"0\""; $zelleprig = "padding-right: 10px; padding-top: 12px; padding-bottom: 15px;"; $zelleleft = "padding-left: 10px; padding-top: 12px; padding-bottom: 15px;"; $zellunten = "padding-left: 10px; padding-right: 10px; padding-top: 10px; padding-bottom: 10px;"; $tabla = "target=\"_blank\""; $goldbr = "<span class=\"goldbraun\">"; if ($_GET) { $SearchIndex = $rubrik2; $Keywords = $schluesselwort2; $ItemPage = $seite2; $eingang = array('Ä','ä','Ö','ö','Ü','ü','ß','<','>','(',')','{','}','[',']','/','\\',' '); $ausgang = array('Ae','ae','Oe','oe','Ue','ue','ss','no','nie','nicht','nein','na','nae','nee','nu','nn','mm','+'); $umlautade = str_replace($eingang,$ausgang,$Keywords); $SearchIndex = preg_replace("/[^a-zA-Z]/", "no", $SearchIndex); $ItemPage = preg_replace("/[^0-9]/", "1", $ItemPage); } else {$SearchIndex = $dierubrik; $umlautade = $meinthema; $ItemPage = 1; } print "\t<hr style=\"color: #FDFCFB; background-color: #FDFCFB\">\n"; $aktuelle = gmdate("Y-m-d\TH:i:s\Z"); $aktuellezeit = urlencode($aktuelle); $SearchIndex = urlencode($SearchIndex); $umlautade = urlencode($umlautade); $alleparameter = "AWSAccessKeyId" ."=". $access_key_id ."&". "AssociateTag" ."=". $associate_id ."&". "ItemPage" ."=". $ItemPage ."&". "Keywords" ."=". $umlautade ."&". "Operation" ."=". "ItemSearch" ."&". "ResponseGroup" ."=". "Medium" ."&". "SearchIndex" ."=". $SearchIndex ."&". "Service" ."=". "AWSECommerceService" ."&". "Timestamp" ."=". $aktuellezeit ."&". "Version" ."=". "2009-07-18"; $stringsignr = "GET\n"."ecs.amazonaws.de"."\n"."/onca/xml"."\n".$alleparameter; $signature1 = base64_encode(hash_hmac("sha256", $stringsignr, $secret_access_key, True)); $signature2 = urlencode($signature1); $daten = file_get_contents("http://ecs.amazonaws.de/onca/xml?".$alleparameter."&Signature=".$signature2); //Die XML-Datei wird als String geladen. $response = simplexml_load_string($daten); //Auf jeden Fall muss hier der Print der Tabelle beginnen echo "\n\t<table border=\"0\" ".$tableweite." ".$cellspacg.">\n"; foreach ($response->Items->Item as $movie) { echo "\t<tr><td align=\"center\" style=\"".$zelleprig." border-bottom: 1px solid rgb(255,255,255)\">\n"; //Bilder mit Link zur Detailseite if($movie->MediumImage->URL){ echo ("\t<a href=\"".$movie->DetailPageURL."\" ".$tabla."><img src=\"".$movie->LargeImage->URL."\" border=\"0\" alt=\"Cover\"></a></td>\n"); } else { echo 'Leider kein Bild vorhanden.'; } echo "\t<td align=\"center\" style=\"".$zelleleft." border-bottom: 1px solid rgb(255,255,255)\">\n"; } foreach ($response->Items->Request as $gefunden) { //echo ("Seite ".$gefunden->ItemSearchRequest->ItemPage); $SearchIndex = ($gefunden->ItemSearchRequest->SearchIndex); $Deutsch = array("Books" => "Bücher", "Music" => "Musik", "DVD" => "DVDs", "Toys" => "Spielwaren & Modellbau", "OutdoorLiving" => "Hobby & Freizeit", "Software" => "Software", "Tools" => "Werkzeug", "SoftwareVideoGames" => "Video & PC Spiele", "HomeGarden" => "Haus & Garten", "Kitchen" => "Haushalt", "Photo" => "Fotografie", "Electronics" => "Elektronik"); $Keywords = ($gefunden->ItemSearchRequest->Keywords); } foreach ($response->Items as $Ergebnisse) { //echo (" Treffer insgesamt: ".$Ergebnisse->TotalResults); //echo (" auf ".$Ergebnisse->TotalPages. " Seiten"); } ?> </body> </html> Ladet diese nun auf eurem Webspace hoch. Für ganz faule gibt es hier den Download des Scripts. Muß natürlich angepasst werden!!!! ![]() Fortsetzung folgt in ein paar Minuten. Brauche erst mal ein Käffchen!!!!! :-D Ich hoffe es war bis hier alles verständlich. Wenn nicht einfach posten. |
Re: Cover von Amazon?
Teil 2
Nun kommt der Delphi-Teil Oberfläche: Wir benötigen 3 Edit-Kompos, 1 Indy-HTTP-Client, 4 Labels, 1 Memo, 1 Button, 1 Image-Kompo und ein TWebBrowser. Schiebt euch die Kompos nach belieben zusammen, da die meisten Kompos, bis auf Image1, Edit1, Button1, TWebBrowser nicht sichtbar sind. (Eigenschaften - Visible) Setzt nun die Eigenschaft Width von TWebBrowser auf 0. Damit ist dieser auch nicht mehr zur Laufzeit zu sehen. Der Quelltext:
Delphi-Quellcode:
Das wars. Ich wünsche nun viel Spass beim nachbauen. Sollte es Schwierigkeiten, Verbesserungsvorschläge und/oder Kritik geben, einfach posten. Auch ich bin nicht perfekt!!! :stupid:
unit CoverUnit;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, OleCtrls, SHDocVw, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP, ExtCtrls, DynamicSkinForm, SkinCtrls; type TCover = class(TForm) Button1: TButton; Edit1: TEdit; WebBrowser1: TWebBrowser; Edit2: TEdit; Label1: TLabel; Label2: TLabel; IdHTTP1: TIdHTTP; Memo1: TMemo; Edit3: TEdit; Image1: TImage; Label3: TLabel; Label4: TLabel; spDynamicSkinForm1: TspDynamicSkinForm; spSkinPanel1: TspSkinPanel; procedure Button1Click(Sender: TObject); procedure WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); procedure FormShow(Sender: TObject); private { Private-Deklarationen } FTime: Longword; FBytes: Longword; public { Public-Deklarationen } end; var Cover: TCover; implementation {$R *.dfm} //Werte an die PHP übergeben //Hier werden alle benötigten Infos an unser Script Get-Methodenmäßig übergeben procedure TCover.Button1Click(Sender: TObject); var rubrik, seite, schluesselwort, check: String; begin rubrik:='Music'; seite:='1'; schluesselwort:=Edit1.Text; check:='nennen wir diesen jetzt mal "sehr einfallsreich'; WebBrowser1.Navigate('http://euer Server.de/Dateiname des Scripts.php?rubrik1='+rubrik+'&seite1='+seite+'&schluesselwort1='+schluesselwort+'&check1='+check); end; //Unser Script gibt nun die korrekte URL zum gesuchten Begriff aus // Diese URL (vielmehr datei downloaden wir jetzt //Danach parsen wir die Datei in das Memo1 und löschen diese wieder von unserer Festplatte //Aus Memo1 wird nun das gewünschte Bild(URL) gefiltert und an Edit3 aufbereitet übergeben. //Jetzt wird Die Datei runtergeladen und in Image1 angezeigt procedure TCover.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); var DownloadStream: TFilestream; Liste: TStrings; myString : String; ipString : String; i : Integer; begin Label1.Caption:=ExtractFilePath(ParamStr(0))+ 'Conf\data\temp.html'; Label4.Caption:=ExtractFilePath(ParamStr(0))+ 'Conf\data\temp.jpg'; Edit2.Text:=WebBrowser1.LocationURL; Label2.Caption:=Edit2.Text; DownloadStream := TFileStream.Create(Label1.Caption,fmCreate); try IDHTTP1.Get(Label2.Caption, downloadstream); finally DownloadStream.Free; Liste := TStringlist.Create; Liste.LoadFromFile(Label1.Caption); Memo1.Lines.AddStrings(Liste); Liste.Free; myString := Memo1.Text; i := Pos ('ecx',mystring); Delete (myString,1,i); i := Pos ('"',mystring); ipString := Copy(myString,1,i-1); Edit3.Text := 'http://e'+ipString; Memo1.Clear; DeleteFile(Label1.Caption); DownloadStream := TFileStream.Create(Label4.Caption,fmCreate); IDHTTP1.Get(Edit3.Text, downloadstream); DownloadStream.Free; Image1.Picture.LoadFromFile(Label4.Caption); end; end; end. Auch Erfolgsergebnisse könnt ihr mir posten. Eine PN tuts auch. lg, Mario PS: An Euch Moderatoren: Wenn ihr der Meinung seit, dass dies ein Eintrag in der Code-Libary wert ist, dann nichts wie rein damit. Das wäre denn mein erstes Example. :-D |
Re: Cover von Amazon?
Liste der Anhänge anzeigen (Anzahl: 1)
Hey mlspider,
du scheinst dich schon etwas mit AWS beschäftigt zu haben. Vielleicht kannst du mir weiterhelfen. Mein Problem ist jetzt nicht so kompliziert wie deins, geht nur um Standard-Produktdaten. Ich versuche schon seit ein paar Tagen amazon dazu zu bringen anstatt nach einer ASIN nach einer EAN zu suchen. Hast du eine Idee wie ich den angehängten Code abändern könnte? Mit der ASIN funktioniert es ohne Probleme, nur wenn ich den Typ auf EAN stelle und auch den Paramter ItemIndex hinzufüge, geht es immer noch nicht. |
Re: Cover von Amazon?
Wird die EAN überhaupt auf Amazon ausgegeben?
|
Re: Cover von Amazon?
Zitat:
Laut "Product Advertising API" kann beim ItemLookup der IdType auch eine EAN sein: ![]() deswegen hab ich meinen Request so angepasst, aber es klappt nicht.
Code:
die API hat folgendes Beispiel, aber ich habe alle Parameter ausm Beispiel übernommen:
$requestparms = 'AWSAccessKeyId='.$ACCESS_KEY_ID.'&AssociateTag=ws&IdType=EAN&ItemId=4010884534207&Operation=ItemLookup&SearchIndex=DVD&ResponseGroup=Request,Small&Service=AWSECommerceService&Timestamp='.$timestamp.'&Version=2009-10-01';
Code:
Und Signatur und Timestamp müssen richtig sein, weil für die ASIN funktioniert ja der Request, und ich änder ja nix als den Paramter ab. Und die Signatur wird ja für den Parameter entsprechend neuberechnet.
In the following request, the ItemId is an EAN, which requires that you also specify the SearchIndex and ItemType.
[url]http://ecs.amazonaws.com/onca/xml?[/url] Service=AWSECommerceService& AWSAccessKeyId=[AWS Access Key ID]& Operation=ItemLookup& ItemId=[EAN]& SearchIndex=Electronics& IdType=EAN &Timestamp=[YYYY-MM-DDThh:mm:ssZ] &Signature=[Request Signature] |
Re: Cover von Amazon?
Habt ihr ne Idee?
|
AW: Cover von Amazon?
ich hab das Beispiel mal kopiert und wollte es laufen lassen.
Aber es kommt immer eine Fehlermeldung: "Parse eeor: systeax error, unxepectet T_String in "....php" on line 153" In line153 steht: " Treffer insgesamt: ".$Ergebnisse->TotalResults);" Was kann ich da machen? Hab von PHP absolut keinen Plan... |
AW: Cover von Amazon?
Also auch wenn ich von PHP überhaupt keine Ahnung habe, das ist nicht das was bei Dir erscheint:
Code:
Vielleicht wäre es Hilfreich einmal Kommentare und Strings zu überprüfen.
foreach ($response->Items as $Ergebnisse) {
//echo (" Treffer insgesamt: ".$Ergebnisse->TotalResults); //echo (" auf ".$Ergebnisse->TotalPages. " Seiten"); } Gruß K-H |
AW: Cover von Amazon?
kann mir niemand helfen?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz