当前位置: 首页 > 编程语言 > C#

C#WebClient登录accounts.google.com分享

时间:2023-04-11 02:48:05 C#

以下功能。我将表单字段提交到https://accounts.google.com/ServiceLoginAuth?service=oz这是POST字段:service=ozdsh=-8355435623354577691GALX=33xq1Ma_CKItimeStmp=secTok=Email=test@test.xomPasswd=passwordsignIn=SigninPersistentCookie=yesrmShown=1现在,在我提交数据之前加载登录页面时,它具有以下标头:Content-Typetext/html;字符集=UTF-8严格传输安全最大年龄=2592000;includeSubDomainsSet-CookieGAPS=1:QClFh_dKle5DhcdGwmU3m6FiPqPoqw:SqdLB2u4P2oGjt_x;Path=/;Expires=Sat,21-Dec-201307:31:40GMT;Secure;HttpOnlyCache-Controlno-cache,no-storePragma1irenoMon,0-Jan-199000:00:00GMTX-Frame-OptionsDenyX-Auto-Loginrealm=com.google&args=service%3Doz%26continue%3Dhttps%253A%252F%252Faccounts.google.com%252FManageAccount内容-编码gzipTransfer-EncodingchunkedDateThu,22Dec201107:31:40GMTX-Content-Type-OptionsnosniffX-XSS-Protection1;mode=blockServerGSE好的,现在我如何使用WebClient类来包含这些标题?我试过webClient_.Headers.Add();但效果有限,总是返回登录页面。下面是我正在使用的类。任何帮助是极大的赞赏。获取登录页面publicvoidLoginPageRequest(Accountacc){varrparams=newRequestParams();rparams.URL=@"https://accounts.google.com/ServiceLoginAuth?service=oz";rparams.RequestName="登录页面";rparams.Account=acc;webClient_.DownloadDataAsync(新Uri(rparams.URL),rparams);}voidwebClient__DownloadDataCompleted(objectsender,DownloadDataCompletedEventArgse){RequestParamsrparams=(RequestParams)e.UserState;if(rparams.RequestName=="LoginPage"){ParseLoginRequest(e.Result,e.UserState);}}现在使用HtmlAgilityPack获取表单字节并将它们添加到参数集合中publicvoidParseLoginRequest(byte[]data,objectUserState){RequestParamsrparams=(RequestParams)UserState;rparams.ClearParams();ASCIIEncoding编码器=newASCIIEncoding();字符串html=encoder.GetString(数据);HtmlNode.ElementsFlags.Remove("表单");HtmlDocumentdoc=newHtmlDocument();doc.LoadHtml(html);HtmlNodeform=doc.GetElementbyId("gaia_loginform");rparams.URL=form.GetAttributeValue("动作",string.Empty);rparams.RequestName="LoginPost";varinputs=form.Descendants("输入");foreach(输入中的var元素){stringname=element.GetAttributeValue("name","undefined");字符串值=element.GetAttributeValue("值","");如果(!name.Equals("undefined")){如果(name.ToLower().Equals("email")){value=rparams.Account.Email;}elseif(name.ToLower().Equals("passwd")){value=rparams.Account.Password;}rparams.AddParam(名称,值);Console.WriteLine(名称+“-”+值);}}webClient_.UploadValuesAsync(newUri(rparams.URL),"POST",rparams.GetParams,rparams);发布数据后,我得到登录页面而不是重定向或成功消息我做错了什么?经过一些摆弄之后,WebClient类看起来并不是解决这个特定问题的最佳方法。为了实现以下目标,我不得不跳到WebRequest下面一级。在制作WebRequest(HttpWebRequest)和使用HttpWebResponse时,可以设置CookieContainerwebRequest_=(HttpWebRequest)HttpWebRequest.Create(rparams.URL);webRequest_.UserAgent="Mozilla/4.0(兼容;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322;.NETCLR2.0.50727)";CookieContainercookieJar=newCookieContainer();webRequest_.CookieContainer=cookieJar;字符串html=string.Empty;尝试{使用(WebResponseresponse=webRequest_.GetResponse()){使用(varstreamReader=newStreamReader(response.GetResponseStream())){html=streamReader。读到结束();ParseLoginRequest(html、响应、cookieJar);}}}catch(WebExceptione){使用(WebResponseresponse=e.Response){HttpWebResponsehttpResponse=(HttpWebResponse)response;Console.WriteLine("错误代码:{0}",httpResponse.StatusCode);使用(varstreamReader=newStreamReader(response.GetResponseStream()))Console.WriteLine(html=streamReader.ReadToEnd());然后在以下面的方式发帖时使用相同的cookie容器bRequest_=(HttpWebRequest)HttpWebRequest.Create(rparams.URL);webRequest_.UserAgent="Mozilla/4.0(兼容;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322;.NETCLR2.0.50727)";webRequest_.Method="POST";webRequest_.ContentType="application/x-www-form-urlencoded";webRequest_.CookieContainer=cookieJar;var参数=newStringBuilder();foreach(rparams.Params中的var键){参数。AppendFormat("{0}={1}&",HttpUtility.UrlEncode(key.ToString()),HttpUtility.UrlEncode(rparams.Params[key.ToString()]));}parameters.Length-=1;使用(varwriter=newStreamWriter(webRequest_.GetRequestStream())){writer.Write(parameters.ToString());}stringhtml=string.Empty;使用(response=webRequest_.GetResponse()){使用(varstreamReader=newStreamReader(response.GetResponseStream())){html=streamReader.ReadToEnd();所以这行得通,这段代码不适合生产使用,可以/应该优化以以此为例。这是一个写在答案窗格中但未经测试的快速示例。您可能需要将某些表单值的初始请求中的某些值解析为formData。我的很多代码都是基于这种类型的过程,除非我们需要抓取facebookspeako类型的网站,在这种情况下ajax让我们使用不同的方法。以上就是C#学习教程:C#WebClient登录accounts.google.com分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——usingSystem;使用System.Collections.Generic使用System.Collections.Specialized;使用System.Linq;使用系统文本;namespaceGMailTest{classProgram{privatestaticNameValueCollectionformData=newNameValueCollection();私人静态CookieAwareWebClientwebClient=newCookieAwareWebClient();staticvoidMain(string[]args){formData.Clear();formData["服务"]="oz";formData["dsh"]="-8355435623354577691";formData["GALX"]="33xq1Ma_CKI";formData["timeStmp"]="";formData["secTok"]="";formData["Email"]="test@test.xom";formData["密码"]="密码";formData["signIn"]="登录";formData["PersistentCookie"]="是";formData["rmShown"]="1";byte[]responseBytes=webClient.UploadValues("https://accounts.google.com/ServiceLoginAuth?service=oz","POST",formData);字符串responseHTML=Encoding.UTF8.GetString(responseBy测试);}}publicclassCookieAwareWebClient:WebClient{publicCookieAwareWebClient():this(newCookieContainer()){}publicCookieAwareWebClient(CookieContainerc){this.CookieContainer=c;this.Headers.Add("User-Agent:Mozilla/5.0(WindowsNT6.1)AppleWebKit/536.5(KHTML,likeGecko)Chrome/19.0.1084.52Safari/536.5");}公共CookieContainerCookieContainer{得到;.GetWebRequest(地址);if(requestisHttpWebRequest){(requestasHttpWebRequest).CookieContainer=this.CookieContainer;}返回请求;转载请删除,请注明出处: