环境:VS2005+C#
起因:公司为代理上网,每个人分配帐号和密码。默认帐号为邮件@之前,密码为工号。这些可以通过公司黄页获取。但会出现两个问题,1、大部分人还是很聪明的修改了密码,不会默认为工号;2、帐号有流量限制,就算密码没有修改,没有流量也比较麻烦。每次从N多帐号中试哪个可用,非常麻烦。
设计思路:
C# 使用using System.Net,定义一个含有代理的HttpWebRequest,打开baidu,对比返回的HttpWebResponse中是否含有"百度一下,你就知道"。如果有则说明代理可用。
代码比较简单,就不解释了。
这里有4个问题:
1、不知道怎么用C#清理页面缓存,这个带来的问题就是只要找到一个可用帐号,后面的帐号就没法识别了,因为baidu的页面已经缓存在那边了。所以程序里只要找到一个就中断,反正一次也只能用一个帐号。其实一种取巧的方法是在自己博客里放上张网页,设置成不缓存的,应该能解决。不过在公司不能用ftp
工具,有空在试吧。
2、帐号数据不多,简单点就没用线程去做了。页面也就卡个几秒最多。
3、这个其实是很早以前的想法,不过那时候写不来,现在几行代码就搞定了,但实际我不用这个代理上网又,闲的蛋疼。
4、想做个自动更换代理帐号的按键,但没找到windows的接口。
代码:
- //读取帐号文件,以及页面显示。
- private void butLoad_Click(object sender, EventArgs e)
-
- {
- string fileName = "Account.txt";
- FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate);
- StreamReader sr = new StreamReader(fs);
- string name, password, line;
- string[] token;
- bool bFound = false;
- while ((line = sr.ReadLine()) != null && bFound == false)
- {
- token = line.Split(' ');
- name = token[0];
- password = token[1];
- if (isAvailable(name, password))
- {
- m_list.Items.Add("查找到一个可用帐号:");
- bFound = true;
- m_list.Items.Add(name + " / " + password);
- butLoad.Enabled = false;
- m_name.Text = name;
- m_passpw.Text = password;
- }
- }
- sr.Close();
- fs.Close();
- }
复制代码
- //判断代理是否可用
- private bool isAvailable(string name, string password)
- {
- string url = "http://www.baidu.com";
- HttpWebRequest hwr = (HttpWebRequest)HttpWebRequest.Create(url);
- hwr.Timeout = 50000;
- WebProxy proxy = new WebProxy();
- proxy.Address = new Uri("http://10.0.0.108:8080");
- proxy.Credentials = new NetworkCredential(name, password, "ecc");
- hwr.UseDefaultCredentials = true;
- hwr.Proxy = proxy;
- bool isSuccess = true;
- HttpWebResponse hwrs = null;
- try
- {
- hwrs = (HttpWebResponse)hwr.GetResponse();
- }
- catch
- {
- //MessageBox.Show("无法连接代理!");
- isSuccess = false;
- }
- if (isSuccess)
- {
- string strCheck = "百度一下,你就知道";
- Stream s = null;
- s = hwrs.GetResponseStream();
- StreamReader sr = new StreamReader(s, Encoding.Default);
- string str = null;
- str = sr.ReadToEnd();
- int iFind = str.IndexOf(strCheck);
- if (iFind != -1)
- {
- return true;
- }
- else
- return false;
- }
- else
- return false;
- }
复制代码