httprequest,http_get oder http_post möglich?

Sind diese Befehle in IPS V1 möglich und wenn ja, was muss ich dafür tun? :wink:

Gruß
Jens

Hallo Jens,

DU meinst doch sicher die Protokolle dafuer? Oder? Sag mal lieber, was Du eigentlich machen willst.

Nabend Uwe,

ich möchte gern einen POST-Request (Content-Type: application/x-www-form-urlencoded) an eine URL absetzen und dabei gewisse Parameter übergeben bzw. über einen Request einen Login ausführen.
Außerdem hätte ich dann gern noch eine Art Rückmeldung ob die Übertragung geklappt hat, was mit meiner jetzigen Lösung nicht hin haut und auch zu umständlich ist. Ich denke über http_get und post ist es wesentlich einfacher, oder?

Abfrage vom Wlan Status:

   $url = "http://fritz.box/cgi-bin/webcm?getpage=../html/query.txt&var:cnt=1&var:n0=wlan:settings/ap_enabled";

   $Ausgabe = fopen("$url", "r");
   if (!$Ausgabe){
      echo("ERROR : Kann URL nicht öffnen : '$url'
");  // Kann URL nicht öffnen
   }

    $buffer = fgets($Ausgabe);
    echo $buffer;

Wlan ausschalten:

function PostToHost($host, $path, $referer, $data_to_send) {
  $fp = fsockopen($host, 80);
  printf("Open!
");
  fputs($fp, "POST $path HTTP/1.1
");
  fputs($fp, "Host: $host
");
  fputs($fp, "Referer: $referer
");
  fputs($fp, "Content-type: application/x-www-form-urlencoded
");
  fputs($fp, "Content-length: ". strlen($data_to_send) ."
");
  fputs($fp, "Connection: close

");
  fputs($fp, $data_to_send);
  printf("Sent!
");
  while(!feof($fp)) {
      $res = fgets($fp, 128);
  }
  printf("Done!
");
  fclose($fp);

  return $res;
}

$data = "wlan:settings/ap_enabled=0";

printf("Go!
");
$x = PostToHost(
              "fritz.box",
              "/cgi-bin/webcm",
              "http://fritz.box/cgi-bin/webcm",
              $data
               );  

Gruß
Jens

Hallo Jens,

Wenn ich dich richtig verstehe, möchtest du einer Web Seite Parameter per POST übergeben? Da du von einem Login sprichst, denke ich, dass meine Annahme richtig ist. Wenn ja, per POST ist es nicht so leicht wie mit einem GET. Ich habe es mit mehreren Methoden versucht, und es funktioniert am besten mit CURL. Anhand deines Codes, bin ich aber nicht sicher, was du durchgeben möchtest. Versuche etwas in der Art:


$url = "http://fritz.box/cgi-bin/webcm";
$postData = array('ap_enabled' => '0');
$h = curl_init("$url");
curl_setopt($h, CURLOPT_POST, 1);
curl_setopt($h, CURLOPT_POSTFIELDS, $postData);

ob_start();  // buffer

curl_exec($h);

curl_close($handle);  // curl schliessen

$result = ob_get_contents();
ob_end_clean();

Die Antwort is in $result und müsste eine Rückmeldung enthalten.
Es wird aber komplizierter, wenn die Seite gesichert ist.

Gruss,

Zapp

Hi Zapp,

wie müßte ich denn diese CURL Geschichte in IPS einbinden? … normal kennt IPS da ja nix (call to undefined function). Was ich letztendlich damit steuern bzw. auslesen möchte ist die Weboberfläche der Fritzbox … und zwar mit IPS. Dadurch benötige ich zuerst einen Login Request und danach dann die Abfrage obn nach dem Status oder die POST Geschichte um den Status zu verändern. Ich denke man könnte auch noch mehr damit machen, aber das reicht mir erst einmal :wink:

edit
ok, die dlls habeich eingebunden … für http und auch curl … aber wie verwende ich das jetzt?

@Zapp: Dein Code läuft leider so noch nicht, IPS hängt sich dabei auf :frowning:

Gruß
Jens

So, ich habe jetzt eine Lösung mit

http_post_fields()

gefunden. Jetzt muss ich nur noch herausfinden wie feststelle obs auch tatsächlich geklappt hat …

Gruß
Jens

Hallo Jens,

Mein Code war mehr als Hinweis gedacht und ist nicht komplett funktionsfähig. Ich habe selber keine Fritzbox und kenne die URL und die Parameter nicht. In $url musst du die komplette URL der Web Seite der Fritzbox angeben. Für die genauen Parameter, musst du dir ansehen, wie es die Fritzbox Benutzeroberfäche macht.

Ich habe gerade deinen Beitrag in einem anderen Forum gesehen :wink:
Da sagst du, dass es mit deinem Code oben klappt. Dann müsste es doch auch aus IPS aus funktionieren?

Gruss,

Zapp

:wink:

Ja, der Code von Oben läuft … nur dachte ich das es auch einfacher geht. Tut es auch … ich mache das jetzt so:

$response = http_post_fields("http://fritz.box/cgi-bin/webcm", array('wlan:settings/ap_enabled' => '0'));

In $response steht die Rückmeldung, aus der ich aber noch nicht herauslesen kann obs nun geklappt hat oder nicht. Voraussetzung ist auf jeden Fall das vorherige Anmelden an die Box (mache ich ebenfalls über http_post_fields), aber was ist wenn die Anmeldung mal fehl schlägt, dann klappt der Rest auch nicht … daher muss ich irgendwie noch versuchen eine Lösung zu finden :frowning:

Mit $ergebnis = curl_exec ($h); kann man in $ergebnis je nach vorheriger Einstellung von
curl_setopt ($h, CURLOPT_HEADER, 0/1 ); // 1 mit header
curl_setopt ($h, CURLOPT_NOBODY, 0/1); // 1 Ohne Body
die Antwort des WEb-Servers bekommen, also z.B:
HTTP/1.0 200 OK (kommt natürlich auf den Server an, sollte aber so sein)

Fehler fragt man nach curl_exec(); mit $error = curl_error($ch); ab

Wenn der Server nach einloggen weiterleitet, sollte vorher die Option
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
gesetzt sein

Zum Absetzen eines POST vor Aufruf von curl_exec()
curl_setopt($h, CURLOPT_POSTFIELDS, $inhalt);
curl_setopt($h, CURLOPT_POST, 1);
setzen.

Wie die Postfields auszufüllen sind, hängt natürlich von der Webseite ab. Sie werden einfach nach folgendem Muster mit & getrennt.
$inhalt = ‚user=Mustermann&passwort=1234‘;

Gruß Rolf

Uff … also ich bin froh das ich gerade einigermaßen mit PHP klar komme, jetzt auch noch CURL :smiley: … also die Antwort mit HTTP/1.0 200 OK kommt auf jeden Fall … da hatte ich zuerst gedacht, das das eine Art Bestätigung ist … nur die kommt dann immer :wink:

Die Antwort die in Response steht könnte ich mit nem Parser auswerten, aber ich werde mir noch mal euren Vorschlag mit CURL ansehen … vorausgesetzt ich bekomme das so zusammengesetzt, das es funktioniert :rolleyes:

Gruß
Jens

Ok, die Lösung mit CURL funktioniert jetzt auch, allerdings bekomme ich keine Fehlermeldung wenn ich nicht angemeldet bin … ich hab zwar jetzt die Anmeldung und das Ausschalten in einem Script zusammengesetzt, aber falls es mal nicht klappen sollte habe ich keine Kontrolle.
Also muss ich dann doch nach dem Absetzen des Befehls eine Rückfrage an die Box schicken und den Zustand vergleichen.
Letztendlich also kein Unterschied ob ich CURL oder HTTP nehme … nur bei HTTP ist der Code kleiner … schade

Gruß
Jens