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;
	}
}

6 Antworten zu “Klasse zum Crawlen von Ebayauktionen (Ebay-Api)”

  1. Ralf says:

    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…

  2. Michael says:

    Hi, bekommst du einfach nur keine Antwort oder irgendeine Fehlermeldung, wenn du das xml Objekt mal mit Print_r oder vardump ausgibst?

  3. Ralf says:

    Ich bekomme schon ne Antwort, bloss die Filterung klappt nicht, er gibt mir auch Artikel raus, die verschickt werden sollen (also kein FreePickup)

  4. Michael says:

    zeig mal deinen apicall inkl aller parameter (außer dem api-key natürlich)

  5. Ralf says:

    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.

  6. Michael says:

    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?

Hinterlasse einen Kommentar.

Network-wide options by YD - Freelance Wordpress Developer