Login für die Website, über C #
-
06-09-2019 - |
Frage
Ich bin relativ neu C # zu verwenden, und haben eine Anwendung, die Teile des Quellcodes auf einer Website liest. Das alles funktioniert; aber das Problem ist, dass die betreffende Seite muss der Benutzer diesen Quellcode eingeloggt sein zuzugreifen. Was mein Programm einen Weg muss zunächst die Benutzer in die Website- anmelden, nachdem das erledigt ist, ich werde in der Lage sein, um den Quellcode zugreifen und lesen.
Die Website, die in angemeldet sein muss, ist: mmoinn.com/index.do?PageModule=UsersLogin
Ich habe den ganzen Tag über durchsucht, wie dies zu tun und versucht, Beispiele, aber haben kein Glück gehabt.
Vielen Dank im Voraus
Keine korrekte Lösung
Andere Tipps
Sie können mit WebClient POST (anstelle von GET, fortzusetzen, die die HTTP-Verb ist derzeit mit DownloadString), aber ich denke, es einfacher finden mit den (leicht) untergeordneten Klassen arbeiten webRequest und WebResponse.
Es gibt zwei Teile dazu - das erste ist, das Login-Formular zu schreiben, wird die zweite Rückgewinnung des „Set-Cookie“ Header und senden diese zurück an den Server als „Cookie“ zusammen mit Ihrer GET-Anfrage. Der Server wird dieses Cookies, um Sie identifizieren von nun an (vorausgesetzt, es Cookie-basierte Authentifizierung ist mit dem ich ziemlich sicher bin ist es, wie die Seite eine Set-Cookie-Header zurückgibt, die „PHPSESSID“ enthält).
Buchung auf das Login-Formular
Formular Beiträge einfach zu simulieren sind, es ist nur ein Fall von Formatierung der Post-Daten wie folgt:
field1=value1&field2=value2
Mit WebRequest und Code, den ich von Scott Hanselman angepasst, hier, wie Sie POST würde Formulardaten an Ihrem Login-Formular:
string formUrl = "http://www.mmoinn.com/index.do?PageModule=UsersAction&Action=UsersLogin"; // NOTE: This is the URL the form POSTs to, not the URL of the form (you can find this in the "action" attribute of the HTML's form tag
string formParams = string.Format("email_address={0}&password={1}", "your email", "your password");
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"];
Hier ist ein Beispiel dafür, was man in den Set-Cookie-Header für Ihr Login-Formular sehen soll:
PHPSESSID=c4812cffcf2c45e0357a5a93c137642e; path=/; domain=.mmoinn.com,wowmine_referer=directenter; path=/; domain=.mmoinn.com,lang=en; path=/;domain=.mmoinn.com,adt_usertype=other,adt_host=-
gibt es die Seite hinter dem Anmeldeformular
Jetzt können Sie Ihre GET-Anforderung an einer Seite durchführen, die Sie angemeldet werden müssen.
string pageSource;
string getUrl = "the url of the page behind the login";
WebRequest getRequest = WebRequest.Create(getUrl);
getRequest.Headers.Add("Cookie", cookieHeader);
WebResponse getResponse = getRequest.GetResponse();
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
pageSource = sr.ReadToEnd();
}
EDIT:
Wenn Sie die Ergebnisse der ersten POST anzeigen müssen, können Sie den HTML-Code wiederherstellen es zurück mit:
using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
{
pageSource = sr.ReadToEnd();
}
Dieses direkt unter cookieHeader = resp.Headers["Set-cookie"];
und dann die Zeichenfolge im Quelltext gehalten überprüfen.
Sie können die Dinge vereinfachen ziemlich viel durch Erstellen einer Klasse, die von WebClient ableitet, überschreibt seine GetWebRequest Verfahren und ein Cookie Objekt darauf einstellen. Wenn Sie immer die gleiche Cookie Instanz festgelegt, dann wird die Cookie-Verwaltung für Sie automatisch behandelt werden.
Aber der einzige Weg, auf dem HttpWebRequest zu erhalten, bevor es gesendet wird, ist von WebClient zu erben und diese Methode außer Kraft setzen.
public class CookieAwareWebClient : WebClient
{
private CookieContainer cookie = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
{
(request as HttpWebRequest).CookieContainer = cookie;
}
return request;
}
}
var client = new CookieAwareWebClient();
client.BaseAddress = @"https://www.site.com/any/base/url/";
var loginData = new NameValueCollection();
loginData.Add("login", "YourLogin");
loginData.Add("password", "YourPassword");
client.UploadValues("login.php", "POST", loginData);
//Now you are logged in and can request pages
string htmlSource = client.DownloadString("index.php");
Matthew Brindley arbeitete Ihr Code sehr gut für einige Website, die ich brauchte (mit Anmeldung), aber ich brauchte ein 404 Bad Request von dem Remote-Server zu ändern, sonst HttpWebRequest
und HttpWebResponse
ich. Auch möchte ich meine Abhilfe mit Ihrem Code teilen, und ist, dass ich es versucht, ein um sich einzuloggen Website basiert auf moodle , aber es hat bei Ihrem Schritt nicht „ gibt es die Seite hinter dem Anmeldeformular “, weil, wenn erfolgreich POSTen die Anmeldung hat der Kopf 'Set-Cookie'
nichts trotz anderer Websites zurückgibt.
Also ich denke, das, wo wir Cookies speichern, für die nächsten Anfragen benötigen, so fügte ich diese.
Zur " Buchung auf das Login-Formular " Codeblock:
var cookies = new CookieContainer();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(formUrl);
req.CookieContainer = cookies;
Und auf dem " gibt es die Seite hinter dem Anmeldeformular ":
HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl);
getRequest.CookieContainer = new CookieContainer();
getRequest.CookieContainer.Add(resp.Cookies);
getRequest.Headers.Add("Cookie", cookieHeader);
Dadurch, lässt mich Melden Sie sich mich in und den Quellcode der „Seite hinter Login“ erhalten (Website basiert moodle) Ich weiß, dass dies eine vage Verwendung des CookieContainer
ist und HTTPCookies, weil wir zuerst fragen kann, ist ein zuvor vor dem Senden der Anfrage an den Server gespeichert von Cookies. Dies funktioniert ohne Problem sowieso, aber hier ist eine gute Informationen über WebRequest
und WebResponse
mit Beispielprojekten und Anleitung zu lesen:
HTTP-Content-Abrufen in .NET
So verwenden HttpWebRequest und HttpWebResponse in .NET
Manchmal kann es helfen, AllowAutoRedirect
Ausschalten und zum Festlegen der Login POST
und Seite GET
fordert den gleichen User-Agent.
request.UserAgent = userAgent;
request.AllowAutoRedirect = false;