目前公司上下班签到是上局域网的一个系统去点一下,由于打卡比较简单,所以有些快迟到的同事会找已经到公司的人帮忙代打卡。”以其它身份运行程序“来打开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倒好处理,但验证码图片怎么处理我也没做过,希望有大神可以指教一下,不胜感激。