Laden...

Zugriff auf php-generiertes html-Dokument

Erstellt von marting vor 19 Jahren Letzter Beitrag vor 19 Jahren 5.927 Views
M
marting Themenstarter:in
12 Beiträge seit 2005
vor 19 Jahren
Zugriff auf php-generiertes html-Dokument

Hallo.

Ich habe den gestrigen Tag damit verbracht, den Zugriff auf einen html-code zu erreichen der von einer php-seite generiert wird. aber das klappt natürlich nicht.

zum Problem:
1.
Ich möchte bestimmte Informationen von einer Website loggen, die auf einem Portal liegt, wo man sich mit Name und Passwort anmelden muss. Also müsste ich ja erstmal den Namen und das Passwort an die Seite senden und dann einem Link folgen zur gesuchte Seite. -> weiß ich nicht wie.

2.
Hab es nur hinbekommen, dass ich den html-code von der frameset-seite (index.html) in einem stream zurückbekomme. aber ich will ja nicht die index.html sondern zb. die von /daten/daten.php erzeugte html-seite haben.

Danke schonmal, und wenn das unverständlich ist, dann fragt lieber.

CU

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo marting,

wenn ich dein Problem richtig verstehe, ist das WebControl von .NET 2.0 genau das was du brauchst. Damit hast du quasi ein eigenes Browser-Fenster, dass du aber auch per Programm steuern kannst. Login und Zugiff auf Frame-Sets, solten sich damit einfach realisieren lassen. Allerdings braucht es schon einen Moment, um das Konzept dieses sehr leitungsfähigen Controls zu verstehen. Aber wenn man über diese Hürde ist, hat man die voll Leitungsfähigkeit eines Browsers und braucht sich somit umnix mehr kümmern, was einen Browser so nebenbei alles macht: Agent-ID, Referer, Cookies, https und was es sonst nocht gibt.

HTH

herbivore

M
marting Themenstarter:in
12 Beiträge seit 2005
vor 19 Jahren

du meinst aber nicht System.Web.UI.WebControls.WebControl oder so, oder?

sorry aber ichbrauche da wohl dreingend etwas anleitung. hast du einen guten link zu dem thema? oder beispielcode?

C
1.215 Beiträge seit 2004
vor 19 Jahren

ansonsten - was hindert dich daran, die struktur der empfangenen seite zu analysieren...
ist es tatsächlich nur ein frameset, so ist das doch schnell herausgefunden und die entsprechenden frame-srcs extrahiert.
wenn du die seite kennst, weisst du ja sogar, welches window den src zur gewünschten seite beinhaltet - naja, und dann lädst du eben diese...
😉

grtz
chief

M
marting Themenstarter:in
12 Beiträge seit 2005
vor 19 Jahren

zum Verständnis nun hier ein Code-Schnipsel:


WebRequest myRequest = WebRequest.Create("http://onlinesoccermanager.net/010_mannschaft/spieler.php");
		WebResponse myResponse = myRequest.GetResponse();
		
		Stream streamResponse=myResponse.GetResponseStream();
		StreamReader streamRead = new StreamReader( streamResponse );
		Char[] readBuff = new Char[256];
		int count = streamRead.Read( readBuff, 0, 256 );
		Console.WriteLine("\nThe contents of the Html pages are :");    
		while (count > 0) 
		{
			String outputData = new String(readBuff, 0, count);
			Console.Write(outputData);
			count = streamRead.Read(readBuff, 0, 256);
		}

		// Close the Stream object.
		streamResponse.Close();
		streamRead.Close();

		// Release the HttpWebResponse Resource.
		myResponse.Close();

wenn ich es so mache, werde ich wegen mangelnder anmeldung auf die index.html geleitet, die zeigt nur den frameset... also ist mein hauptanliegen: wie sende ich der seite name und pass und komme so möglichst auf die gesuchte seite spieler.html.

C
1.215 Beiträge seit 2004
vor 19 Jahren

zuerst solltest du deinen request mal auf "HttpWebRequest" casten (äquivalent verfährst du mit der response).
diese zwei methoden enthalten beispielsweise cookie-container etc...
dann musst du natürlich auch schauen, mit welcher methode die anmeldedaten übermittelt werden "GET" oder "POST" (zweiteres ist wahrscheinlich, ersteres aber default-einstellung beim webrequest.)
du musst deine logindaten an die anmeldeseite senden oder aber dich zuvor manuell anmelden und das empfangene cookie für deine anwendung verwenden (also mitsenden) - dann sollte das mit dem authentifizieren klappen.

selber habe ich so etwas noch nicht gemacht, daher diese sehr vage angabe...
😉

grtz
chief

M
marting Themenstarter:in
12 Beiträge seit 2005
vor 19 Jahren

alles klar habs hinbekommen, war zwar fast zufall, aber es geht 🙂)

jetzt kann ich auch gut schlafen.

M
marting Themenstarter:in
12 Beiträge seit 2005
vor 19 Jahren

leider war es nur zufall. ich könnte mir die faust in den mund schieben...
also eben prbier ich es nochmal aus, da geht es wiede rnicht mehr, hab wieder lange rumprobiert aber es geht nicht. hab jetzt mal geguckt, wie man sich da einloggt. die benutzen ein script names fapass (link).
aber da ich kaum ahnung von php hab und schon gar nicht in verbindung mit webrequests kann ich daraus keinen code bauen der mich die seite laden lässt.

damit ihr nicht denkt ich hab gar nichts gemacht in der zwischenzeit kopier ich hier nochmal den code rein, aber ich denke der ist sehr fehlerbehaftet.

string url = string.Format("http://onlinesoccermanager.net/010_mannschaft/spieler.php"); 
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7) Gecko/20040707 Firefox/0.9.2,image/png,*/*;q=0.5";
request.Method = "POST";
request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8";
request.KeepAlive = true;
request.ContentType = @"application/x-www-form-urlencoded";
request.Referer = string.Format("http://www.onlinesoccermanager.net");
request.CookieContainer = cookieContainer;

// Send the log-in data
string postData = string.Format("login=yes&user={0}&pass={1}&login=Login", username, password); 
request.Method="POST";
byte [] postBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(postData);
request.ContentLength = postBuffer.Length;
Stream postDataStream = request.GetRequestStream();
postDataStream.Write(postBuffer,0,postBuffer.Length);
postDataStream.Close();

// Get the response
HttpWebResponse response = (HttpWebResponse) request.GetResponse();

ergebnis ist wie gesagt immer irgendein frameset mit unrelevanten daten.
ob und wie das was mit den cookies zu tun hat müsste mir auch mal jemand erklären... ich weiß dass die sid mit einem cookie zurückkommt.

edit:
ich fass, es nicht jetzt gehts wieder... hat anscheinden was damit zu tun, ob ich mich kurz vorher mit dem ie einlogge oder so...

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo marting,

das mit dem Einloggen durch den IE kann schon seinen Einfluß haben.

Um auf die Cookies & Co zu kommen: HTTP ist ein zustandsloses Protokoll, d.h. wenn der Web-Server von dir eine Anfrage bekommt, bearbeitet er die Anfrage, schließt die Verbindung (von KeepAlive mal abgesehen) und vergisst, dass du jemals da gewesen bist (mal von Einträgen im Log-File abgesehen). Wenn du die nächste Anfrage steht diese wieder nur für sich.

Nun ist das für Web-Anwendungen - z.B. für dieses Forum - blöd. Hier will man sich einloggen und dann in einer "Session" u.U. zusammenhängende Aktionen durchführen, die von der Web-Anwendung als zusammmengehörig und - vor allem - zu einem bestimmten Benutzer gehörig erkannt werden sollen.

Einen Möglichkeit dafür sind Cookies. Meist wird dazu beim Verarbeiten der abgeschickten Login-Seite eine Session-ID erzeugt und - zusammen mit anderen Infomationen - in einem Cookie auf deinem Rechner gespeichert. Die Web-Anwendung ist dann so realisiert, dass bei jeder weiteren Anfrage das Cookie abgefragt, und damit erkannt wird, dass du bereits angemeldet ist.

Die Anfragen stehen für den Web-Server immer noch jede für sich, aber die Web-Anwendung weiß durch das Cookie, dass die zusammengehören.

Es gibt noch weitere Möglichkeiten für das Session-Management, z.B. Session-IDs als Bestandteil der URL zu verwenden. Das ist von der jeweiligen Web-Anwendung abhängig.

Auf jeden Fall denke ich, dass das dein Problem im Zusammenhang mit dem Session-Management steht und z.B. irgendeine Information verloren geht bzw. die (erneute) Anmeldung nicht klappt o.ä.. Ich könnte mir auch vorstellen, dass die postData zwar richtig sind, du sie aber mit der URL der Anmeldeseite schicken müsstest und nicht mit der Seite, die du letztendlich abfragen willst.

HTH

herbivore

M
marting Themenstarter:in
12 Beiträge seit 2005
vor 19 Jahren

also von der theorie ist mir das klar (spätestens nach deinem post).

nun sieht es so aus das in dem php-script das genutzt wird eine session-id in der adresszeile erscheint. aber es muss auch einen cookie geben.

im moment (erste version des anmeldemoduls) ist es jedenfalls so dass der user erst einen link öffnen muss, wenn er sich dort angemeldet hat, kann ich mit meinem programm und seinen user-daten die seite abfordern.
nun ist das aber für den user denkbar umständlich, weil er u.a. seine login-daten 2 mal eingeben muss.

ich hoffe ich finde noch eine lösung, denn so ist mein programm nicht wirklich userfreundlich...

ob ich mal bei den programmieren des anmeldescripts nachfragen soll, ob es nur über cookies läuft oder ob es auch was mit der sid in der url zu tun hat...

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo marting,

ob ich mal bei den programmieren des anmeldescripts nachfragen soll, ob es nur über cookies läuft oder ob es auch was mit der sid in der url zu tun hat...

das würde ich nicht tun. Einige Dienstanbieter mögen Bots, wie du einen schreiben willst, gar nicht.

Stattdessen würde ich versuchen, den Ablauf, der bei der Benutzung eines Browsers üblich ist, so genau wie möglich nachzubilden. Das geht mit dem o.g. WebControl m.E. am besten. Aber auch, wenn du es per HttpWebRequest machen willst, solltest du es hinbekommen.

Zu den Framesets noch was. Wenn du z.B. eine Seite von der URL www.test.de/hugo/index.php zurückbekommst, die so aussieht

frameset cols="250,*">
<frame src="verweise.php" name="Navigation">
<frame src="willicheigentlich.php" name="Daten">
</frameset>

dann kannst du einfach einen zweiten Request für www.test.de/hugo/willicheigentlich.php starten, der dann die gewünschten Daten liefert. Es verlangt ja keiner, dass du alles mit nur einen Request hinbekommst. Vielleicht sind auch fünf oder sechs nötig, wer weiß.

HTH

herbivore

M
marting Themenstarter:in
12 Beiträge seit 2005
vor 19 Jahren

okay werd ich morgen mal testen...

aber ich schreibe morgen PT-Prüfung und deshalb bleibt .net jetzt aus und ich lerne, das hab ich mir fest vorgenommen. 8o