Problem mit fsockopen()

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit fsockopen()

    Hi Leute,

    ich habe ein Problem mit fsockopen().

    Und zwar möchte ich mich auf einer Seite automatisch einloggen, und anschliessend den HTML-Code der Seite nach dem Login parsen.

    Da die Login-Seite einige Daten als POST von Form-Feldern erwartet, benutze ich fsockopen() anstatt die Seite über file() anzusprechen.

    Das klappt auch soweit schon sehr gut, mit dem Problem, dass die Login-Seite anscheinend einen Redirect auf die Seite macht, die ich eigentlich auslesen möchte.

    D.h., sobald ich die Login-Seite über fsockopen() anspreche, erhalte ich eine Response einen "302 found" Fehler.

    Ich habe jetzt schon mehrere Foren nach dem Problem durchstöbert, komme damit aber einfach nicht weiter.

    Der Code müsste dem Redirect folgen, und mir den HTML-Code der Seite auf der ich dann lande in eine Variable schreiben.

    Kann mir hier vielleicht jemand helfen ?

    Gruss und Danke
    Pegamode

  • #2
    du brauchst dir ja nur auslesen, wohin der redirect geht...

    hier ist mal eine fkt von mir, die ich vor sehr sehr langer zeit mal dafür geschrieben habe.


    PHP-Code:
    function GetRedirectLocation ($checkurl="") {

      if (
    $checkurl=="" || !strstr($checkurl"http://")) { $returnvar "no URL present"; } else {

        
    $httplen   strlen("http://");
        
    $findslash strpos($checkurl"/"$httplen);

        
    $get_head  = (strlen($checkurl)>$findslash+1) ? "GET" "HEAD";

        
    $host substr $checkurl7$findslash-$httplen);
        
    $uri  substr $checkurl$findslash);
        
    $ip   gethostbyname($host);

        
    $sock fsockopen($ip80$errno$errstr30);
        
    fputs ($sock$get_head." ".$uri." HTTP/1.1\r\n");
        
    fputs ($sock"HOST: ".$host."\r\n");
        
    fputs ($sock"\r\n");

        while (!
    feof($sock)) {
          
    $temp fgets ($sock,128);
          if (
    strstr($temp"Location: ")) $location str_replace("\r\n"""$temp);
        }
        
    $location str_replace("Location: """$location);

        
    $returnvar $location;

      }
      return 
    $returnvar;


    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Danke schonmal für die schnelle Antwort.

      Mein Problem dabei ist, dass an dem Redirect eine SessionID dranhängt.

      Immer wenn ich die URL, die ich unter Location erhalte anspreche, erhalte ich die Meldung, dass die Session abgelaufen ist.

      An der Stelle komme ich einfach nicht weiter.

      Gruss
      Pegamode

      Kommentar


      • #4
        dann musst du die session id im header als cookie-fake mitsenden, denke ich ....
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Kommentar


        • #5
          Kannst Du mir ungefähr sagen, wie ich das zu machen habe ?

          Habe noch nicht so die ganz grosse Ahnung von PHP, da ich eigentlich JAVA-Programmierer bin, und über HTTP-Header weiss ich leider auch nicht so sehr viel.

          Wäre echt super,

          Danke.

          Gruss
          Pegamode

          Kommentar


          • #6
            soviel kann ich dir da auch nciht sagen. aber einen tipp kann ich die geben. -> google.

            suche dort einfach nach den passenden RFCs
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #7
              Danke für die Hilfe, ich hab's endlich geschafft.

              Habe einfach im Header noch Cookie: ses=... angegeben und jetzt läuft es.

              Gruss
              Pegamode

              Kommentar


              • #8
                wunderbar. du kannst ja den relevaten code in mein snippet einbinden, damit auch andere user was davon haben...
                INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                Kommentar


                • #9
                  Hm, die Frage, wie ich ein gestztes Cookie senden kann, stelle ich mir grade auch.

                  Es geht hier um ein Script, welches über eine post2host Funktion einen Login in einem Forum vornimmt, um anschliessend etwas zu posten.

                  Der Login funktioniert wunderbar, doch wie komme ich dann noch zu der "addreply.php" und kann der ebenfalls mit einem post2host Daten übermitteln?

                  Zur Zeit habe ich 2xpost2host Schnipsel, erst der, der mich einloggt, dann der, der posten soll.
                  Das Problem ist nur eben das Cookie.. Das Script baut beim 1. mal die verbindung ja wieder ab, beim 2. post2host wieder neu auf, somit bringt mir die alte sid nix mehr..

                  Kann mir da jmd weiterhelfen??



                  Der untere Teil sorgt dafür, das ich auf die korrekte Forums Index weitergeleitet werde. Zeitgleich wird die sid in der Variable "$string" gespeichert.
                  (Hatte da mal rumprobiert..)



                  PHP-Code:
                  function PostToHost($host$path$referer$data_to_send) {
                    
                  $fp fsockopen($host80);
                    
                  printf("Open!\n");
                    
                  fputs($fp"POST $path HTTP/1.1\r\n");
                    
                  fputs($fp"Host: $host\r\n");
                    
                  fputs($fp"Referer: $referer\r\n");
                    
                  fputs($fp"Content-type: application/x-www-form-urlencoded\r\n");
                    
                  fputs($fp"Content-length: "strlen($data_to_send) ."\r\n");
                    
                  fputs($fp"Cookie: sid=$string\r\n");
                    
                  fputs($fp"Connection: close\r\n\r\n");
                    
                  fputs($fp$data_to_send);
                    
                  printf("Sent!\n");
                    while(!
                  feof($fp)) {
                        
                  $res .= fgets($fp128);
                    }
                    
                  printf("Done!\n");
                    
                  fclose($fp);

                    return 
                  $res;
                  }





                  $data "l_username=testuser&l_password=pw&send=1";

                  printf("Go!\n");
                  $x PostToHost(
                                
                  "example",
                                
                  "/forum/login.php",
                                
                  "example/forum/login.php?",
                                
                  $data
                  );


                  $html htmlentities($x);
                  $html ereg_replace('5;URL''1;URL'$html);
                  $html ereg_replace('index.php''http://example/forum/index.php'$html);

                  $html4 html_entity_decode($html);
                  echo 
                  $html4;
                  preg_match_all('|sid=(.*?)/>|Uism',$html4,$matches); 
                  $string $matches[0][0]; 
                  $string ereg_replace('sid='''$string);
                  $string ereg_replace('" />'''$string);

                  echo 
                  $html4

                  Und hier noch das, womit ich die Daten an die addreply.php senden wollte.

                  PHP-Code:
                  $data2 "sid=$string&threadid=290&message=Taschenlampe&send=1";

                  printf("Go!\n");
                  $xy PostToHost(
                                
                  "example.com",
                                
                  "/forum/addreply.php",
                                
                  "example.com/forum/addreply.php?",
                                
                  $data2
                  ); 

                  Das dies nun so nicht funktioniert, ist mir mittlerweile auch klar. Wie aber könnte ich das so vereinen, das ich mich zum einen einlogge, zum anderen danach auch noch einen Post über die addreply.php vollziehen kann?!?

                  Kommentar


                  • #10
                    Original geschrieben von Philbil
                    Das Problem ist nur eben das Cookie.. Das Script baut beim 1. mal die verbindung ja wieder ab, beim 2. post2host wieder neu auf, somit bringt mir die alte sid nix mehr..
                    Redest du wirklich von einer ordinären Session-ID?
                    Wieso solltest du die im nächsten Request nicht mehr benutzen können?
                    Dann würde ja im Zustandslosen HTTP überhaupt kein System funktionieren, welches darauf angewiesen ist, die SID bei einem weiteren Scriptaufruf wieder mitzugeben.
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Kann ich sie irgendwie im Header mitgeben?
                      Wenn ich sie über die URL mitgebe, klappt es definitiv nicht.

                      Wenn ich die sid dahernehm, und manuell mit in die url packe, okay, dann klappt es, aber bei der Übergabe per Script geht da nüscht.

                      Kommentar


                      • #12
                        Irgendwie scheinst du mir da mit ziemlich wenig Ahnung (zu) viel zu wollen.
                        Immer wieder konfuse oder unklare Nachfragen, etc.
                        Überlege dir bitte erst mal ein ordentliches Konzept, mache dir vorher klar, was dein Script wann und wie zu tun hat, etc. - dann können wir ggf. weitersehen, wenn es bei der Umsetzung konkrete Probleme gibt. Aber mich an deinem Trial&Error aktiv zu beteiligen, habe ich derzeit keine Lust.
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Mein Trial&Error, oder auch LearningByDoing hat mich letzendlich zum Erfolg gebracht.

                          Kommentar

                          Lädt...
                          X