吵吵   2014-06-02  阅读:2,219

上次金域的工程师来我们医院,发现我们的校园网一段时间不登陆就会断线,于是他告诉我开一个窗口,一直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;
        }
    }
}

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

7条回应:“南方医科大学校园网网页认证客户端”

  1. 企业文化标语[http://www.isofactory.com.cn/]说道:

    付出总会有回报的

  2. 三才泵业说道:

    付出,付出一定有回报,跪在坚持

  3. 莫小诺说道:

    博主很强大!支持一下。网赚客www.67px.com 欢迎回访

  4. 凌云塔上说道:

    linux下,如果照你说的一直ping不行的话,可以不可以用crond来执行* * * * * curl -s http://www.baidu.com/ 想过定时wget一些小文件,然后删除,应该可行吧。

  5. 360论坛说道:

    老实讲,新版的认证已经比老版的强大到哪里去了,你看他那一堆隐藏的字段,就让你没有写代码的欲望了,好在很多时候都是看着吓人罢了,实际上实验起来,很多东西还是都没有用的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注