上次金域的工程师来我们医院,发现我们的校园网一段时间不登陆就会断线,于是他告诉我开一个窗口,一直PING百度就好了。他是想如果一直有数据交换,我们的校园网就不会断。后来经实验证实,他的想法还是太美好,ping绝对是不行的,网关应该是虑过了ICMP协议的。
老版的网页认证已经被我集中到了“吵吵登陆器”中,当然,这也是N年前的事情了。但是老是断一下的网络确实也很讨人厌,因此,我还是决定再写一个客户端来做网页登陆验证。
老实讲,新版的认证已经比老版的强大到哪里去了,你看他那一堆隐藏的字段,就让你没有写代码的欲望了,好在很多时候都是看着吓人罢了,实际上实验起来,很多东西还是都没有用的。
聊聊程序的思路吧:
1、网页登陆毫无疑问用httpwebrequest来解决是最佳方案,虽然用webbrowser可能会更加简单,但是事实证明很难做出错处理。
2、一个timer或者多线程,隔一段时间来检查是否断线了,断了就重新连接。
3、判断断线了没有要如何做?那就不停Get百度吧,反正百度这么猛,不怕DDOS。
程序为下图:
什么?这么好的东西,你也想要?查看博客下面的QQ群,入群来要吧。
程序用c#开发,需要安装.net 2.0
下面的一堆代码,你可以拿去学习,然后就自己也可以写一个出来了:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using System.Net; using System.IO; namespace SMU { public class LoginResult { public int state; public string message; } public class SMULoign { public string localIP; public string userName; public string userPass; public SMULoign() { } public SMULoign(string userName, string userPass, string localIP) { this.userName = userName; this.userPass = userPass; this.localIP = localIP; } public bool IsConnect() { string strHtml = GetHtml("http://www.baidu.com/"); if (strHtml.IndexOf("百度一下") > 0) { return true; } return false; } public void Logout(string localIP) { string strPostData = "wlanuserip=" + localIP; strPostData+="&wlanacname=SMU- 2&usertime=73599622&wlanacIp=218.19.148.10&message=&ssid=&submit.x=53&submit.y=18"; string strPostUrl = "http://192.168.168.248/portalDisconnAction.do"; PostLoginData(strPostUrl, strPostData); } public LoginResult Login() { LoginResult lgResult = new LoginResult(); if (IsConnect()) { lgResult.state = 0; return lgResult; } string strLoginPage = GetLoignHtml(); string strResponse = PostLoginData(GetPostUrl(strLoginPage), FormateData(strLoginPage)); return GetLoginResult(strResponse); } public LoginResult Login(string userName,string userPass,string localIP) { this.userName = userName; this.userPass = userPass; this.localIP = localIP; LoginResult lgResult = new LoginResult(); if (IsConnect()) { lgResult.state = 0; return lgResult; } string strLoginPage = GetLoignHtml(); string strResponse = PostLoginData(GetPostUrl(strLoginPage), FormateData(strLoginPage)); return GetLoginResult(strResponse); } public string FormateData(string strHtml) { string strResult = "org.apache.struts.taglib.html.TOKEN="; strResult += GetToken(strHtml); strResult += "&wlanuserip="+localIP; strResult += "&wlanacname=SMU-2&chal_id=&chal_vector=&auth_type=PAP&seq_id=&req_id= &wlanacIp=218.19.148.10&ssid=&mac=&message=&bank_acct=& isCookies=&listpasscode=1&listgetpass=1&getpasstype=0&randstr=4466& domain=&version=&authkey=&isRadiusProxy=0&usertype=&url=&isHaveNotice=0& times=0&weizhi=0"; strResult+="&userid="+userName; strResult+="&passwd="+userPass; strResult+="&submit.x=20&submit.y=9"; return strResult; } public string GetPostUrl(string strHtml) { return "http://192.168.168.248/portalAuthAction.do;jsessionid=" + GetSessionID(strHtml); } public string GetSessionID(string strHtml) { int iStart = strHtml.IndexOf("jsessionid="); return strHtml.Substring(iStart+11, 32); } public string GetToken(string strHtml) { int iStart = strHtml.IndexOf("org.apache.struts.taglib.html.TOKEN"); return strHtml.Substring(iStart + 44, 32); } public string GetLoignHtml() { string strUrl="http://192.168.168.248/portalReceiveAction.do?wlanuserip="+localIP+"&wlanacname=SMU-2"; return GetHtml(strUrl); } public string GetHtml(string strUrl) { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(strUrl); webRequest.Credentials = CredentialCache.DefaultCredentials; WebResponse wrp; wrp = webRequest.GetResponse(); string reader = new StreamReader(wrp.GetResponseStream(), Encoding.GetEncoding("utf-8")).ReadToEnd(); try { webRequest.GetResponse().Close(); } catch (WebException ex) { throw ex; } return reader; } public string PostLoginData(string postUrl, string postData) { HttpWebRequest requestLogin= (HttpWebRequest)WebRequest.Create(postUrl); requestLogin.Method = "POST"; // 内容类型 requestLogin.ContentType = "application/x-www-form-urlencoded"; byte[] bytes = Encoding.GetEncoding("utf-8").GetBytes(postData); requestLogin.ContentLength = bytes.Length; Stream streamLogin = requestLogin.GetRequestStream(); streamLogin.Write(bytes, 0, bytes.Length); streamLogin.Flush(); streamLogin.Close(); WebResponse wrp; wrp = requestLogin.GetResponse(); string reader = new StreamReader(wrp.GetResponseStream(), Encoding.GetEncoding("GB2312")).ReadToEnd(); try { requestLogin.GetResponse().Close(); } catch (WebException ex) { throw ex; } return reader; } public LoginResult GetLoginResult(string strHtml) { LoginResult lgRsult = new LoginResult(); if (strHtml.IndexOf("当前用户") > 0) { lgRsult.state = 1; //MessageBox.Show(strHtml); } else { lgRsult.state = 2; int iStart = strHtml.IndexOf("alert"); int iEnd=strHtml.IndexOf("');"); lgRsult.message = strHtml.Substring(iStart + 7, iEnd - iStart - 7); } return lgRsult; } } }
如无特别说明,本博客文章皆为原创。转载请说明,来自吵吵博客。
原文链接:http://chaochaoblog.com/archives/2937
吵吵微信朋友圈,请付款实名加入:
分享了,网赚客网赚网站
付出总会有回报的
付出,付出一定有回报,跪在坚持
博主很强大!支持一下。网赚客www.67px.com 欢迎回访
linux下,如果照你说的一直ping不行的话,可以不可以用crond来执行* * * * * curl -s http://www.baidu.com/ 想过定时wget一些小文件,然后删除,应该可行吧。
老实讲,新版的认证已经比老版的强大到哪里去了,你看他那一堆隐藏的字段,就让你没有写代码的欲望了,好在很多时候都是看着吓人罢了,实际上实验起来,很多东西还是都没有用的。
http://www.banshouseo.com/