关于 【通过代理访问】 的研究,【突破 IP ,“无限制”投票】
相信大家身边有很多朋友有时候请大家投各种票,刚好,这会儿也有朋友找我投票,身为IT程序开发人员,总觉得投机取巧一点。如果仅仅只是点击即可投票,那相对而言就简单了,然而,有些网站限制IP,那么情况就不一样了。
如果您是拨号上网用户,可以重连路由,改变外网IP地址,不过,这种方式有时候也不奏效。
于是我采用了IP代理的方式来自动投票。
这样,一般人会这样:更改IE浏览器的代理设置,打开IE浏览器输入投票网址(这里需要各位自己找直接投票的url)投票。
但是问题又出来了,每次投票都得重启浏览器才行,我个人觉得浏览器打开的一些设置已经保存在了缓存中
虽然在更改代理的时候更改了注册表项值,但浏览器并没有实时去读取这个值
因此,鄙人编写了一个小程序用于自动投票。下面是该程序的关键代码:
投票实例,服务器有点慢,可能需要等十几秒钟,弹框提示即可
http://www.
如果兄弟投了,鄙人十分感谢,好啦,咱们还是交流学习吧:
程序代码:
private void StartVote() { this.lbl_daili.Text = lst.Items.Count.ToString(); //获取代理 this.wbCnblog.Focus(); //浏览器窗口获取焦点。由于有些投票连接直接弹出alert提示,因此获取焦点,以自动回车防止程序暂停 int itemcount = lst.Items.Count;//获取代理列表,已循环代理访问 string[] urls = new string[itemcount]; //用于保存所有将要访问的投票链接地址 string[] proxyurl_ip = new string[itemcount];// 代理 IP string[] proxyurl_port = new string[itemcount];// 代理 Port Random rad = new Random(); int y = rad.Next(0, 72); // 由于有些网站投票需要限制用户名,因此随即生成用户名(数组) for (int i = 0; i < itemcount; i++) { int x = y + i; if (x >= 72) { x = x % 72; } urls[i] = "http://www." + mingzi[x]; lst.Items[i].Selected = true; //选择当前item,提取IP 以及 端口号,保存在数组中 proxyurl_ip[i] = lst.SelectedItems[0].SubItems[0].Text; proxyurl_port[i] = lst.SelectedItems[0].SubItems[1].Text; } GetHtml(urls, proxyurl_ip, proxyurl_port); //访问站点获取站点内容 Application.Exit();//程序结束 }
程序代码:
访问站点获取HTML: #region 自定义方法 bool loading = true; //该变量表示网页是否正在加载. string html = string.Empty; WebBrowser browser = new WebBrowser(); int successcount = 0; int failurecount = 0; int bugcount = 0; string temp_proxy = ""; string current_proxy = ""; //当前代理,用于些日志用到,相当于排他锁的作用 public void GetHtml(string[] urls, string[] proxyurls_ip, string[] proxyurls_port) { wbCnblog.DocumentText = "页面加载中..."; wbCnblog.Navigated += new WebBrowserNavigatedEventHandler(browser_Navigated);//页面加载时执行 browser_Navigated ,获取返回内容,并写成功日志 for (int i = 0; i < urls.Length; i++) { loading = true; //表示正在加载 NaviByProxy( //代理访问URL proxyurls_ip[i], //选中的代理IP地址 proxyurls_port[i], //选中的代理IP的端口 urls[i]//url地址 ); while (loading) //记录状态 { this.txt_info.Text = "正通过代理" + proxyurls_ip[i] + ":" + proxyurls_port[i] + "进行投票"; this.textBox_url.Text = urls[i]; current_proxy = proxyurls_ip[i] + ":" + proxyurls_port[i]; try { Application.DoEvents();//等待本次加载完毕才执行下次循环. } catch { bugcount++; this.txt_result.Text = "成功" + successcount + "个" + "/失败" + failurecount + "个/错误" + bugcount + "个"; continue; } } } this.txt_result.Text += "此轮投票已经结束"; } #endregion 以下代码则是 加载内容: /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> // Create by Charles 2012-11-25 13:23 void browser_Navigated(object sender, WebBrowserNavigatedEventArgs e) { if (current_proxy != temp_proxy) //排他锁的作用 { html = wbCnblog.DocumentText; //获取到的html. this.wbCnblog.DocumentText = ""; if (html.Contains("生活快乐")) { //this.txt_result.Text += html; this.txt_status.Text = "成功"; successcount++; this.txt_result.Text = "成功" + successcount + "个" + "/失败" + failurecount + "个/错误" + bugcount + "个"; this.txt_success.Text += current_proxy + "|"; WriteText(current_proxy + "----投票成功----" + DateTime.Now + Environment.NewLine); //写日志文件 } else { this.txt_status.Text = "失败"; failurecount++; this.txt_result.Text = "成功" + successcount + "个" + "/失败" + failurecount + "个/错误" + bugcount + "个"; } loading = false;//在加载完成后,将该变量置为false,下一次循环随即开始执行. this.wbCnblog.Focus(); SendKeys.Send("{Enter}"); //如果存在弹窗,回车确定,防止程序暂定 //this.Focus(); //SendKeys.Send("{Enter}"); //this.wbCnblog.Document.Focus(); //SendKeys.Send("{Enter}"); temp_proxy = current_proxy; } } 关于写日志文件,我想应该就相对来说简单多了,就是简单的写文本文件 /// <summary> /// 写成功日志文件 /// </summary> /// <param name="text"></param> // Create By Charles 2012-11-25 21:31 public void WriteText(string text) { FileStream fs = new FileStream((Application.StartupPath, "succes_log.txt"), FileMode.Append); StreamWriter sw = new StreamWriter(fs, Encoding.Default); sw.Write(text); sw.Close(); fs.Close(); } 差点忘了,还有一个很重要的代码,便是刷新 代理 注册表 #region 读取并设置浏览器的proxy server信息 RegistryKey pregkey; pregkey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true); if (pregkey == null) { this.txt_info.Text = "键值不存在!"; } else { pregkey.SetValue("ProxyServer", lst.SelectedItems[0].SubItems[0].Text + ":" + lst.SelectedItems[0].SubItems[1].Text); this.txt_info.Text = pregkey.GetValue("ProxyServer").ToString(); } #endregion知识点差不多就这些了。
[ 本帖最后由 shenchaoming 于 2012-11-26 01:31 编辑 ]