private void btnClearProxy_Click(object sender, EventArgs e) { objProxyForm = this; List <ProxyInfo> objProxyList = BaseConfig.GetBaseConfig().ProxyList; objProxyInfoListOK = new List <ProxyInfo>(); CheckingProxy objCheckingProxy = new CheckingProxy(objProxyList, objProxyForm, tbTryUrl.Text, tbCharset.Text, tbSuccessText.Text); ThreadStart checkingThreadDelegate = new ThreadStart(objCheckingProxy.ExecuteChecking); threadCount = 5; finishedThreadCount = 0; checkThreads = new Thread[threadCount]; for (int i = 0; i < threadCount; i++) { checkThreads[i] = new Thread(checkingThreadDelegate); checkThreads[i].Name = i.ToString(); checkThreads[i].Start(); } ThreadStart ojbWriteXmlDelegate = new ThreadStart(objCheckingProxy.WriteCheckedProxy); Thread objWriteThread = new Thread(ojbWriteXmlDelegate); objWriteThread.Start(); //foreach (Thread checkThread in checkThreads) //{ //} //Utility.Utility.ClearXmlProxyList(); //Utility.Utility.WriteProxyListToXml(objProxyList); }
public void ExecuteProject() { m_MainForm.SetText(string.Format("项目『{0}』启动线程成功~\r\n", m_ProjectName)); objPostProjectInfo = PostProjectConfig.GetConfig(m_ProjectName); //初始化项目实例 objBaseConfigInfo = BaseConfig.GetBaseConfig(); //初始化基本配置类,目前代理列表在其中 cookieContainer = new CookieContainer(); //初始化Cookie ProxyInfo objProxyInfo; //声明代理信息对象 WebProxy objWebProxy = null; //声明代理对象 //需要使用的预处理参数列表 List <ParmsInfo> objGetParmsInfoList = new List <ParmsInfo>(); for (int i = 0; i < objPostProjectInfo.BaseInfo.Count; i++) { urlThreadSuccessFlag = 1; //执行Url任务时候,如果为0,就跳出当前Url列表,重新开始新的列表.默认为成功(1,由于会在后面被重置为0,每个列表开始循环是先初始化为1,否则后面无法进行) if (objPostProjectInfo.BaseInfo.ClearCookieEverytime > 0) //如果每个周期循环前都需要清除Cookie { cookieContainer = new CookieContainer(); } if (objPostProjectInfo.BaseInfo.UseCookie <= 0) { cookieContainer = null;//如果cookie为空,在conn类中将自动判断为不使用cookie } objWebProxy = null;//初始化代理对象为空(因为如果代理为空,在conn类中将自动判断为不使用代理.如果要使用代理,则通过下面的语句赋值) if (objPostProjectInfo.BaseInfo.UseProxy > 0) { objProxyInfo = Proxy.GetNextProxy(objBaseConfigInfo.ProxyList); //获取未使用过的代理信息对象 if (objProxyInfo != null) //如果配置为需要使用代理且代理没有循环完,则赋值给代理对象,但是代理却用完了,则终止 { objWebProxy = new WebProxy(objProxyInfo.Address, objProxyInfo.Port); } else { m_MainForm.SetText("无可用代理,自动停止项目执行!\r\n"); Utility.Utility.WriteGoodProxyListToXml(objGoodProxyInfoList);//写入goodproxy Thread.CurrentThread.Abort(); } } //开始处理Url列表并链接 foreach (UrlInfo objUrlInfo in objPostProjectInfo.UrlInfoList) { if (urlThreadSuccessFlag == 0) { m_MainForm.SetText(string.Format("\r\n===========在上个Url连接中失败,重新开始新一轮的列表循环===========\r\n")); //continue; break; } m_MainForm.SetText(string.Format("Url:[{0}]开始\r\n", objUrlInfo.Name)); for (int j = 0; j < objUrlInfo.Count; j++)//目前不管Count是多少还只能使用一个代理连接,想到的解决方案是,拷贝一份objProxyInfoList,然后再当前Url里面循环 { if (objUrlInfo.Method == "POST") { StringBuilder sbParms = new StringBuilder(); foreach (ParmsInfo objPostParmsInfo in objUrlInfo.PostParmsList)//目前Url参数全部post,然后从objGetParmsList中得到预处理参数post { if (objPostParmsInfo.Type == "Rand") { sbParms.Append(string.Format("&{0}={1}", objPostParmsInfo.Name, Utility.Utility.GenerateRandom(8, Jyi.Utility.Utility.RandomType.Lowercased))); } else if (objPostParmsInfo.Type == "RandEmail") { sbParms.Append(string.Format("&{0}={1}@qq.com", objPostParmsInfo.Name, Utility.Utility.GenerateRandom(8))); } else if (objPostParmsInfo.Type == "VCode") { #region 得到验证码 HttpWebRequest objImgRequest = (HttpWebRequest)HttpWebRequest.Create(objUrlInfo.VCodeUrl); objImgRequest.Method = "GET"; objImgRequest.CookieContainer = cookieContainer; if (objWebProxy != null) { objImgRequest.Proxy = objWebProxy; } WebResponse wr2 = objImgRequest.GetResponse(); System.IO.Stream s = wr2.GetResponseStream(); System.Drawing.Image numPic = System.Drawing.Image.FromStream(s);// 得到验证码图片 UnCode objUnCode = new UnCode((System.Drawing.Bitmap)numPic); #endregion sbParms.Append(string.Format("&{0}={1}", objPostParmsInfo.Name, objUnCode.getPicnum(objUrlInfo.UnCodeList))); } else if (objPostParmsInfo.Type == "PreParm") { foreach (ParmsInfo objGetParms in objGetParmsInfoList) { if (objPostParmsInfo.Name == objGetParms.Name) { sbParms.Append(string.Format("&{0}={1}", objPostParmsInfo.Name, objGetParms.Type)); m_MainForm.SetText(string.Format("取得预处理参数:{0}={1}\r\n", objPostParmsInfo.Name, objGetParms.Type)); } } } else { sbParms.Append(string.Format("&{0}={1}", objPostParmsInfo.Name, objPostParmsInfo.Type)); } } //执行RemoveParms,移除本次使用后别人不再使用的预处理参数,避免在后面的Url的Post中遇到重名的参数被错误Post if (objUrlInfo.RemoveParms != "") { int listCount = objGetParmsInfoList.Count; //copy副本 //List<ParmsInfo> objGetParmsInfoListTemp = new List<ParmsInfo>() ; //foreach (ParmsInfo objGetParmInfo in objGetParmsInfoList) //{ // ParmsInfo objCopyGetParmsInfo = new ParmsInfo(); // objCopyGetParmsInfo.Name = objGetParmInfo.Name; // objCopyGetParmsInfo.Type = objGetParmInfo.Type; // objGetParmsInfoListTemp.Add(objCopyGetParmsInfo); //} foreach (string strRemoveParm in objUrlInfo.RemoveParms.Split(',')) { for (int k = 0; k < listCount; k++) { if (objGetParmsInfoList[k].Name == strRemoveParm) { objGetParmsInfoList.Remove(objGetParmsInfoList[k]); m_MainForm.SetText(string.Format("移除预处理参数{0}\r\n", strRemoveParm)); } } //foreach (ParmsInfo objGetParms in objGetParmsInfoListTemp) //{ // if (objGetParms.Name == strRemoveParm) // { // objGetParmsInfoList.Remove(objGetParms); // m_MainForm.SetText(string.Format("移除预处理参数{0}\r\n", objGetParms.Name)); // } //} } } m_MainForm.SetText(string.Format("(POST){0}\r\n", objUrlInfo.Url)); //POST数据 string returnData = Conn.PostData(objUrlInfo.Url, objPostProjectInfo.BaseInfo.Charset, sbParms.ToString(), objUrlInfo.Referer, 0, objWebProxy, cookieContainer); if (returnData.IndexOf("Jyi链接失败") >= 0) { m_MainForm.SetText("链接失败!\r\n"); m_MainForm.SetText(string.Format("===\r\n{0}\r\n===\r\n", returnData)); //Thread.CurrentThread.Abort(); urlThreadSuccessFlag = 0; //continue; break; } else if (returnData.IndexOf(objUrlInfo.SuccessText) >= 0) { m_MainForm.SetText("(POST)成功!\r\n"); urlThreadSuccessFlag = 1; } else { m_MainForm.SetText("(POST)失败!\r\n"); m_MainForm.SetText(string.Format("===\r\n{0}\r\n===\r\n", returnData)); //Thread.CurrentThread.Abort(); urlThreadSuccessFlag = 0; //continue; break; } //得到预处理参数,添加到预处理列表中 if (objUrlInfo.HaveGetParms > 0) { foreach (GetParmsInfo objGetParm in objUrlInfo.GetParmsList) { ParmsInfo objAddGetParm = new ParmsInfo(); objAddGetParm.Name = objGetParm.Name; RegexFunc rFunc = new RegexFunc(); objAddGetParm.Type = System.Web.HttpUtility.UrlEncode(rFunc.GetMatch(returnData, objGetParm.Regex), Encoding.GetEncoding(objPostProjectInfo.BaseInfo.Charset)); objGetParmsInfoList.Add(objAddGetParm); m_MainForm.SetText(string.Format("获取参数{0}的值为{1}\r\n", objAddGetParm.Name, objAddGetParm.Type)); } } m_MainForm.SetText(string.Format("(POST)结束\r\n")); Thread.Sleep(objUrlInfo.WaitTime);//Url间隔时间 } else { //TODO GETDATA TODAY m_MainForm.SetText(string.Format("(GET){0}\r\n", objUrlInfo.Url)); //POST数据 string returnData = Conn.GetData(objUrlInfo.Url, objPostProjectInfo.BaseInfo.Charset, objUrlInfo.Referer, 0, objWebProxy, cookieContainer); if (returnData.IndexOf("Jyi链接失败") >= 0) { m_MainForm.SetText("链接失败!\r\n"); m_MainForm.SetText(string.Format("===\r\n{0}\r\n===\r\n", returnData)); //Thread.CurrentThread.Abort(); urlThreadSuccessFlag = 0; //continue; break; } else if (returnData.IndexOf(objUrlInfo.SuccessText) >= 0) { m_MainForm.SetText("(GET)成功!\r\n"); urlThreadSuccessFlag = 1; } else { m_MainForm.SetText("(GET)失败!\r\n"); m_MainForm.SetText(string.Format("===\r\n{0}\r\n===\r\n", returnData)); //Thread.CurrentThread.Abort(); urlThreadSuccessFlag = 0; //continue; break; } if (objUrlInfo.HaveGetParms > 0) { //得到预处理参数,添加到预处理列表中 foreach (GetParmsInfo objGetParm in objUrlInfo.GetParmsList) { ParmsInfo objAddGetParm = new ParmsInfo(); objAddGetParm.Name = objGetParm.Name; RegexFunc rFunc = new RegexFunc(); objAddGetParm.Type = System.Web.HttpUtility.UrlEncode(rFunc.GetMatch(returnData, objGetParm.Regex), Encoding.GetEncoding(objPostProjectInfo.BaseInfo.Charset)); objGetParmsInfoList.Add(objAddGetParm); m_MainForm.SetText(string.Format("获取参数{0}的值为{1}\r\n", objAddGetParm.Name, objAddGetParm.Type)); } } m_MainForm.SetText(string.Format("(GET)结束\r\n")); Thread.Sleep(objUrlInfo.WaitTime);//Url间隔时间 } } m_MainForm.SetText(string.Format("Url:[{0}]完毕\r\n", objUrlInfo.Name)); } if (urlThreadSuccessFlag == 1 && objWebProxy != null) { ProxyInfo objGoodProxyInfo = new ProxyInfo(); objGoodProxyInfo.Address = objWebProxy.Address.Host; objGoodProxyInfo.Port = objWebProxy.Address.Port; objGoodProxyInfo.Name = "GoodProxy"; objGoodProxyInfoList.Add(objGoodProxyInfo); } m_MainForm.SetText(string.Format("项目『{0}』线程完成一次循环~\r\n", m_ProjectName)); Thread.Sleep(objPostProjectInfo.BaseInfo.WaitTime);//项目间隔时间 } if (objWebProxy != null) { Utility.Utility.WriteGoodProxyListToXml(objGoodProxyInfoList);//写入goodproxy } m_MainForm.SetText(string.Format("项目『{0}』成功完成任务~\r\n", m_ProjectName)); //TODO:处理点X关闭的时候自动结束线程,避免线程访问窗体出错 }