2012年10月11日星期四

生气了就简单弄了一个翻墙工具,其实就是找了一个代理!

生气了就简单弄了一个翻墙工具,其实就是找了一个代理!

开发原由:

要知道一个平常不怎么翻墙的人又一次翻墙了,并且注册了一个facebook的账号,结果facebook没事的时候会提醒你去登陆一下,你没有一个好用的代理Ip,那你就悲剧了,眼馋啊!

那,你去代理IP的网站上去找一个可用的IP不是那么简单的,你得一个一个的去测试,这时,直接弄一个小程序不就得了?

参考数据:

以前发过的一个修改webbrowser代理的博客,点击我去看看

以前发过的一个下载代理IP的博客,点击我去看看

程序样子,挺不好看的,表示我的审美观很差啊!

具体的实现方式简单的不得了,就是不挺的去变更代理IP,之后去加载你要访问的主页,如果访问成功就停止变换IP,如果不成功,就继续了!

详细的步骤在代码里面写的很清楚了,上代码了!

用到的代码:

1,一个窗口主页面的所有代码:

View Code
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的代码(也可参见以前发过的博客)

View Code
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: