C#编写代理验证工具(WinForm)

前一整子一个朋友想要我帮他用C#写一个代理验证工具,碰巧我也没事干,很快就折腾出来了,基本达到了朋友的预期。把源码发出来附上讲解,希望能帮助一些刚接触C#的新手。这个小工具完整的源码我已经上传到了我的Github账号上。

实现思路

第一步考虑如何验证代理,即为如何判断代理是否可用?我的思路是使用待验证的代理向指定网站发送访问请求,如果请求超时,那么代理不可用,反之则为可用。确定思路后就简单了,你会发现这是个极其容易实现的程序。C#的System.Net命名空间中的HttpWebRequest类以及WebProxy类帮了我们大忙。具体一点就是通过WebProxy设置指定代理然后让HttpWebRequest发送请求再用try语句判断就好。如果连接超时,那么程序就会报错,我们可以通过try语句实现后面需要的操作。

实现代码

我只给关键的代码,也不会说该放哪些控件。整个项目可在开头提到的链接中获取!

我们需要用到的两个类都在System.Net命名空间中,所以首当其冲我们就要引用该命名空间。

using System.Net;

HttpWebRequest发送请求。

    WebProxy proxyObject = new WebProxy("代理地址");//创建代理
    HttpWebRequest Req = (HttpWebRequest)WebRequest.Create("用于代理验证的网址") ;//创建HTTP请求
    Req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 133; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CIBA; InfoPath.2)";//UA
    Req.Proxy = proxyObject;//设置代理
    Req.Method = "GET";//请求方法,此处为GET
    Req.Timeout = 2000;//超时时间,以毫秒为单位
    HttpWebResponse Resp = (HttpWebResponse)Req.GetResponse();//发送请求

如果请求超时,也就是说代理不可用。那么最后一行代码也就是发送请求的那行代码就会报错。所以我们用try语句进行异常处理,catch{}中的内容就是在报错后执行的代码。在这里我们用MessageBox来提示代理不可用。综合起来我们可以写出下面的代码。

    try
    {
        WebProxy proxyObject = new WebProxy("代理地址");//创建代理
        HttpWebRequest Req = (HttpWebRequest)WebRequest.Create("用于代理验证的网址") ;//创建HTTP请求
        Req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 133; SLCC2; .NET CLR     2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CIBA; InfoPath.2)";//UA
        Req.Proxy = proxyObject;//设置代理
        Req.Method = "GET";//请求方法,此处为GET
        Req.Timeout = 2000;//超时时间,以毫秒为单位
        HttpWebResponse Resp = (HttpWebResponse)Req.GetResponse();//发送请求
    }
    catch
    {
        richTextBox1.Text=(proxys[i]+" 不可用");
    }

完善功能

上面就是关键源码,但是我们总不可能让人家每验证一次就改一次源码吧?我一般一次需要验证的代理少则几十多则几百,总不可能一个一个添加吧?如果是WinForm窗口点击Button执行,例如我把这些代码放在Button1下面,那么发起请求到报错那一段时间内会造成线程阻塞,窗口无响应。这样用着舒服吗?那么我们完善一下,通过一个Button载入带有代理的txt文件,然后通过另一个Button启动用于验证代理的子线程进行验证,并且把结果输出到richtextbox上面。完善后完整源码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Threading;
namespace Test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string[] proxys;
        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread1 = new Thread(new ThreadStart(Thread1));
            thread1.Start();
        }
        private void Thread1()
        {
            button1.Enabled = false;
            button2.Enabled = false;
            textBox1.Enabled = false;
            textBox2.Enabled = false;
            richTextBox1.Clear();
            label1.Text = "正在验证代理......";
            int i = 0;
            while(i<proxys.Length)
            {
                try
                {
                    WebProxy proxyObject = new WebProxy(proxys[i]);
                    HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(textBox1.Text) ;
                    Req.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; QQWubi 133; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; CIBA; InfoPath.2)";
                    Req.Proxy = proxyObject;
                    Req.Method = "GET";
                    Req.Timeout = int.Parse(textBox2.Text)*1000;
                    HttpWebResponse Resp = (HttpWebResponse)Req.GetResponse();
                    richTextBox1.Text += proxys[i] + " 可用";
                }
                catch
                {
                    richTextBox1.Text += proxys[i]+" 不可用";
                }
                i++;
            }
            label1.Text = "验证完毕!";
            MessageBox.Show("验证完毕!","提示");
            button1.Enabled = true;
            button2.Enabled = true;
            textBox1.Enabled = true;
            textBox2.Enabled = true;
        }
        private void button2_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "txt文件|*.txt";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                proxys = File.ReadAllLines(openFileDialog1.FileName);
                int i = 0;
                richTextBox1.Clear();
                while(i<proxys.Length)
                {
                    richTextBox1.Text += proxys[i] + "\r";
                    i++;
                }
                button1.Enabled = true;
                label1.Text = "代理已导入!";
            }
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Environment.Exit(0);
        }
        private void button3_Click(object sender, EventArgs e)
        {
            Thread thread2 = new Thread(new ThreadStart(Thread2));
            thread2.Start();
        }
        private void Thread2()
        {
            button2.Enabled = false;
            textBox1.Enabled = false;
            textBox2.Enabled = false;
            try
            {
                Encoding encoding = Encoding.UTF8;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(textBox1.Text);
                request.Method = "GET";
                request.Accept = "text/html, application/xhtml+xml, */*";
                request.ContentType = "application/json";
                request.Timeout = int.Parse(textBox2.Text) * 1000;
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                MessageBox.Show("验证网址可用!", "提示");
                button2.Enabled = true;
                textBox1.Enabled = true;
                textBox2.Enabled = true;
            }
            catch
            {
                MessageBox.Show("验证网址不可用!", "提示");
                button2.Enabled = true;
                textBox1.Enabled = true;
                textBox2.Enabled = true;
            }
        }
    }
}

多线程

暂时懒得写,随缘更!

多线程已更新至开头的Github项目!

作者: Thrower
本文采用 CC BY-NC-SA 4.0 协议

评论

  1. Devil
    Android UC Browser 13.4.2.1122
    3月前
    2021-7-16 0:06:47

    不错 我看着很满意

  2. Teacher Du
    Windows Edge 91.0.864.48
    3月前
    2021-7-27 13:08:15

    恭喜再度开站!

    • Thrower 博主
      Windows Firefox 90.0
      3月前
      2021-7-27 13:16:45

      ヾ(≧∇≦*)ゝ

  3. 无踪的风
    Windows Chrome 86.0.4240.198
    3月前
    2021-8-06 11:25:11

    Tommy哥,那个键盘记录器有进展了吗|´・ω・)ノ

  4. admin
    iPhone Safari 14.1.2
    2月前
    2021-9-05 12:56:13

    6666

  5. Teacher Du
    Windows Edge 93.0.961.38
    1月前
    2021-9-11 20:31:50

    开发我是小白,是验证代理是否可用吗?

    • Thrower 博主
      Windows Firefox 92.0
      1月前
      2021-9-11 20:40:12

      对的,验证代理IP,不过这样实现好像只能验证HTTP的

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇