Overpass-api: Kein Empfang mehr von Daten

Hallo zusammen,

ich habe seit kurzem das Problem, dass ich keine Daten mehr von der overpass-API empfangen kann. Ich habe dass ganze auch schon über mein Handy, Laptop und PC probiert. Mit und ohne WLAN. Die entsprechende Fehlermeldung lautet:
Failed to open stream: HTTP request failed! HTTP/1.1 406 Not Acceptable in ……….
Die Overpass api läuft nicht über einen User Agent script. Das tat diese aber noch nie. Sollte es daran liegen? Aber wie baue ich diesen dann in die Overpass api Abfrage ein? Nomination läuft über einen User Agent script einwandfrei d.h. empfange ich hier alle Daten.

Ich habe alternativ mal versucht, Autobahnen über nominatin zu finden. Aber leider ohne Erfolg. Ist dies überhaupt möglich?

Vielen Dank im voraus für Eure Hilfe

<?php
require ("useragent.php");
$agent = new userAgent();
$browser = $agent->generate('chrome');
$opts = array('http'=>array('header'=>"User-Agent: ".$browser."\r\n"));
$context = stream_context_create($opts);

$lat=50.991108;
$lon=6.893529;

$uk1=$lon-0.04300; // 3 KM
$uk2=$lat-0.02700; // 3 KM
$uk3=$lon+0.04300; // 3 KM
$uk4=$lat+0.02700; // 3 KM

echo "<pre>";

echo "<br>------------------- Naherholungsgebiet ---------------------------------<br>";

$a1 = file_get_contents('https://nominatim.openstreetmap.org/search?viewbox='.$uk1.','.$uk2.','.$uk3.','.$uk4.'&bounded=1&format=json&polygon=0&addressdetails=0&q=naherholungsgebiet&limit=999', false, $context);
$a2 = json_decode($a1);
print_r ($a2);

echo "<br>------------------- Autobahn ---------------------------------<br>";

$d1 = file_get_contents('https://nominatim.openstreetmap.org/search?viewbox='.$uk1.','.$uk2.','.$uk3.','.$uk4.'&bounded=1&format=json&polygon=0&addressdetails=0&q=Schnellstrasse&limit=999', false, $context);
$d2 = json_decode($d1);
print_r ($d2);

echo "<br>------------------- Autobahn ---------------------------------<br>";

$url='https://www.overpass-api.de/api/interpreter?data=[out:json];way[highway="motorway_link"]('.$uk2.','.$uk1.','.$uk4.','.$uk3.');out+999;';
$g1 = file_get_contents($url);
$g2 = json_decode($g1);
print_r ($g2);

?>

Siehe:

1 Like

Vielleicht einen anderen User-Agent-Header probieren. Siehe Overpass API - Error 406

Ich nutze zwar python statt php, aber ohne User-Agent oder mit dem “Standard” User-Agent ‘Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17(KHTML, like Gecko) Chrome/24.0.1312.27 Safari/537.17’ habe ich auch 406 erhalten.
Mit User-Agent = ’ username data for xy ’ hat es dann geklappt.

Was ist das denn für eine Biblothek? Solltest du gleich entsorgen, weil die nicht den Nutzungsbedingungen von Overpass entspricht. Diese sagen sehr deutlich, dass man keine User-Agents impersonieren soll.

1 Like

Ob du nun Tiles von osm.org oder Daten von Overpass oder Nominatim abfragst, alle Nutzungsbedingungen verlangen von dir, einen eindeutigen User-Agent/Referrer zu schicken, der genau dein Script/deinen Service identifiziert.

Danke für Eure Hilfe. Ich habe Euren Rat befolgt und den User Agent Script entfernt. Aber wenn ich ich nun mittels

 $opts = array('http'=>array('header'=>"User-Agent: ".$_SERVER['HTTP_USER_AGENT']."\r\n"));

meine korrekten Daten übermittel, erhalte ich nur eine Ausgabe der Naherholungsgebiete (nominatim)

Wenn ich hingegen den fiktiven User Agent

$opts = array('http'=>array('header'=>"User-Agent: MyCleverAddressScript 1.0.0\r\n")); 

anwende, erhalte ich zusätzlich eine Ausgabe der Autobahnen (overpass-api). Ich verstehe wirklich nicht, woran das liegen kann :roll_eyes:

Ich würde vermuten das $_SERVER['HTTP_USER_AGENT'] dein Script nicht hinreichend identifiziert sondern ein generischer User Agent ist. Nominatim scheint sich hier (noch) großzügig zu verhalten und dir das durchgehen zu lassen, Overpass nicht.

MyCleverAddressScript 1.0.0 identifiziert genau dein Script/Service und ist das, was die Nutzungsbedingungen erfordern.

Super, danke für den Tip. Ich habe jetzt den Script nun wie folgt umgestellt:

<?php
$opts = array('http'=>array('header'=>"User-Agent: MyCleverAddressScript 1.0.0\r\n"));  // Neuer User-Agent
$context = stream_context_create($opts);

$lat=50.991108;
$lon=6.893529;

$uk1=$lon-0.04300; // 3 KM
$uk2=$lat-0.02700; // 3 KM
$uk3=$lon+0.04300; // 3 KM
$uk4=$lat+0.02700; // 3 KM

echo "<pre>";

echo "<br>------------------- Naherholungsgebiet ---------------------------------<br>";

$a1 = file_get_contents('https://nominatim.openstreetmap.org/search?viewbox='.$uk1.','.$uk2.','.$uk3.','.$uk4.'&bounded=1&format=json&polygon=0&addressdetails=0&q=naherholungsgebiet&limit=999', false, $context);
$a2 = json_decode($a1);
print_r ($a2);

echo "<br>------------------- Autobahn ---------------------------------<br>";

$url='https://www.overpass-api.de/api/interpreter?data=[out:json];way[highway="motorway_link"]('.$uk2.','.$uk1.','.$uk4.','.$uk3.');out+999;';
$g1 = file_get_contents($url,false, $context);  // ",false, $context" eingefügt
$g2 = json_decode($g1);
print_r ($g2);
?>

Das ganze funktioniert jetzt einwandfrei. Ich verstehe aber nicht, was dieser MyCleverAddressScript 1.0.0 ist. Der script funktiniert auch, wenn ich
$opts = array('http'=>array('header'=>"User-Agent: allemeineentchen\r\n")); // Neuer User-Agent
verwende. Aber will openstreetmap nicht meine realen Browserdaten?

Die Services wollen genau deinen Service identifizieren können, dass sie genau deinen Service abklemmen können, wenn du die Server übermäßig belastest, nicht alle Leute die einen Chrome-Browser verwenden.

Ok, ich glaube, dass ich es jetzt verstanden habe. Dann schauen wir mal ob es auch weiterhin funktioniert. Vielen Lieben Dank für die Hilfe :smiley: