• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Opencaching.de API

solar22

Geocacher
Hallo,

ich muss in Informatik ein Programm schreiben (egal was) und hab mich für eine CacheDB entschieden, einfach um mich auch mal mit der API von OC vertraut zu machen.
Nur gibt es außer dieser Doku noch andere Hilfen? Leider funktioniert die XML Ausgabe nur sehr langsam. Gibt es neuere Sachen?

Gruß.
Solar22
 

Oliver

Geowizard
Hi,

ich muss in Informatik ein Programm schreiben (egal was) und hab mich für eine CacheDB entschieden, einfach um mich auch mal mit der API von OC vertraut zu machen.

nett, dass du dabei an OC denkst :)

Ausser der XML-Schnittstelle gibt es aktuell keine weitere Schnittstelle, die "out-of-the-box" funktioniert (nur paar Prototypen). Achte bitte darauf, dass du beim Testen mit der XML-Schnittstelle nur inkrementell arbeitest und bei Testabrufen mit möglichst wenig Datensätzen arbeitest. Danke.

Falls es dir nur um die Daten geht und nicht die Schnittstellenprogrammierung, kann ich dir evtl. eine MS Access-DB schicken (schick mir dann bitte eine PN).

Schöne Grüße,
Oliver
 
OP
S

solar22

Geocacher
Hi Oliver,

erstmal danke für deine Antwort :)
Mir würde es ja reichen, wenn mir die XML Api immer nur die Waypoints ausgibt. Ich hab gestern nämlich mal in PHP mir eine kleine Klasse geschrieben, die anhand des Waypoint die GPX Datei von der Seite lädt und mir dann die Daten aus dem XML Syntax holt, hier mal mein erster Prototyp:
Code:
<?php

/*********************
** Class: Opencaching
** Author: Alexander Grüßung <alexander at gruessung-online dot de>
** Url: www.gvisions.de
** Version: 0.4
** License: http://creativecommons.org/licenses/by-sa/3.0/de/
** Danke an OC für den Service.
*********************/

class Opencaching {
	
	private $cacheID = "";  //die ID des Caches im OC System
	private $xmlFile = "";  // Inhalt der XML Datei zum Cache
	private $xmlCache = "cache/opencaching/"; // Link zur XML File im Programmcache (../cache/opencaching/WAYPOINT.xml)
	private $gpxLink = "";  // Link zur GPX File auf OC.de
	private $wp = "";       // Waypoint auf OC, REQUIRED!
	public $Cache = array();//Beinhaltet alle relevanten Cacheinformationen

	/**
	 * function construct
	 * Schreibt den übergebenen Waypoint in die Variable und holt gleich nützliche Infos und Cached
	 **/
	function __construct($wp) {
		$this->wp = $wp;
		$this->xmlCache = $this->xmlCache.$this->wp.".xml";
		if (!@file_exists("cache/opencaching/".$this->wp.".xml")) {
			$this->getGpxLink();			
			$this->loadXmlToCache("http://opencaching.de/".$this->gpxLink);
		}
		$this->loadXML($this->xmlCache);
		
	}
	
	/**
	 * function getGpxLink
	 * Ermittelt den Downloadlink der GPX Datei mithilfe des WP und des Quelltextes der OC Seite
	 **/
	function getGpxLink() {
		$cacheHTML = file_get_contents('http://www.opencaching.de/viewcache.php?wp='.$this->wp.'');
		$regexp_link ='/<a\s+.*?href=[\"\']?([^\"\' >]*)[\"\']?[^>]*>GPX<\/a>/si';
		preg_match_all($regexp_link, $cacheHTML, $alle_links); 
		$gpxLink = $alle_links[1][0];
		$this->gpxLink = $gpxLink;
		return true;
	}

	/**
	 * function loadXmlToCache
	 * Damit die OC Seite nicht immer belastet wird, wird die XML Datei lokal gecached
	 **/
	function loadXmlToCache($xml) {
		$xmlSource = file_get_contents($xml);
		$xmlCache = fopen("cache/opencaching/".$this->wp.".xml","w+");
		$xmlSource = preg_replace("%<gpx%","<xml",$xmlSource);
		$xmlSource = preg_replace("%</gpx>%","</xml>",$xmlSource);
		fwrite($xmlCache,$xmlSource);
		fclose($xmlCache);
		$this->xmlCache = "cache/opencaching/".$this->wp.".xml";
	}

	/**
	 * function loadXML
	 * Lade die XML Datei mit allen Cacheinfos
	 **/
	function loadXML($xml) {
		$xmlFile = @simplexml_load_file($xml);
		$this->xmlFile = $xmlFile;
		return true;
	}

	
	/**
	 * function getCacheInformation
	 * Schreibt alle wichtigen Infos eines Caches in ein Array
	 **/
	function getCacheInformation() {
		$Cache = array();
		$Cache['id'] = $this->xmlFile->wpt->extensions->cache['id'];
		$Cache['wp'] = $this->wp;
		$Cache['coord']['lat'] = $this->xmlFile->wpt['lat'];
		$Cache['coord']['lon'] = $this->xmlFile->wpt['lon'];
		$Cache['time']=$this->xmlFile->wpt->time;
		$Cache['url']=$this->xmlFile->wpt->url;
		$Cache['name'] = $this->xmlFile->wpt->urlname;
		$Cache['type']=$this->xmlFile->wpt->extensions->cache->type;
		$Cache['status']=$this->xmlFile->wpt->extensions->cache['status'];
		$Cache['owner'] = $this->xmlFile->wpt->extensions->cache->owner;  //ownerID = ['owner']['userid']
		$Cache['state'] = htmlentities($this->xmlFile->wpt->extensions->cache->state);
		$Cache['country'] = htmlentities($this->xmlFile->wpt->extensions->cache->country);
		$Cache['container'] = $this->xmlFile->wpt->extensions->cache->container;
		$Cache['difficulty'] = $this->xmlFile->wpt->extensions->cache->difficulty;
		$Cache['terrain'] = $this->xmlFile->wpt->extensions->cache->terrain;
		$Cache['desc'] = $this->xmlFile->wpt->extensions->cache->long_description;
		$Cache['hint'] = $this->xmlFile->wpt->extensions->cache->encoded_hints;
		return $Cache;
	}
}

Ich hoffe, ich belast die Seite damit noch weniger als mit dem ständigen großen API Aufruf :)

Gruß.
Alex
(Wer den Code verwenden möchte: License ist im ClassHeader angegeben.)
 

DunkleAura

Geowizard
solar22 schrieb:
Mir würde es ja reichen, wenn mir die XML Api immer nur die Waypoints ausgibt. Ich hab gestern nämlich mal in PHP mir eine kleine Klasse geschrieben, die anhand des Waypoint die GPX Datei von der Seite lädt und mir dann die Daten aus dem XML Syntax holt, hier mal mein erster Prototyp:
Code:
<?php […code…]

Ich hoffe, ich belast die Seite damit noch weniger als mit dem ständigen großen API Aufruf :)

(Wer den Code verwenden möchte: License ist im ClassHeader angegeben.)
interessante klasse.
danke schonmal.

ich denke dass die in einem gist oder direkt git repository auf github sehrgut aufgehoben wäre.
(weil ich mag submodules die rocken einfach z.B. git submodule add git://github.com/<user>/<gitrepo>.git libs/<gitrepo>)
 

Oliver

Geowizard
solar22 schrieb:
Ich hoffe, ich belast die Seite damit noch weniger als mit dem ständigen großen API Aufruf :)

Selbstverständlich belastet ein GPX-Download (bzw. über 35000 GPX-Downloads) unseren Server mehr als ein paar Aufrufe der XML-Schnittstelle. Mit der GPX-Datei bekommst du ja auch nicht alle Daten. Du must mit der XML-Schnittstelle die Daten 1x komplett runterladen, in einer lokalen Datenbank speichern und dann inkrementell aktualisieren - dann ist da auch nix langsam?! Wie gesagt, bitte nur bei der Testerei ein "modifiedsince" von z.B. "heute morgen 0 Uhr" angeben. Wenn du dann fertig bist, einmal durchlaufen lassen und z.B. stündlich aktualisieren.
 
OP
S

solar22

Geocacher
Ich hab mal ein Repository auf github angelegt für die Klasse:
klick mich

@Oliver: Ich brauch ja nicht alle Caches, das ist es ja. Im Endeffekt brauch ich nur immer einzelne Caches, die der Nutzer angibt. Wenn ich immer alles runterladen würde, denke ich zumindest, wären das doch noch mehr Daten.

Edit: Ich würde ja über die API gehen gerne, nur wenn ich mit &wp=OCB0E9 arbeite, zB Aufruf:
http://www.opencaching.de/xml/ocxml11.php?wp=OCB0E9&modifiedsince=20100921000000
Und dann die angezeigte SessionID (708381) aufrufe kommt: filenr out of range (auch mit &file=1)
 

Oliver

Geowizard
Also geht in deiner Anwendung ein Popup hoch "Wegpunkt eingeben" und daraufhin soll von OC die GPX-Datei herintergeladen werden?
 
OP
S

solar22

Geocacher
Eigentlich soll einfach die Cachedaten runtergeladen werden, da in der GPX Datei alles nötige ist, und die Datei ja nur ca. 2,4kb großist, denke ich, das dich ganz ok ist.
Die Daten speicher ich ja auf der Festplatte, damit nicht immer runtergeladen werden muss.
Wie gesagt antwortet die API bei mir nicht so wie sie das sollte :D
 

Oliver

Geowizard
solar22 schrieb:
Eigentlich soll einfach die Cachedaten runtergeladen werden, da in der GPX Datei alles nötige ist, und die Datei ja nur ca. 2,4kb großist, denke ich, das dich ganz ok ist.
Die Daten speicher ich ja auf der Festplatte, damit nicht immer runtergeladen werden muss.

hm, schreib doch mal was du willst ... ALLE Caches runterladen oder nur EINZELNE Caches?

Für ALLE (oder viele) ist die vorhandene XML-Schnittstelle richtig - dann aber mit Koordinatenangaben oder ganz ohne Filter.

Für EINZELNE Caches ist die XML-Schnittstelle eher ungeeignet.

solar22 schrieb:
Wie gesagt antwortet die API bei mir nicht so wie sie das sollte :D

Doch, tut sie. Du hast nur die falschen Parameter bzw. nicht alle wie in der Doku angegeben.

http://www.opencaching.de/xml/ocxml11.php?wp=OCB0E9&modifiedsince=20100921000000&cache=1&session=0&charset=utf-8&zip=0
 

Oliver

Geowizard
Okay, dann nimm sowas (ich hab eben den WP in das Such-Backend eingebaut):
http://www.opencaching.de/search.php?searchto=searchbywp&showresult=1&expert=0&utf8=1&wp=OC1234&output=GPX2

Solange die heruntergeladenen Daten dann nicht weiter veröffentlicht werden und du nicht tonnenweise Caches herunterlädst, ist das ohne weitere Vereinbarung mit OC machbar - wenn du die so bezogenen Daten wieder weiter veröffentlichen willst (z.B. auf der eigenen Homepage), bitte Mail an das OC-Team um die Details abzustimmen.

Edit: Bitte beachten, dass wir an dem GPX2-Format noch arbeiten (es kommen noch Daten dazu).
 
OP
S

solar22

Geocacher
Da ich jetzt nicht genau weiß, ob mein Anliegen (das zwischenspeichern der Caches) unter Veröffentlichung, etc. liegt schreib ich trotzdem mal eine Mail :)
Sicher ist sicher. ^^
 
Oben