Internetseiten aufrufen und automatisch Textfelder füllen - Eingabe, Audio, Physik, Netzwerk, Scripting und KI - spieleprogrammierer.de

Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

1

28.12.2013, 16:39

Internetseiten aufrufen und automatisch Textfelder füllen

Hi Community,

ich hab da mal folgende Frage:
Ich möchte ein Programm schreiben, das aufs Internet zugreifen kann und dann z.B. etwas googeln oder sich auf Seiten anmelden kann.

Das Programm müsste also Text in Textfelder eingeben können und Bestätigungsbuttons "klicken" können. Wie kann man sowas machen? Wie greife ich auf das Internet zu um so einen Zugriff zu bekommen? Wie kann ich mir das vortellen, denn ich klicke ja nicht mit dem Programm auf einer Seite herum, wie in einem Browser?

Ich programmiere in C++ oder Visual C++. Ich weiß, das Thema passt nicht ganz zu Spieleprogrammierung, aber ich habs mal in die Netzwerkrubrik gepackt.

Ich wünsche einen guten Rutsch!
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

28.12.2013, 16:53

Eine Möglichkeit ist es, Awesomium zu benutzen. Habe ich selbst schon verwendet.
Das simuliert einen Browser, in dem du auch JavaScript ausführen kannst (um die Textfelder auszufüllen, Buttons zu klicken und den Quelltext abzufragen).
Awesomium ist allerdings nicht gerade ein Leichtgewicht.

Wenn du es selbst machen willst, musst du halt die HTTP-Anfragen schicken.
Wie diese Anfragen aussehen, kannst du dir von deinem Browser anzeigen lassen. Quasi jeder Browser bietet entsprechende Entwickler-Tools an (meist öffnet man die mit F12, dann auf "Netzwerk" bzw. "Network" klicken und mit der Seite interagieren). Unter Windows kann man WinINet benutzen, um HTTP-Anfragen zu verschicken.

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

3

28.12.2013, 16:54

Du machst das gleiche wie Browser im Hintergrund machen: HTTP-Requests abschicken: http://de.wikipedia.org/wiki/HTTP

Edit: David war schneller :(

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

4

08.01.2014, 17:01

Sooo, ich hab mir einfach mal das .NET Framework gekrallt, weil ich damit sonst ganz gut zurechtkomme und es zum Test noch nicht "schnell" laufen muss.

Ich habe folgenden Quellcode geschrieben:

C-/C++-Quelltext

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
#include "Main.h"

int main()
{
    Console::WriteLine("HTTP-Konsole für Facebook");

    Console::WriteLine("\nUsername:");
    String^ Username = Console::ReadLine();
    Console::WriteLine("\nPassword:");
    String^ Password = Console::ReadLine();

    String^ PostData = "lsd=AVpdl8H1&display=&enable_profile_selector=&legacy_return=1&profile_selector_ids=&trynum=1&timezone=-60&lgnrnd=050203_khr6&lgnjs=1389186120&email=" + Username + "&pass=" + Password + "&default_persistent=0";
    Console::WriteLine("\nPostData:\n" + PostData);

    ASCIIEncoding^ Encoding = gcnew ASCIIEncoding();
    array<Byte>^ PostBytes = Encoding->GetBytes(PostData);

    HttpWebRequest^ Request = dynamic_cast<HttpWebRequest^>(WebRequest::Create("https://www.facebook.com/login.php?login_attempt=1"));
    Request->Method = "POST";
    Request->UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0";
    Request->CookieContainer = gcnew CookieContainer();
    Request->ContentType = "application/x-www-form-urlencoded";
    Request->ContentLength = PostBytes->Length;

    Stream^ PostStream = Request->GetRequestStream();
    PostStream->Write(PostBytes, 0, PostBytes->Length);
    PostStream->Close();

    HttpWebResponse^ Response = dynamic_cast<HttpWebResponse^>(Request->GetResponse());
    StreamReader^ Reader = gcnew StreamReader(Response->GetResponseStream());
    String^ ResponseString = Reader->ReadToEnd();

    Console::WriteLine(Response->StatusDescription);
    Console::WriteLine("Response.html wird geschrieben...");
    StreamWriter^ Writer = gcnew StreamWriter("Response.html");
    Writer->Write(ResponseString);
    Console::WriteLine("... Fertig mit schreiben!");

    Writer->Close();
    Reader->Close();
    Response->Close();

    Console::ReadLine();

    return 0;
}

Ich will ein Programm schreiben, dass sich bei Facebook anmelden kann und mir die Seite anzeigt. Später soll es auch mit anderen Seiten funktionieren.

Ich hab Davids Vorschlag befolgt und mit Firefox die POST-Anfrage "mitgelesen". Dann hab ich mein Programm so geschrieben, dass es die für mich relevanten Teile auch genauso sendet:
PostData beinhaltet die Zeichenfolge mit den Anmeldedaten - 1 zu 1 von Firefox übernommen.
UserAgent beinhaltet den Code von Firefox, damit Facebook sich nicht beschwert es kenne den Browser nicht. :D

Das Problem: Wenn ich mein Programm mit korrekten Anmeldedaten ausführe, speichert es mir die "Rückgabeseite" ab. Da steht dann: "Cookies einschalten".
Laut MSDN aktiviere ich die mit der Zeile 21. Aber es geht trotzdem nicht.

Was kann ich da machen?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

08.01.2014, 18:20

CLI-Programmierer gehören bestraft ;)

Ernsthafte Antwort: Ich habe es schon erlebt, dass die Seiten, die den Login behandeln, selbst schon Cookie-Werte erwarten, die auf der Startseite gesetzt wurden. Probier also mal erst die Startseite zu laden, die zurückgegebenen Cookies zu speichern und diese dann beim eigentlichen Login mitzusenden.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

08.01.2014, 18:28

lsd, lgnrnd und lgnjs im Post sind bei jedem Login unterschiedlich (Stichwort CSRF). Du wirst nicht drum rum kommen, die Seite zu parsen.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

7

08.01.2014, 18:42

@BlueCobolt: BlaueKobolde werden auch bestraft. :D
@Steef: Srry aber was hat CSRF mit lsd, lgnrnd und lgnjs zu tun? Was meinst du mit parsen?
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

8

08.01.2014, 19:16

Die Werte stehen irgendwo auf der Loginseite und Facebook erwartet die richtigen, nicht die Werte, die mal da standen, als du den Login mitgeschnitten hast. CSRF (Cross-Site-Request-Forgery) nutzt die Tatsache aus, dass du von anderen Webseiten auf andere Seiten mit Get oder Post-Parametern weitergeleitet werden kannst. Wenn da zum Beispiel ein Katzenbild auf einer Seite ist und du klickst drauf, in der Hoffnung eine größere Version zu bekommen, kann es sein, dass es dich auf deine Facebook-Seite weiterleitet und da du dich nicht abgemeldet hast und die entsprechenden Parameter in der URL gesetzt sind, wird ein Statuspost zu der Webseite gepostet. Andere Möglichkeiten wären, wenn du eine Homepage mit einem CMS betreibst, dir manipulierte Links unterzuschieben, die, da du dich nicht abgemeldet hast, deine Seite defacen.

Damit so etwas nicht passieren kann, erwarten die meisten Seiten einen Code, der mit den Daten wieder zurück geschickt werden musst. Wenn dieser Code zufällig generiert wird, kann es so gut wie nie passieren, dass der Code zufällig auf einer anderen Webseite im CSRF-Link eingebaut wurde.

Um das Programm zum Laufen zu bekommen musst du die Seite parsen. Rufe deshalb die Loginseite auf, lass die Seite durch einen HTML-Parser laufen und such innerhalb des <form>-Elements nach einem <input type="hidden" name="lgn[rnd|js]">. Natürlich musst du das an die Syntax deines HTML-Parsers anpassen.
Die andere Möglichkeit wären Reguläre Ausdrücke.

CeDoMain

Alter Hase

  • »CeDoMain« ist der Autor dieses Themas

Beiträge: 587

Wohnort: Ilmenau

Beruf: Student für Mechatronik

  • Private Nachricht senden

9

08.01.2014, 19:46

Also wenn ich "www.facebook.de" aufrufe und abspeichere finde ich die drei Codes mit nem Texteditor. Das Gleiche auch mit der ".../login.php?login_attempt=1" Seite.

Was soll ich dann mit diesen drei Werten machen? Sind das die Sicherheitscodes, gegen CSRF? Was ist mit dem Vorschlag von BlueCobold?

Ich blicke ehrlichgesagt nicht so ganz durch ... kann mir jemand mal einen groben Ablauf nennen, was woherbekomme und was ich wohin senden muss? Am Beispiel FB am besten.
Mit freundlichem Gruß
CeDo
Discord: #6996 | Skype: cedomain

Lass solche persönlichen Angriffe lieber bleiben, meine sind härter.

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

10

08.01.2014, 21:06

1. Loginseite holen.
2. HTML-Code der Loginseite durch einen XML-Parser jagen.
3. input-Tag mit name="<entsprechender name>" finden und die Werte des Attributes "value" herausfinden. Wie das geht ist vom XML-Parser abhängig.
4. Werte in den Login-Request setzen.

Damit das funktioniert müssen Cookies aktiviert sein, da die CSRF-Schutz-Werte serverseitig in der Session abgespeichert werden. Der Cookie heißt normalerweise PHPSESSID, kann aber auch von der Seite geändern werden. Bei Fehlern im HTML, bei denen Browser normalerweise versuchen zu verbessern, spuckt dir ein XML-Parser einen Fehler aus. Es kann zusätzlich noch sein, dass du ein XML-Header vorne anfügen musst, der sähe dann so aus:

Quellcode

1
<?xml version="1.0"?>

Werbeanzeige