2017-08-05 3 views
1

Also versuche ich mich gerade in meinem Konto auf einer Website mit WebRequest. Ich habe darüber gelesen bis zu dem Punkt, wo ich das Gefühl habe, ich möchte ein Beispiel zum Lernen durch Versuch und Irrtum verwenden.Remote-Server-Fehler beim Einloggen in eine Website mit WebRequest

Dies ist das Beispiel, das ich Login to website, via C#

So bin mit, wenn ich versuche meinen Code auszuführen es eine nicht behandelte Ausnahme zurückkehrt und seine dieses

System.Net.WebException: 'The remote server returned an error: (404) Not Found.'

Ich habe versucht, durch den Code schrittweise und ich denke, Es könnte sein, dass es versucht irgendwo zu POSTIEREN, wo es nicht möglich ist. Ich wollte das beheben, bevor ich auf eine Bestätigung, dass es erfolgreich angemeldet ist, gehen. Ich habe den Benutzernamen und das Passwort für diese Frage in Dummy-Text geändert.

Was habe ich hier falsch gemacht und was ist der logischste Weg, dieses Problem zu beheben? Vielen Dank im Voraus.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

string formUrl = "https://secure.runescape.com/m=weblogin/login.ws"; // 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("login-username={0}&login-password={1}", "myUsername", "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"]; 

Antwort

0

Wenn Sie eine Website scrappen, müssen Sie sicherstellen, dass Sie alles nachahmen, was passiert. Dazu gehören alle clientseitigen Status (Cookies), die früher gesendet werden, bevor ein Formular an den POST gesendet wird. Da die meisten Websites nicht gerne von Bots gecrackt oder gesteuert werden, sind sie oft ziemlich wählerisch in Bezug auf die Nutzlast. Gleiches gilt für die Website, die Sie steuern möchten.

Drei wichtige Dinge, die Sie verpasst haben:

  • Sie nicht mit einer anfänglichen GET gestartet haben, so dass Sie die erforderlichen Cookies in einem CookieContainer haben.
  • auf dem Post verpasst haben Sie einen Header (Referrer) und drei versteckte Felder im Formular.
  • Die Formularfelder heißen Benutzername und Passwort (wie im Namensattribut der Eingabevariablen zu sehen ist). Sie haben die IDs verwendet.

diese Auslassungen Fixing im folgenden Code führen wird:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 
string useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; 

// capture cookies, this is important! 
var cookies = new CookieContainer(); 

// do a GET first, so you have the initial cookies neeeded 
string loginUrl = "https://secure.runescape.com/m=weblogin/loginform.ws?mod=www&ssl=0&dest=community"; 
// HttpWebRequest 
var reqLogin = (HttpWebRequest) WebRequest.Create(loginUrl); 
// minimal needed settings 
reqLogin.UserAgent = useragent; 
reqLogin.CookieContainer = cookies; 

reqLogin.Method = "GET"; 
var loginResp = reqLogin.GetResponse(); 
//loginResp.Dump(); // LinqPad testing 

string formUrl = "https://secure.runescape.com/m=weblogin/login.ws"; // 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 
// in ther html the form has 3 more hidden fields, those are needed as well 
string formParams = string.Format("username={0}&password={1}&mod=www&ssl=0&dest=community", "myUsername", "password"); 
string cookieHeader; 
// notice the cast to HttpWebRequest 
var req = (HttpWebRequest) WebRequest.Create(formUrl); 

// put the earlier cookies back on the request 
req.CookieContainer = cookies; 

// the Referrer is mandatory, without it a timeout is raised 
req.Headers["Referrer"] = "https://secure.runescape.com/m=weblogin/loginform.ws?mod=www&ssl=0&dest=community"; 
req.UserAgent = useragent; 

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"]; 

Dies gibt für mich Erfolg. Es liegt an Ihnen, den resultierenden HTML-Code zu analysieren, um die nächsten Schritte zu planen.

+0

Vielen Dank für das Kommentieren des Codes aswell, es wird es 100x einfacher für mich zu lernen. Was ich jetzt denke ist, dass ich das resp verwenden kann, um zu überprüfen, ob es etwas enthält, das erfolgreich in ro etwas eingeloggt ist. –

+0

Sie sagten, dass dies einen Erfolg für Sie zurückgegeben hat? Ich habe den Code mehrere Male durchgegangen, habe versucht, ein paar Dinge zu ändern, und er gibt immer noch einen "falschen Namen oder ein falsches Passwort" zurück, obwohl seine 100% richtig sind, irgendwelche Gedanken? –

+0

Ich habe keinen gültigen Benutzernamen/Passwort, also habe ich das nicht überprüft. Ich habe deinen anfänglichen Fehler behoben. Der Rest des Scrapings bleibt Ihnen überlassen, aber wenn Sie die Dev-Konsole in Chrome öffnen, können Sie verfolgen, was im Browser passiert, und dann müssen Sie dies mit WebRequests nachahmen. Nicht einfach, aber machbar. – rene

Verwandte Themen