banner
DarianBlog

DarianBlog

达里安博客-专注于技术分享与交流的博客。博客致力于创造一个简单而直接的技术学习平台。
email
telegram

http和socks5代理的批量测试脚本

在 vps 的主目录创建一个 python 文件(例如:proxy_test.py), 创建后,复制粘贴下方代码,根据需要,自行修改代理的网址或路径

import requests
import concurrent.futures
import time
import os
import json
from urllib3.exceptions import InsecureRequestWarning

# Suppress only the InsecureRequestWarning from urllib3
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

# --- Configuration Parameters ---
# **Updated URL: Using a more stable public proxy list URL**
PROXY_URL = 'https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/http.txt'

# Target used for checking proxy anonymity (must echo back request data)
ANONYMITY_TARGET = 'http://httpbin.org/get'
# Stricter, real-world target for final connectivity check (tests SSL/TLS)
FINAL_CONNECTIVITY_TARGET = 'https://www.google.com' 

# **UPDATE:** Single proxy test total timeout (seconds). Set back to 5s.
TIMEOUT = 5 
# **NEW/UPDATED:** Maximum acceptable total latency (seconds). Anything slower will be rejected.
MAX_LATENCY = 4.5
# Max concurrent threads - Adjusted to 200 for better stability
MAX_WORKERS = 180
# ------------------

def fetch_proxies(url):
    """
    Fetches the proxy list from the specified URL.
    Includes detailed headers to simulate a browser.
    """
    print(f"尝试从 {url} 获取代理列表...")
    try:
        # Browser-like headers
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Referer': 'https://www.google.com/', 
            'Accept-Encoding': 'gzip, deflate, br',
            'Connection': 'keep-alive',
        }
        
        # Disable SSL verification due to common proxy issues
        response = requests.get(url, headers=headers, timeout=10, verify=False)
        response.raise_for_status()

        proxies = [p.strip() for p in response.text.splitlines() if p.strip()]
        print(f"成功获取到 {len(proxies)} 个代理。")
        return proxies

    except requests.exceptions.RequestException as e:
        print(f"❌ 错误:获取代理列表失败,请检查URL或网络连接。错误信息:{e}")
        return []

def get_real_ip():
    """
    Fetches the client's real IP address for comparison using two methods 
    for improved robustness.
    """
    # --- 尝试方法 1: httpbin.org ---
    try:
        print("尝试使用 httpbin.org 获取真实IP...")
        response = requests.get(ANONYMITY_TARGET, timeout=5)
        response.raise_for_status()
        real_ip = response.json().get('origin')
        if real_ip:
            # httpbin.org有时会返回多个IP地址,我们只取第一个
            return real_ip.split(',')[0].strip()
    except Exception as e:
        print(f"httpbin.org 获取失败: {type(e).__name__}。尝试备用方案...")
        
    # --- 尝试方法 2: api.ipify.org (备用方案) ---
    try:
        response = requests.get('https://api.ipify.org?format=json', timeout=5)
        response.raise_for_status()
        return response.json().get('ip')
    except Exception as e:
        print(f"api.ipify.org 获取失败: {type(e).__name__}。")
        return None

def check_proxy(proxy, real_ip):
    """
    Tests a single proxy for anonymity, speed (latency), and real-world connectivity.
    Returns (proxy, True, reason, latency) if successful.
    """
    ip_port = proxy.split(':')
    if len(ip_port) != 2:
        return proxy, False, "格式错误", None
    proxy_ip = ip_port[0]

    proxies = {
        'http': f'http://{proxy}',
        'https': f'http://{proxy}', 
    }
    
    # --- 1. Anonymity Check (using ANONYMITY_TARGET) ---
    try:
        start_time = time.time()
        # Use the global TIMEOUT for initial connection
        response = requests.get(ANONYMITY_TARGET, proxies=proxies, timeout=TIMEOUT, verify=False)
        
        # Basic connectivity check
        if response.status_code != 200:
            return proxy, False, "连接/状态码异常", None
        
        # Anonymity check
        response_json = response.json()
        reported_ip = response_json.get('origin')
        
        # Anonymity Logic: Reported IP must not be real IP AND must match proxy's IP
        if not (reported_ip and reported_ip != real_ip and reported_ip.startswith(proxy_ip)):
             return proxy, False, "透明/身份信息泄露", None

    except requests.exceptions.Timeout:
        return proxy, False, f"超时 (>{TIMEOUT}s)", None
    except Exception as e:
        return proxy, False, f"匿名性检测失败: {type(e).__name__}", None

    # --- 2. Final Real-World Connectivity Check (using FINAL_CONNECTIVITY_TARGET) ---
    try:
        # Test against Google. Use the global TIMEOUT for final test.
        requests.get(FINAL_CONNECTIVITY_TARGET, proxies=proxies, timeout=TIMEOUT, verify=False).raise_for_status()
        
        # Calculate total latency since the start of the first test
        total_latency = time.time() - start_time 

        # **SPEED CHECK:** Only accept proxies under the maximum latency threshold
        if total_latency > MAX_LATENCY:
             return proxy, False, f"速度太慢 (总延迟: {total_latency:.2f}s)", None
        
        # Success if we reach here, status code is good, and speed is acceptable
        return proxy, True, f"高匿/匿名/快速连通 (总延迟: {total_latency:.2f}s)", total_latency
    except Exception as e:
        # If it passed anonymity but failed the final Google test, it's blocked/incompatible
        return proxy, False, f"被目标网站屏蔽: {type(e).__name__}", None


def batch_check(proxies, real_ip):
    """Uses multi-threading to batch test proxies."""
    successful_proxies = []
    total_proxies = len(proxies)
    
    # Use ThreadPoolExecutor for concurrency
    with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
        # Submit all tasks, passing the real IP to each check function
        future_to_proxy = {executor.submit(check_proxy, proxy, real_ip): proxy for proxy in proxies}
        
        # List to store (proxy, latency) for sorting
        working_proxies_with_latency = []

        # Retrieve results one by one, printing progress
        for i, future in enumerate(concurrent.futures.as_completed(future_to_proxy)):
            proxy = future_to_proxy[future]
            try:
                # The function returns 4 values: (proxy, is_working, reason, latency)
                proxy, is_working, reason, latency = future.result()
            except Exception as exc:
                is_working = False
                latency = None
                reason = f"线程错误: {exc}"
            
            # Print real-time progress
            progress = f"[{i+1}/{total_proxies}]"
            print(f"\r{progress} 正在检测... 当前可用: {len(working_proxies_with_latency)}", end="", flush=True)

            if is_working:
                working_proxies_with_latency.append((proxy, latency))
                
    # Sort proxies by latency (fastest first)
    working_proxies_with_latency.sort(key=lambda x: x[1])
    successful_proxies = [p[0] for p in working_proxies_with_latency]

    # Clear progress output and newline
    print("\n")
    return successful_proxies

if __name__ == '__main__':
    start_time = time.time()
    
    # 0. Get the client's real IP for anonymity comparison
    print("正在获取您的真实IP地址用于匿名性对比...")
    real_ip = get_real_ip()
    if not real_ip:
        print("❌ 警告:无法获取真实IP,将跳过匿名性检查,代理质量可能降低。")
        real_ip = '0.0.0.0' # Use a fallback value
    else:
        print(f"✅ 您的真实IP地址是: {real_ip}")
        
    # 1. Fetch proxy list
    proxy_list = fetch_proxies(PROXY_URL)
    
    if not proxy_list:
        print("程序终止,未能获取到代理列表。")
    else:
        # Updated output to reflect the new speed limit
        print(f"开始测试 {len(proxy_list)} 个代理 (要求匿名性, 速度 < {MAX_LATENCY:.1f}s, 目标: {FINAL_CONNECTIVITY_TARGET}),并发数:{MAX_WORKERS}...")
        
        # 2. Batch check
        successful_proxies = batch_check(proxy_list, real_ip)
        
        end_time = time.time()
        
        # 3. Summary and saving results
        print("\n--- 结果总结 ---")
        print(f"总耗时:{end_time - start_time:.2f} 秒")
        print(f"总代理数:{len(proxy_list)}")
        print(f"可用(高匿/匿名/快速)代理数:{len(successful_proxies)}")
        if len(proxy_list) > 0:
            print(f"成功率:{len(successful_proxies)/len(proxy_list)*100:.2f}%")
        
        output_file = 'working_proxies.txt'
        with open(output_file, 'w') as f:
            f.write('\n'.join(successful_proxies))
        print(f"\n✅ 可用代理已保存到文件:{output_file} (已按延迟排序,最快在前)")

下面是 socks5 批量测试脚本

import requests
import concurrent.futures
import time
import os
import json
from urllib3.exceptions import InsecureRequestWarning

# 请注意:要使用SOCKS5代理,您必须先运行:pip install requests[socks]

# Suppress only the InsecureRequestWarning from urllib3
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

# --- 配置参数 ---
# **已更新:使用SOCKS5代理列表URL**
PROXY_URL = 'https://raw.githubusercontent.com/TheSpeedX/PROXY-List/master/socks5.txt'

# 用于检查代理匿名性的目标 (必须返回请求数据)
ANONYMITY_TARGET = 'http://httpbin.org/get'
# 用于最终连通性检查的严格目标 (测试 SSL/TLS)
FINAL_CONNECTIVITY_TARGET = 'https://www.google.com' 

# 单个代理测试的连接超时时间(秒)。
TIMEOUT = 5 
# 最大可接受总延迟(秒)。任何慢于此值的代理都将被拒绝。
MAX_LATENCY = 4.0
# 最大并发线程数 - 调整为180以获得更好的稳定性
MAX_WORKERS = 180
# ------------------

def fetch_proxies(url):
    """
    从指定的URL获取代理列表。
    """
    print(f"尝试从 {url} 获取代理列表...")
    try:
        # 浏览器模拟请求头
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36 Edg/129.0.0.0',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Referer': 'https://www.google.com/', 
            'Accept-Encoding': 'gzip, deflate, br',
            'Connection': 'keep-alive',
        }
        
        # 禁用SSL验证
        response = requests.get(url, headers=headers, timeout=10, verify=False)
        response.raise_for_status()

        proxies = [p.strip() for p in response.text.splitlines() if p.strip()]
        print(f"成功获取到 {len(proxies)} 个代理。")
        return proxies

    except requests.exceptions.RequestException as e:
        print(f"❌ 错误:获取代理列表失败,请检查URL或网络连接。错误信息:{e}")
        return []

def get_real_ip():
    """
    获取客户端的真实IP地址用于对比,使用双重回退机制。
    """
    # --- 尝试方法 1: httpbin.org ---
    try:
        print("尝试使用 httpbin.org 获取真实IP...")
        response = requests.get(ANONYMITY_TARGET, timeout=5)
        response.raise_for_status()
        real_ip = response.json().get('origin')
        if real_ip:
            # httpbin.org有时会返回多个IP地址,我们只取第一个
            return real_ip.split(',')[0].strip()
    except Exception as e:
        print(f"httpbin.org 获取失败: {type(e).__name__}。尝试备用方案...")
        
    # --- 尝试方法 2: api.ipify.org (备用方案) ---
    try:
        response = requests.get('https://api.ipify.org?format=json', timeout=5)
        response.raise_for_status()
        return response.json().get('ip')
    except Exception as e:
        print(f"api.ipify.org 获取失败: {type(e).__name__}。")
        return None

def check_proxy(proxy, real_ip):
    """
    测试单个代理的匿名性、速度和实际连通性。
    """
    ip_port = proxy.split(':')
    if len(ip_port) != 2:
        return proxy, False, "格式错误", None
    proxy_ip = ip_port[0]

    # **关键修改:使用 socks5:// 协议**
    proxies = {
        'http': f'socks5://{proxy}',
        'https': f'socks5://{proxy}', 
    }
    
    # --- 1. 匿名性检查 (使用 ANONYMITY_TARGET) ---
    try:
        start_time = time.time()
        # 使用全局 TIMEOUT 进行初始连接
        response = requests.get(ANONYMITY_TARGET, proxies=proxies, timeout=TIMEOUT, verify=False)
        
        # 基本连通性检查
        if response.status_code != 200:
            return proxy, False, "连接/状态码异常", None
        
        # 匿名性检查
        response_json = response.json()
        reported_ip = response_json.get('origin')
        
        # 匿名性逻辑:报告的IP既不能是真实IP,也必须与代理IP匹配
        if not (reported_ip and reported_ip != real_ip and reported_ip.startswith(proxy_ip)):
             return proxy, False, "透明/身份信息泄露", None

    except requests.exceptions.Timeout:
        return proxy, False, f"超时 (>{TIMEOUT}s)", None
    except Exception as e:
        return proxy, False, f"匿名性检测失败: {type(e).__name__}", None

    # --- 2. 最终实际连通性检查 (使用 FINAL_CONNECTIVITY_TARGET) ---
    try:
        # 对 Google 进行测试。使用全局 TIMEOUT 进行最终测试。
        requests.get(FINAL_CONNECTIVITY_TARGET, proxies=proxies, timeout=TIMEOUT, verify=False).raise_for_status()
        
        # 计算从第一次测试开始的总延迟
        total_latency = time.time() - start_time 

        # **速度检查:** 只接受低于最大延迟阈值的代理
        if total_latency > MAX_LATENCY:
             return proxy, False, f"速度太慢 (总延迟: {total_latency:.2f}s)", None
        
        # 成功通过所有检查
        return proxy, True, f"高匿/匿名/快速连通 (总延迟: {total_latency:.2f}s)", total_latency
    except Exception as e:
        # 如果通过了匿名性检查,但在 Google 测试中失败,则认为被目标网站屏蔽
        return proxy, False, f"被目标网站屏蔽: {type(e).__name__}", None


def batch_check(proxies, real_ip):
    """使用多线程批量测试代理。"""
    successful_proxies = []
    total_proxies = len(proxies)
    
    # 使用 ThreadPoolExecutor 实现并发
    with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
        # 提交所有任务,并将真实IP传递给每个检查函数
        future_to_proxy = {executor.submit(check_proxy, proxy, real_ip): proxy for proxy in proxies}
        
        # 用于存储 (proxy, latency) 以进行排序
        working_proxies_with_latency = []

        # 逐个获取结果,并打印进度
        for i, future in enumerate(concurrent.futures.as_completed(future_to_proxy)):
            proxy = future_to_proxy[future]
            try:
                # 函数返回 4 个值: (proxy, is_working, reason, latency)
                proxy, is_working, reason, latency = future.result()
            except Exception as exc:
                is_working = False
                latency = None
                reason = f"线程错误: {exc}"
            
            # 实时进度条输出
            progress = f"[{i+1}/{total_proxies}]"
            print(f"\r{progress} 正在检测... 当前可用: {len(working_proxies_with_latency)}", end="", flush=True)

            if is_working:
                working_proxies_with_latency.append((proxy, latency))
                
    # 按延迟排序(最快的在前)
    working_proxies_with_latency.sort(key=lambda x: x[1])
    successful_proxies = [p[0] for p in working_proxies_with_latency]

    # 清除进度条输出,换行
    print("\n")
    return successful_proxies

if __name__ == '__main__':
    start_time = time.time()
    
    # 0. 获取客户端的真实IP用于匿名性对比
    print("正在获取您的真实IP地址用于匿名性对比...")
    real_ip = get_real_ip()
    if not real_ip:
        print("❌ 警告:无法获取真实IP,将跳过匿名性检查,代理质量可能降低。")
        real_ip = '0.0.0.0' # 使用一个备用值
    else:
        print(f"✅ 您的真实IP地址是: {real_ip}")
        
    # 1. 获取代理列表
    proxy_list = fetch_proxies(PROXY_URL)
    
    if not proxy_list:
        print("程序终止,未能获取到代理列表。")
    else:
        # 输出更新后的速度限制
        print(f"开始测试 {len(proxy_list)} 个代理 (要求匿名性, 速度 < {MAX_LATENCY:.1f}s, 目标: {FINAL_CONNECTIVITY_TARGET}),并发数:{MAX_WORKERS}...")
        
        # 2. 批量测试
        successful_proxies = batch_check(proxy_list, real_ip)
        
        end_time = time.time()
        
        # 3. 结果总结和保存
        print("\n--- 结果总结 ---")
        print(f"总耗时:{end_time - start_time:.2f} 秒")
        print(f"总代理数:{len(proxy_list)}")
        print(f"可用(高匿/匿名/快速)代理数:{len(successful_proxies)}")
        if len(proxy_list) > 0:
            print(f"成功率:{len(successful_proxies)/len(proxy_list)*100:.2f}%")
        
        output_file = 'working_socks5_proxies.txt'
        with open(output_file, 'w') as f:
            f.write('\n'.join(successful_proxies))
        print(f"\n✅ 可用代理已保存到文件:{output_file} (已按延迟排序,最快在前)")

执行前请检查版本,安装必须库

检查 Python 版本#

python3 --version

检查 pip(Python 包管理器)版本#

pip3 --version

如果提示命令不存在需要执行:

sudo apt update
sudo apt install python3 python3-pip -y

然后安装虚拟环境工具包

sudo apt update
sudo apt install python3-venv -y

进入主目录创建虚拟环境

cd ~
python3 -m venv proxy_venv

激活进入环境(激活后 root 前面带 (proxy_venv))

source proxy_venv/bin/activate

在环境中安装库

pip install requests

安装后在环境内执行脚本

python proxy_test.py
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。