asp.net自动打卡、签到程序

时间:2022-01-15 07:11:38

    目前公司上下班签到是上局域网的一个系统去点一下,由于打卡比较简单,所以有些快迟到的同事会找已经到公司的人帮忙代打卡。”以其它身份运行程序“来打开IE,去帮人打下,有时多几个人,也要这样操作,我感觉挺麻烦,所以就想找个简单的方法来完成这个事。

    先想打卡用户操作流程,登录打卡页面->点击”上班打卡“("下班打卡")->完成。流程很简单,我们要不打开IE直接用httpclient等类来操作的话,关注的东西应该有身份认证和表单提交(按钮触发事件)。局域网,公司有自己的工作域,那身份验证就是WINDOWS了,提交的数据应该按钮名字加上原始视图和验证视图,为什么是这些数据,这个我想应该是ASP.NET的基本的,如有疑问可以看下http://www.cnblogs.com/fish-li/archive/2012/06/10/2544087.html#_label0asp.net page那点事和http://www.cnblogs.com/fish-li/archive/2011/07/17/2108884.html细说form表单。

下面是核心代码

private string SignIN(string name, string pwd, string btnname)
        {
            string result = "";
            try
            {

                System.Net.HttpWebRequest req = (HttpWebRequest)System.Net.HttpWebRequest.Create("http://cws/cws_home/Welcome.aspx");
                req.ContentType = "application/x-www-form-urlencoded";
                req.SendChunked = true;
                CredentialCache credentialCache = new CredentialCache();
                NetworkCredential credentials = new NetworkCredential(name, pwd);
                credentialCache.Add(new Uri(Url), "Negotiate", credentials);
                req.Credentials = credentialCache;
                req.Method = "POST";
                Encoding myEncoding = Encoding.UTF8;
                HttpUtility.UrlEncode("", myEncoding);
                string param = HttpUtility.UrlEncode("__EVENTTARGET", myEncoding) + "=" +
                    HttpUtility.UrlEncode(whatfuck) + "&" +
                    HttpUtility.UrlEncode("__EVENTARGUMENT", myEncoding) + "=" + "&" +
                    HttpUtility.UrlEncode("__VIEWSTATE", myEncoding) + "=" +
                    HttpUtility.UrlEncode("/wEPDwUKLTcwODg1MTE2NmRkSwoNIxF8KOccrbrL57PfhViXnpY=", myEncoding) + "&" +
                    HttpUtility.UrlEncode("__EVENTVALIDATION", myEncoding) + "="
                    + HttpUtility.UrlEncode("/wEWAwLq6svwAQKRkrn2CAKMkrn2CF+ktkMYwyMeA64pdF2jiSwcCSRH", myEncoding);
                byte[] postBytes = Encoding.ASCII.GetBytes(param);
                req.ContentLength = postBytes.Length;
                using (Stream reqStream = req.GetRequestStream())
                {
                    reqStream.Write(postBytes, 0, postBytes.Length);
                }
                using (WebResponse wr = req.GetResponse())
                {
                    Stream sm = wr.GetResponseStream();

                    StreamReader reader = new StreamReader(sm, Encoding.GetEncoding("utf-8"));//输出返回值数据
                    string temp = reader.ReadToEnd();
                    int tempindex = temp.IndexOf("<script>alert");
                    if (tempindex > 0)
                    {
                        result = temp.Substring(tempindex + 14, 20);
                    }

                }
            }
            catch (Exception ex)
            {
                return "";
            }
            return result;
        }

其它就是模拟认证,传回__EVENTTARGET,__EVENTARGUMENT,__VIEWSTATE,__EVENTVALIDATION四个参数据,最后一个有可能没有,什么时候有什么时候没有,就不多说了。这里我用了httprequest和httpresponse,其实直接用WebClient也是一样,最主要是明白整个流程的怎么走的,自己怎么去处理,至于怎么做成自动打卡,直接加个Timer就完了,如想很好管理打卡任务可以考虑quartz.net这个任务计划开源组件。有些可能想做网站的签到,那可能还有些其它东西,如cookie的保存,和图片验证码的处理等。cookie倒好处理,但验证码图片怎么处理我也没做过,希望有大神可以指教一下,不胜感激。