Wie schonmal erwähnt, habe ich mir eine Applikation gebaut, um nach Ebayauktionen in meiner Nähe zu suchen, mittlerweile ist aus dem Spagetticode eine richtige Klasse geworden. Und weil Crawlen nur bedingt geeignet ist und auch nicht ganz so legal, nutze ich nun die Ebay-Finding-Api. Hier biete ich den kompletten Quelltext dieser an, für Verbesserungvorschläge bin ich jederzeit offen. Bitte nicht zu sehr auf das Englisch in den Kommentaren achten, es war schon recht spät, als ich diese verfasst habe.
"10614", "Computer" => "160", "Garten" => "2032", "Heimwerker" => "3187", "Moebel" => "11700", "Spielzeug" => "220", "TV" => "293", "Fahrzeuge" => "9800", "Fahrzeugteile" => "131090", "Buero" => "9815", "Tierwelt" => "8440", "Buecher" => "267", ); const ENDPOINT = 'http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsAdvanced&SERVICE-VERSION=1.0.0'; // URL to call const APPID = [YOUR-APP-ID]; const SITE = 'EBAY-DE'; const TIMEZONE = 'Europe/Berlin'; /** * the preg_matched results * @var array */ private $results = array(); /** * url for apicall * @var string */ private $apicall; /** * filters for search result * @var array */ private $filters = array( array( 'name' => 'LocalPickupOnly', 'value' => 'true', ), array( 'name' => 'LocalSearchOnly', 'value' => 'true', ) ); /** * construcor of ebay crawler class, paramters * will be injected in apicall * @param int $itemsPerCat * @param int $radius * @param string $zip * @param float $maxcost * @return Ebay */ public function __construct($itemsPerCat=20, $radius=25, $zip=63667, $maxcost=1){ date_default_timezone_set(self::TIMEZONE); $this->apicall = self::ENDPOINT.'&GLOBAL-ID='.self::SITE.'&SECURITY-APPNAME='.self::APPID; $this->apicall .= '&buyerPostalCode='.$zip; $this->apicall .= '&paginationInput.entriesPerPage='.$itemsPerCat; $this->filters[] = array( 'name' => 'MaxPrice', 'value' => $maxcost, 'paramName' => 'Currency', 'paramValue' => 'EUR' ); $this->filters[] = array( 'name' => 'MaxDistance', 'value' => $radius, ); $this->addFiltersToCall(); } /** * sorts and returns the complete results * @return array */ public function getResults(){ usort($this->results, array($this,'sortit')); return $this->results; } /** * @param string $cat * @return void */ public function loadCat($cat){ $call = $this->apicall.'&categoryId='.self::$cats[$cat]; $response = simplexml_load_file($call); if($response->ack != 'Success'){ echo "Error in apicall while getting $cat: $call"; print_r($response); exit(); } $result = $response->searchResult; if($result['count'] == 0){ return; //no items found } foreach($result->item as $item){ //get seconds for sorting, then add item itself $end = strtotime($item->listingInfo->endTime); $str = (date("Y-m-d") == date("Y-m-d",$end)) ? "H:i:s" : "d.m. H:i:s"; $item->listingInfo->endTime = date($str, $end); if(strpos($item->location, ',')!==false){ $item->location = substr($item->location, 0, strrpos($item->location, ',')); } $this->results[] = array( 'seconds' => $end-time(), 'data' => $item ); } } /** * adds the filters to the apicall * @return void */ private function addFiltersToCall(){ $string = ''; foreach($this->filters as $i => $itemFilter){ foreach($itemFilter as $key => $value){ if(is_array($value) && count($value) > 0){ foreach($value as $j => $content){ $string .= "&itemFilter($i).$key($j)=$content"; } } else{ if($value != ''){ $string .= "&itemFilter($i).$key=$value"; } } } } $this->apicall .= $string; } /** * sort function for usort * @param array $a * @param array $b * @return int */ private function sortit($a,$b){ return ($a["seconds"] < $b["seconds"]) ? -1 : 1; } }
November 30th, 2009 at 00:27
Hallo,
bin auch gerade dabei ne lokale eBay-Suche zu bauen, bekomme aber keine gefilterten Ergebnisse mit ‘LocalPickupOnly’ Klappt das bei Dir?
Danke im voraus…
November 30th, 2009 at 16:26
Hi, bekommst du einfach nur keine Antwort oder irgendeine Fehlermeldung, wenn du das xml Objekt mal mit Print_r oder vardump ausgibst?
Dezember 1st, 2009 at 00:41
Ich bekomme schon ne Antwort, bloss die Filterung klappt nicht, er gibt mir auch Artikel raus, die verschickt werden sollen (also kein FreePickup)
Dezember 1st, 2009 at 07:29
zeig mal deinen apicall inkl aller parameter (außer dem api-key natürlich)
Dezember 1st, 2009 at 09:56
da wäre z.B.
http://svcs.ebay.com/services/search/FindingService/v1?OPERATION-NAME=findItemsAdvanced&SERVICE-VERSION=1.0.0&GLOBAL-ID=EBAY-DE&SECURITY-APPNAME=appid&buyerPostalCode=59457&paginationInput.entriesPerPage=20&itemFilter(0).name=MaxDistance&itemFilter(0).value=25&itemFilter(1).name=LocalPickupOnly&itemFilter(1).value=true&categoryId=12081&sortOrder=EndTimeSoonest
Der gibt zwar lokale Werte zurück, aber eben bunt gemischt und nicht wie ich erwarten würde nur Datensätze mit dem Attribut FreePickup.
Dezember 1st, 2009 at 10:03
Ich denke die Variable ist ziemlich bescheiden benannt, es werden Artikel ausgegeben, bei denen die Selbstabholung möglich ist, auch die, wo sie zusätzlich möglich ist. Du müsstest die Versandsachen evtl. noch über nen anderen Filter ausschließen. Bei mir ergibt die Suche auch alles, was auch so gewollt ist, über den Distanzfilter sorge ich dafür, dass es nur Dinge in meiner Umgebung sind, der Rest ist doch eigentlich egal, oder nicht?