您的位置:首页 > 其它

关于 【通过代理访问】 的研究,【突破 IP ,“无限制”投票】

2012-11-25 22:26 141 查看
相信大家身边有很多朋友有时候请大家投各种票,刚好,这会儿也有朋友找我投票,身为IT程序开发人员,总觉得投机取巧一点。

如果仅仅只是点击即可投票,那相对而言就简单了,然而,有些网站限制IP,那么情况就不一样了。

如果您是拨号上网用户,可以重连路由,改变外网IP地址,不过,这种方式有时候也不奏效。

于是我采用了IP代理的方式来自动投票。

这样,一般人会这样:更改IE浏览器的代理设置,打开IE浏览器输入投票网址(这里需要各位自己找直接投票的url)投票。

但是问题又出来了,每次投票都得重启浏览器才行,我个人觉得浏览器打开的一些设置已经保存在了缓存中

虽然在更改代理的时候更改了注册表项值,但浏览器并没有实时去读取这个值

因此,鄙人编写了一个小程序用于自动投票。下面是该程序的关键代码:



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.xxoo.com?name=" + 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(Path.Combine(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

知识点差不多就这些了,有兴趣的朋友可以留言交流交流
下载地址:http://download.csdn.net/download/shenchaoming/5133965
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: