C# - WebClient-login accounts.google.com
Ich haben eine sehr schwierige Zeit, versuchen zu authentifizieren accounts.google.com mit webclient
Ich bin mit C# WebClient-Objekts zu erreichen, sind folgende.
Ich bin Absenden Felder https://accounts.google.com/ServiceLoginAuth?service=oz
Hier ist POST-Felder:
service=oz
dsh=-8355435623354577691
GALX=33xq1Ma_CKI
timeStmp=
secTok=
Email=test@test.xom
Passwd=password
signIn=Sign in
PersistentCookie=yes
rmShown=1
Nun, wenn die login-Seite geladen, bevor ich senden von Daten, die es hat folgenden Header:
Content-Type text/html; charset=UTF-8
Strict-Transport-Security max-age=2592000; includeSubDomains
Set-Cookie GAPS=1:QClFh_dKle5DhcdGwmU3m6FiPqPoqw:SqdLB2u4P2oGjt_x;Path=/;Expires=Sat, 21-Dec-2013 07:31:40 GMT;Secure;HttpOnly
Cache-Control no-cache, no-store
Pragma no-cache
Expires Mon, 01-Jan-1990 00:00:00 GMT
X-Frame-Options Deny
X-Auto-Login realm=com.google&args=service%3Doz%26continue%3Dhttps%253A%252F%252Faccounts.google.com%252FManageAccount
Content-Encoding gzip
Transfer-Encoding chunked
Date Thu, 22 Dec 2011 07:31:40 GMT
X-Content-Type-Options nosniff
X-XSS-Protection 1; mode=block
Server GSE
OK wie kann ich die WebClient-Klasse verwenden, um diese Header?
Habe ich versucht webClient_.Headers.Add();
aber es hat begrenzte Wirkung und gibt immer login-Seite.
Unten ist eine Klasse, die ich benutze. Würde jede Hilfe dankbar.
Erste login-Seite
public void LoginPageRequest(Account acc)
{
var rparams = new RequestParams();
rparams.URL = @"https://accounts.google.com/ServiceLoginAuth?service=oz";
rparams.RequestName = "LoginPage";
rparams.Account = acc;
webClient_.DownloadDataAsync(new Uri(rparams.URL), rparams);
}
void webClient__DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
RequestParams rparams = (RequestParams)e.UserState;
if (rparams.RequestName == "LoginPage")
{
ParseLoginRequest(e.Result, e.UserState);
}
}
Bekommen jetzt Formular Felder mit HtmlAgilityPack, und fügen Sie diese in der Auflistung Parameter
public void ParseLoginRequest(byte[] data, object UserState)
{
RequestParams rparams = (RequestParams)UserState;
rparams.ClearParams();
ASCIIEncoding encoder = new ASCIIEncoding();
string html = encoder.GetString(data);
HtmlNode.ElementsFlags.Remove("form");
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
HtmlNode form = doc.GetElementbyId("gaia_loginform");
rparams.URL = form.GetAttributeValue("action", string.Empty);
rparams.RequestName = "LoginPost";
var inputs = form.Descendants("input");
foreach (var element in inputs)
{
string name = element.GetAttributeValue("name", "undefined");
string value = element.GetAttributeValue("value", "");
if (!name.Equals("undefined")) {
if (name.ToLower().Equals("email"))
{
value = rparams.Account.Email;
}
else if (name.ToLower().Equals("passwd"))
{
value = rparams.Account.Password;
}
rparams.AddParam(name,value);
Console.WriteLine(name + "-" + value);
}
}
webClient_.UploadValuesAsync(new Uri(rparams.URL),"POST", rparams.GetParams,rparams);
Nachdem ich die Daten posten, bekomme ich die login Seite anstatt umleiten oder Erfolgsmeldung.
Was mache ich falsch?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach einigen hantieren, es sieht aus wie die WebClient-Klasse ist nicht die beste Lösung für dieses spezielle problem.
Zur Erreichung folgender Ziel hatte ich zu springen, eine Ebene darunter zu WebRequest.
Machen, wenn WebRequest (HttpWebRequest) und mit HttpWebResponse es ist möglich, die CookieContainer -
und wenn dann so dass nach der Verwendung der gleichen Cookie-Container in der folgenden Weise
Damit dies funktioniert, dieser code ist nicht für die Produktion verwenden und können/sollten optimiert werden.
Behandeln Sie es nur als ein Beispiel.
Dies ist ein Beispiel, geschrieben in den Antwort-Bereich und ungetestet. Sie werden wahrscheinlich brauchen, um zu analysieren, einige Werte aus einer ersten Anfrage in irgendeiner form Werten zu gehen, um in formData. Viel mein code basiert auf dieser Art von Prozess es sei denn, wir müssen kratzen facebook spokeo type-Websites, in diesem Fall die ajax lässt uns einen anderen Ansatz.