1. #1
    Nachrichtendienst

    Registriert seit
    03.09.2015
    Beiträge
    126
    Thanked 53 Times in 38 Posts

    Standard Webseiten steuern?

    Hallo Leute,

    ich möchte gerne Webseiten automatisch steuern. Mein erster Gedanke dazu ist immer über Windows Forms den Webbrowser mittels SendKeys-Klasse zu steuern. Das ist mir aber zu doof, weil dann das Programm immer im Vordergrund laufen muss.

    Damit das Programm im Hintergrund läuft habe ich mich nun an der WebRequest-Klasse probiert. Testweise habe ich hierzu zwei HTML-Seiten erstellt. Die eine stellt Steuerelemente bereit, und die zweite Seite zeigt einfach nur "Hallo Welt".
    HTML-Code:
    <html>
    	<body>
    		<form action="login.html" method="post">
    			<input type="text" name="myInput">
    			<input type="submit">
    		</form>
    	</body>
    </html>
    Nun erzeuge ich mittels C# eine POST-Anfrage und lasse mir die Antwort ausgeben:
                //POST-Anfrage erzeugen
    WebRequest request = WebRequest.Create("http://127.0.0.1/GetPost/index.html");
    request.Method = "POST";
    string postData = "myInput=test";
    byte[] byteArray = Encoding.UTF8.GetBytes(postData); //Konvertierung zum ByteArray
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = byteArray.Length;
    Stream dataStream = request.GetRequestStream();
    dataStream.Write(byteArray, 0, byteArray.Length);
    dataStream.Close();

    // Antwort holen
    WebResponse response = request.GetResponse();
    MessageBox.Show(((HttpWebResponse)response).StatusDescription);
    dataStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(dataStream);
    string responseFromServer = reader.ReadToEnd();
    richTextBox1.Text = responseFromServer;
    reader.Close();
    dataStream.Close();
    response.Close();


    Die Antwort zeigt allerdings nur die Startseite (index.php) und nicht die gewünschte Zielseite (login.html). Mein Wunsch ist es ja, nach dem POST-Request weitere Anfragen von Seite 2 (Zielseite) zu tätigen.

    Kann mir an dieser Stelle jemand auf die Sprünge helfen?
    Geändert von Negok (06.05.2016 um 21:36 Uhr)
    Mfg

    .\

  2. #2
    Projektleitung
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    4.238
    Thanked 8.595 Times in 2.597 Posts
    Blog Entries
    5

    Standard AW: Webseiten steuern?

    Du scheinst den falschen Pfad zu verwenden, was vermutlich an einem Verständnisproblem des HTTP-Protokolls liegt: Dein oben gezeigter HTML-Code (vermutlich unter http://127.0.0.1/GetPost/index.html abrufbar) ist das Ergebnis einer HTTP GET-Abfrage. Diese übermittelt keine Daten, sondern liefert lediglich eine Ressource aus - hier eine HTML-Seite, könnte aber grundsätzlich natürlich auch ein Download oder etwas anderes sein. Die Daten eines Formulares wie es im HTML-Quelltext definiert wird, werden immer an die im Attribut action angegebene URL gesendet, login.html in diesem Fall. Und zwar per HTTP-POST, wie du im method-Attribute definiert hast. Klickst du auf den Absenden-Button (submit) der Form, wird diese HTTP-Post Anfrage mit den Daten der Formularfelder abgesendet. Dein WebRequest muss daher an besagte login.html gehen, wenn ich deine Struktur richtig verstehe.

    Die Anfragen selbst zu senden wie du es in deinem Codeausschnitt machst ist die performanteste und was das HTTP-Protokoll angeht auch lehrreichste Wahl. Je nachdem was du vor hast aber nicht unbedingt die Beste. Sollte das Fernsteuern eines Browsers die bessere Wahl sein, schau dir mal Selenium an. Das ist ein sehr mächtiges Test-Framework für Webseiten- und Anwendungen. Es bietet die Möglichkeit, gängige Browser fernzusteuern. Dessen Umfang reichen dabei WEIT über das WebBrowser-Control heraus. Es geht wie gesagt darum, Funktionalitäten von Webseiten- und Anwendungen automatisiert testen zu können (z.B. einen Login). Um Browser headless (also ohne sichtbare GUI) steuern zu können, muss man sich ein wenig einlesen und etwas herumprobieren. Zumal das auch nicht mit allen Browsern funktioniert. Aber grundsätzlich geht das, habe ich selbst schon mit gearbeitet. Spart Ressourcen und ist natürlich auch für Server ohne grafische Oberfläche eine feine Sache.

    Das WebBrowser-Control von .NET würde ich grundsätzlich meiden, wenn es geht. Alleine schon weil es auf dem Internet Explorer basiert. Der ist schon seit längerem nicht mehr Maß der Dinge. Je nach Alter und Qualität der betroffenen Seite kann es da mehr oder weniger großen Problemen mit geben. Modernere Technologien wie z.B. Websockets unterstützt selbst der aktuellste IE11 nicht vernünftig. Sogar wenn man serverseitig von Microsoft entwickelte Frameworks nutzt - schon ein wenig peinlich, aber naja. Ich sehe heute keinen sinnvollen Grund mehr, als Privatperson den IE zu nutzen - im Gegenteil. In Unternehmen ist das natürlich wieder was anderes. Da ist der hauptsächlich wegen der umfangreichen GPOs bis heute verbreitet und kann auch wegen alten Webanwendungen, die noch für IE-X optimiert sind, durchaus Sinn machen.


  3. The Following User Says Thank You to DMW007 For This Useful Post:

    Negok (07.05.2016)

  4. #3
    Nachrichtendienst

    Registriert seit
    03.09.2015
    Beiträge
    126
    Thanked 53 Times in 38 Posts

    Standard AW: Webseiten steuern?

    Danke für deine ausführliche Antwort, DMW007. Ich muss für den POST-Request also die Zielseite ansteuern, macht auch irgendwie Sinn.

    Ich habe die login.php nun weiter ausgearbeitet, um zu gucken, ob die Ausgabe wie gewünscht funktioniert:
    PHP-Code:
    <html>
        <body>
            <?php
                
    if(isset($_POST["myinput"])){
                    if(
    $_POST["myinput"] == "positive"){
                        echo 
    "<p>Login erfolgreich</p>";
                    }else{
                        echo 
    "<p>Falsche Zugangsdaten</p>";
                    }
                }else{
                    echo 
    "<p>Die myinput-Variable existiert nicht.</p>";
                }
            
    ?>
        </body>
    </html>
    Ausgabe: Login erfolgreich.

    Nun habe ich versucht, dieses Login-Verfahren mal testweise für dieses Forum auszuführen. Als Url habe ich "https://u-labs.de/forum/login.php?do=login" verwendet, und als POST-String "vb_login_username=chpo7234&vb_login_password=kusc helhase" angegeben. Als Antwort erhalte ich die Forenübersicht, allerdings als ausgeloggter Benutzer. Woran kann das liegen? Müsste ich hier erst Cookies zwischenspeichern? Oder liegt es daran, dass das Passwort überschlüsselt übergeben wird, und ich hierzu erst das Verschlüsselungsverfahren kennen müsste?
    Geändert von Negok (07.05.2016 um 11:13 Uhr)
    Mfg

    .\

  5. #4
    Projektleitung
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    4.238
    Thanked 8.595 Times in 2.597 Posts
    Blog Entries
    5

    Standard AW: Webseiten steuern?

    Ja du brauchst Cookies. Kurz gesagt wird bei einem Login serverseitig ein Sitzungshash generiert. Diesen speichert der Server in einer Datenbank und sendet diesen als Cookie an den Client. Bei jedem weiteren Seitenaufruf sendet der Client diesen Hash mit. Serverseitig wird geprüft, ob dieser zu einer gültigen Sitzung gehört und der Login wird anerkannt. In .NET brauchst du dazu einen CookieContainer. Ein Beispiel dazu ist in der MSDN zu finden: How to Get and Set Cookies.


  6. The Following User Says Thank You to DMW007 For This Useful Post:

    Negok (08.05.2016)

  7. #5
    Nachrichtendienst

    Registriert seit
    03.09.2015
    Beiträge
    126
    Thanked 53 Times in 38 Posts

    Standard AW: Webseiten steuern?

    Huhu,

    ich bin es noch mal. Für U-Labs habe ich es bis hierhin hinbekommen, dass der Login funktioniert. Es gab einige Hidden-Steuerelemente für die Login-Form, daran bin ich erst gescheitert.

            private string getLoginCookie()
    {
    string formUrl = "https://u-labs.de/forum/login.php?do=login"; //ZIELURL!
    string formParams = "vb_login_username=chpo7234&vb_login_password=&s=&cookieuser=1&securitytoken=guest&do=login&vb_login_md5password=kuschelhaseInMd5&vb_login_md5password_utf=kuschelhaseInMd5&hiddenlogin=do";
    string cookieHeader;
    WebRequest req = WebRequest.Create(formUrl);
    req.ContentType = "application/x-www-form-urlencoded";
    req.Method = "POST";
    byte[] bytes = Encoding.ASCII.GetBytes(formParams);
    req.ContentLength = bytes.Length;

    using (Stream os = req.GetRequestStream())
    {
    os.Write(bytes, 0, bytes.Length);
    }

    WebResponse resp = req.GetResponse();
    cookieHeader = resp.Headers["Set-cookie"];
    string pageSource = "";

    using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
    {
    pageSource = sr.ReadToEnd();
    }

    webBrowser1.DocumentText = pageSource;
    return cookieHeader;
    }


    Danach erhalte ich dann den Session-String. Im folgenden leicht abgeändert:
    "bb_; path=/; HttpOnly,bb_lastvisit=1462730507; expires=Mon, 08-May-2017 18:01:47 GMT; Max-Age=31536000; path=/; secure,bb_lastactivity=0; expires=Mon, 08-May-2017 18:01:47 GMT; Max-Age=31536000; path=/; secure,bb_userid=17025; expires=Mon, 08-May-2017 18:01:47 GMT; path=/; secure; HttpOnly,bb_password=xx; expires=Mon, 08-May-2017 18:01:47 GMT; path=/; secure; HttpOnly,IDstack=%2C17025%2C; expires=Mon, 05-Sep-2016 18:01:47 GMT; Max-Age=10368000; path=/,vbseo_loggedin=yes; expires=Sun, 08-May-2016 19:01:47 GMT; Max-Age=3600; path=/"
    Nun versuche ich mit diesem Cookie die Account-Börse aufzurufen. Er zeigt mir jedoch an, dass ich nicht eingeloggt bin:
            private void getRequest(string cookieHeader)
    {
    string pageSource;
    string getUrl = "https://u-labs.de/accountBoerse/";
    WebRequest getRequest = WebRequest.Create(getUrl);
    getRequest.Headers.Add("Cookie", cookieHeader);
    WebResponse getResponse = getRequest.GetResponse();

    using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
    {
    pageSource = sr.ReadToEnd();
    }
    webBrowser1.DocumentText = pageSource;
    }


    Meine Vermutung liegt nun darin, dass nach dem Login, durch die Weiterleitung weitere Cookies gesetzt werden:


    Oder wie wäre das sonst zu erklären?

    Außerdem hänge ich noch an einem anderen Problem. Ob in der Firefox-Entwicklerkonsole oder im Firebug: der POST-Request wird in der Netzwerk-Analyse beim Login nur für sehr kurze Zeit angezeigt. Danach wird dieser Eintrag wieder verworfen, und ich kann nicht nachvollziehen, welche Variablen übertragen wurden. Firebug hat extra einen Button "Dauerhaft", für die dauerhafte Anzeige der Daten. Das hat bei mir allerdings nicht geholfen, die POST-Daten werden wieder entfernt. Weiß auch da vielleicht jemand einen Rat?
    Mfg

    .\

  8. #6
    Projektleitung
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    4.238
    Thanked 8.595 Times in 2.597 Posts
    Blog Entries
    5

    Standard AW: Webseiten steuern?

    Ich sehe auf die Schnelle keinen Fehler. Dein Umgang mit den Cookies ist aber unsauber, dafür gibt es wie in meinem letzten Post verlinkt extra einen CookieContainer. Der kümmert sich um den GESAMTEN Cookie-Kram (setzen, aktualisieren, löschen). Es macht daher Sinn, ihn wann immer möglich zu nutzen. Dazu musst du wie in dem Artikel beschrieben lediglich eine Instanz erstellen und diese der Cookie-Eigenschaft jedes HttpRequests zuweisen, der die Cookies nutzen soll. Und ich würde zum testen nicht die AB nehmen. Dort ist aktuell noch eine ältere Version unseres SSO drin, welche die vBulletin-Session in manchen Fällen nicht richtig erkennt. Probiere es lieber mit der Startseite des Forums, da siehst du ja dann rechts oben statt der Login-Box deinen Benutzernamen.


  9. The Following User Says Thank You to DMW007 For This Useful Post:

    Negok (09.05.2016)

  10. #7
    Nachrichtendienst

    Registriert seit
    03.09.2015
    Beiträge
    126
    Thanked 53 Times in 38 Posts

    Standard AW: Webseiten steuern?

    Einige Seiten erstellen beim Login einen berechneten Security-Token, da werde ich wohl nicht dran vorbei kommen. Schade ist auch, dass man den CookieContainer nicht wirklich mit einer foreach-Schleife iterieren kann. Die Ausgabe der gespeicherten Cookies ist da eher nur auf Umwegen möglich.

    Hier noch mal der bisherige Code, falls ihn noch wer braucht:

            private CookieContainer postRequest(Uri url, string formParams)
    {
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    CookieContainer container = new CookieContainer();
    request.CookieContainer = container;
    request.Proxy.Credentials = CredentialCache.DefaultCredentials; //Fuer Firmen-Proxy
    request.ContentType = "application/x-www-form-urlencoded";
    request.Method = "POST";

    byte[] bytes = Encoding.ASCII.GetBytes(formParams);
    request.ContentLength = bytes.Length;

    using (Stream os = request.GetRequestStream())
    {
    os.Write(bytes, 0, bytes.Length);
    }

    WebResponse response = request.GetResponse();
    string pageSource = "";

    //Webinhalt speichern
    using (StreamReader sr = new StreamReader(response.GetResponseStream()))
    {
    pageSource = sr.ReadToEnd();
    }

    //Webinhalt anzeigen
    webBrowser1.Navigate("about:blank");
    HtmlDocument doc = webBrowser1.Document;
    doc.Write(String.Empty);
    webBrowser1.DocumentText = pageSource;
    richTextBox1.Text = pageSource;

    return container;
    }

    private void getRequest(CookieContainer container, string url)
    {
    string pageSource;

    HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(url);
    getRequest.CookieContainer = container;
    WebResponse getResponse = getRequest.GetResponse();

    using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
    {
    pageSource = sr.ReadToEnd();
    }

    //Ergebnis anzeigen
    richTextBox1.Text = pageSource;
    HtmlDocument doc = webBrowser1.Document;
    doc.Write(String.Empty);
    webBrowser1.DocumentText = pageSource;
    }


    private void button1_Click(object sender, EventArgs e)
    {
    var container = postRequest(new Uri("https://loggeMichEin.de"),
    "userVar=Superuser&passwordVar=kuschelbaer");
    getRequest(container, "https://loggeMichEin.de/geschuetzteSeite");
    }


    Vielen Dank für deine hilfreiche Unterstützung, DMW007!
    Mfg

    .\

Ähnliche Themen

  1. Webseiten freeze?
    Von MHRCube im Forum Internet und Technik
    Antworten: 0
    Letzter Beitrag: 25.03.2015, 23:20
  2. Mobile Webseiten - Der Einstieg
    Von Entrafiz im Forum HTML
    Antworten: 5
    Letzter Beitrag: 21.10.2014, 17:17
  3. [S] Webseiten-Parser
    Von Pwned im Forum Hochsprachen
    Antworten: 3
    Letzter Beitrag: 24.07.2014, 00:09
  4. [S] Webseiten zum Bücherkauf
    Von Reactin im Forum OffTopic
    Antworten: 2
    Letzter Beitrag: 06.06.2012, 20:58
  5. [GFX] Webseiten - Banner
    Von St0nY im Forum Showroom
    Antworten: 7
    Letzter Beitrag: 25.04.2012, 07:12
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191