生气了就简单弄了一个翻墙工具,其实就是找了一个代理!
开发原由:
要知道一个平常不怎么翻墙的人又一次翻墙了,并且注册了一个facebook的账号,结果facebook没事的时候会提醒你去登陆一下,你没有一个好用的代理Ip,那你就悲剧了,眼馋啊!
那,你去代理IP的网站上去找一个可用的IP不是那么简单的,你得一个一个的去测试,这时,直接弄一个小程序不就得了?
参考数据:
以前发过的一个修改webbrowser代理的博客,点击我去看看
以前发过的一个下载代理IP的博客,点击我去看看
程序样子,挺不好看的,表示我的审美观很差啊!
具体的实现方式简单的不得了,就是不挺的去变更代理IP,之后去加载你要访问的主页,如果访问成功就停止变换IP,如果不成功,就继续了!
详细的步骤在代码里面写的很清楚了,上代码了!
用到的代码:
1,一个窗口主页面的所有代码:


using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Net;using System.Data.SqlClient;using System.Text.RegularExpressions;namespace 翻墙浏览器{ public partial class Chrome : Form { private string startUrl = "www.baidu.com"; private List<string> proxyList = new List<string>(); private int proxyIndex = 0; private int findTime = 6000; delegate void FormChange(); System.Timers.Timer secondTimer; /// <summary> /// 构造函数 /// </summary> public Chrome() { InitializeComponent(); } /// <summary> /// 窗口加载函数 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Chrome_Load(object sender, EventArgs e) { secondTimer = new System.Timers.Timer(); secondTimer.Elapsed += new System.Timers.ElapsedEventHandler(secondTimer_Elapsed); secondTimer.Interval = 1000; secondTimer.Start(); new System.Threading.Thread(new System.Threading.ThreadStart(GetProxys)).Start(); txtUrl.Text = startUrl; wb.Navigate(startUrl); wb.DocumentCompleted += txtUrl_UrlChanged; wb.ScriptErrorsSuppressed = false; findTime = int.Parse(txtFindTime.Text) * 1000; } /// <summary> /// 右下角的时间Timer /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void secondTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { this.BeginInvoke(new FormChange(() => labTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))); } /// <summary> /// 这边是使用置换代理IP的代码,在前一个博客里面有所介绍了 /// </summary> /// <param name="hInternet"></param> /// <param name="dwOption"></param> /// <param name="lpBuffer"></param> /// <param name="lpdwBufferLength"></param> /// <returns></returns> [DllImport("wininet.dll", SetLastError = true)] private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength); public struct Struct_INTERNET_PROXY_INFO { public int dwAccessType; public IntPtr proxy; public IntPtr proxyBypass; }; private void RefreshIESettings(string strProxy) { const int INTERNET_OPTION_PROXY = 38; const int INTERNET_OPEN_TYPE_PROXY = 3; Struct_INTERNET_PROXY_INFO struct_IPI; // Filling in structure struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY; struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy); struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local"); // Allocating memory IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI)); // Converting structure to IntPtr Marshal.StructureToPtr(struct_IPI, intptrStruct, true); bool iReturn = InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI)); } /// <summary> /// 得到所有可用的代理IP地址,用于查看想要访问的网站 /// </summary> private void GetProxys() {///这里我改了一下,隐藏了一下我用到数据库的连接方式,懂的人都知道这里应该怎么改的,这个代理库的获取可以参见我以前发过的博客 SqlConnection conn = new SqlConnection("server=server;database=database;uid=uid;pwd=pwd"); conn.Open(); SqlCommand com = conn.CreateCommand(); com.CommandText = "select Proxy from ProxyTable"; SqlDataReader reader = com.ExecuteReader(); while (reader.Read()) proxyList.Add(reader["Proxy"].ToString()); reader.Close(); com.Dispose(); conn.Dispose(); } /// <summary> /// 转到某url的按钮 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnGo_Click(object sender, EventArgs e) { wb.Navigate(txtUrl.Text); } /// <summary> /// 刷新当前Url页面 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnUpdate_Click(object sender, EventArgs e) { wb.Refresh(); } /// <summary> /// 浏览器向前一个页面跳跃 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnForward_Click(object sender, EventArgs e) { wb.GoForward(); } /// <summary> /// 浏览器向后一个页面跳跃 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnBack_Click(object sender, EventArgs e) { wb.GoBack(); } /// <summary> /// 停止操作 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnStop_Click(object sender, EventArgs e) { findTimer.Stop(); wb.Stop(); } /// <summary> /// 在Webbrowser的页面地址变化的时候,TextBox的url地址也跟着变化 /// </summary> private static DateTime changeTime = DateTime.Now; private void txtUrl_UrlChanged(object sender, EventArgs e) { if ((DateTime.Now - changeTime).TotalMilliseconds < 1000) return; txtUrl.Text = wb.Url.AbsoluteUri; changeTime = DateTime.Now; //btnGo_Click(null, null); } /// <summary> /// 点击TextBox时,如果是回车,则跳转到 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txtUrl_KeyDown(object sender, KeyEventArgs e) { if (e.KeyValue == 13) { btnGo_Click(null, null); } } /// <summary> /// 在查找某个url的时候每t秒更换一个代理地址 /// </summary> System.Timers.Timer findTimer = new System.Timers.Timer(); private void btnFind_Click(object sender, EventArgs e) { wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted); findTimer_Elapsed(null, null); findTimer.Elapsed += new System.Timers.ElapsedEventHandler(findTimer_Elapsed); findTimer.Interval = findTime; findTimer.Start(); } /// <summary> /// Webbrowser加载完毕时,判断是否正常访问Url,如果正常,停止Timer的运行 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (CheckIsUsed()) findTimer.Stop(); } /// <summary> /// 每T秒变更一个新的代理IP /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void findTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { string proxy = proxyList[GetNextPIndex()]; RefreshIESettings(proxy); wb.Navigate(txtUrl.Text); this.BeginInvoke(new FormChange(() => labProxy.Text = proxy)); findTimer.Interval = findTime; } /// <summary> /// 判断当前页面是否加载正确,判断条件为:页面内有当前想访问的域名,并且页面html长度大于1500 /// </summary> private Regex domainReg = new Regex(@"\w+(?=\.(com|cn|org|info|hk))",RegexOptions.Compiled); private bool CheckIsUsed() { if (!wb.IsBusy && wb.ReadyState == WebBrowserReadyState.Complete && wb.DocumentText.Length > 1500 && wb.DocumentText.IndexOf(domainReg.Match(txtUrl.Text).Value) >= 0) return true; return false; } /// <summary> /// 得到下一个代理地址的Index /// </summary> /// <returns></returns> private int GetNextPIndex() { proxyIndex = (proxyIndex + 1) % proxyList.Count(); return proxyIndex; } /// <summary> /// 设置代理的一步,将代理填入TextBox内,之后设置该代理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnClear_Click(object sender, EventArgs e) { findTimer.Stop(); RefreshIESettings(txtUrl.Text); this.BeginInvoke(new FormChange(() => labProxy.Text = txtUrl.Text)); } /// <summary> /// 加载时间变化的时候告诉Timer /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txtFindTime_TextChanged(object sender, EventArgs e) { int time; if (int.TryParse(txtFindTime.Text, out time)) findTime = time * 1000; else txtFindTime.Text = (findTime/1000).ToString(); } }}
2,修改webbrowser代理IP的代码(也可参见以前发过的博客)


using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Security.Permissions;namespace 翻墙浏览器{ public class MyWebBrowser : WebBrowser { [ComImport, Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch), TypeLibType(TypeLibTypeFlags.FHidden)] public interface DWebBrowserEvents2 { [DispId(271)] void NavigateError( [In, MarshalAs(UnmanagedType.IDispatch)] object pDisp, [In] ref object URL, [In] ref object frame, [In] ref object statusCode, [In, Out] ref bool cancel); } AxHost.ConnectionPointCookie cookie; MyWebBrowserEventHelper helper; public delegate void WebBrowserNavigateErrorEventHandler(object sender, WebBrowserNavigateErrorEventArgs e); [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] protected override void CreateSink() { base.CreateSink(); // Create an instance of the client that will handle the event // and associate it with the underlying ActiveX control. helper = new MyWebBrowserEventHelper(this); cookie = new AxHost.ConnectionPointCookie( this.ActiveXInstance, helper, typeof(DWebBrowserEvents2)); } [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] protected override void DetachSink() { // Disconnect the client that handles the event // from the underlying ActiveX control. if (cookie != null) { cookie.Disconnect(); cookie = null; } base.DetachSink(); } public event WebBrowserNavigateErrorEventHandler NavigateError; // Raises the NavigateError event. protected virtual void OnNavigateError( WebBrowserNavigateErrorEventArgs e) { if (this.NavigateError != null) { this.NavigateError(this, e); } } // Handles the NavigateError event from the underlying ActiveX // control by raising the NavigateError event defined in this class. private class MyWebBrowserEventHelper : StandardOleMarshalObject, DWebBrowserEvents2 { private MyWebBrowser parent; public MyWebBrowserEventHelper(MyWebBrowser parent) { this.parent = parent; } public void NavigateError(object pDisp, ref object url, ref object frame, ref object statusCode, ref bool cancel) { // Raise the NavigateError event. this.parent.OnNavigateError( new WebBrowserNavigateErrorEventArgs( (String)url, (String)frame, (Int32)statusCode, cancel)); } } } public class WebBrowserNavigateErrorEventArgs : EventArgs { private String urlValue; private String frameValue; private Int32 statusCodeValue; private Boolean cancelValue; public WebBrowserNavigateErrorEventArgs( String url, String frame, Int32 statusCode, Boolean cancel) { urlValue = url; frameValue = frame; statusCodeValue = statusCode; cancelValue = cancel; } public String Url { get { return urlValue; } set { urlValue = value; } } public String Frame { get { return frameValue; } set { frameValue = value; } } public Int32 StatusCode { get { return statusCodeValue; } set { statusCodeValue = value; } } public Boolean Cancel { get { return cancelValue; } set { cancelValue = value; } } }}
TAG: