全部文章

如何用 Python 检测代理(分步教程)

一篇 Python 教程:调用代理检测 API,读取代理类型和置信度分数,并据此拦截请求,附带可复用函数、缓存方案和 Flask 示例。

2026年3月26日阅读约 3 分钟

这是一篇面向 Python 后端的代理检测实战教程。我们会把 代理检测 API 封装成一个可复用的函数,加上缓存,并根据结果拦截 Flask 路由。同样的思路在 Django、FastAPI 或普通脚本中也同样适用。

前置条件

你需要一个 API 密钥(免费版足以用于测试)以及 requests 库:

pip install requests

请把密钥保存在环境变量中,切勿写进源代码。

写代码之前先试一次代理查询

第一步:编写可复用的检测函数

import os
import requests

API_BASE = "https://ipscanner.io"
API_KEY = os.environ["IPSCANNER_API_KEY"]

def check_proxy(ip: str) -> dict:
    """Return {'is_proxy': bool, 'type': str|None, 'score': int}. Fails open."""
    try:
        resp = requests.get(
            f"{API_BASE}/v1/proxy/{ip}",
            headers={"Authorization": f"Bearer {API_KEY}"},
            timeout=3,
        )
        resp.raise_for_status()
        data = resp.json()
        return {
            "is_proxy": bool(data.get("proxy")),
            "type": data.get("type"),
            "score": data.get("score", 0),
        }
    except requests.RequestException:
        return {"is_proxy": False, "type": None, "score": 0}  # fail open

"fail open"(失败时放行)意味着即使检测服务出现故障,也不会把用户挡在门外。

第二步:获取真实的客户端 IP

在代理或负载均衡器之后,需要读取由你的基础设施设置的转发请求头:

def client_ip(request) -> str:
    xff = request.headers.get("X-Forwarded-For", "")
    if xff:
        return xff.split(",")[0].strip()  # left-most = original client
    return request.remote_addr

只有在你自己掌控的代理会设置该请求头时,才应该信任 X-Forwarded-For

第三步:拦截 Flask 路由

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.post("/signup")
def signup():
    ip = client_ip(request)
    result = check_proxy(ip)

    if result["score"] >= 70:
        return jsonify(error="This network requires verification."), 403
    if result["is_proxy"] or result["score"] >= 30:
        # add friction instead of blocking: require email/phone verification
        request.environ["require_verification"] = True

    # ...create the account...
    return jsonify(ok=True)

第四步:添加短期缓存

import time

_cache: dict[str, tuple[dict, float]] = {}

def check_proxy_cached(ip: str, ttl: int = 600) -> dict:
    hit = _cache.get(ip)
    if hit and hit[1] > time.time():
        return hit[0]
    value = check_proxy(ip)
    _cache[ip] = (value, time.time() + ttl)
    return value

TTL 应控制在几分钟级别:IP 风险会随时间变化,具体可参考 什么是 IP 信誉 一文。

进阶方向

  • 加入 VPN 检测,实现针对 VPN 的专门拦截。
  • 把多个信号整合成一个 IP 欺诈分数
  • 在登录和结账环节应用同一个函数,并按场景调整阈值。

结语

用 Python 检测代理其实只需一次 API 调用:解析出真实的客户端 IP,查询后根据类型和分数采取 行动。出错时保持放行,短期缓存结果,并在中等风险区间要求额外验证,而不是直接一刀切拦截。

常见问题

常见问题解答

只需要一个 HTTP 客户端,比如 requests(或 httpx)。调用代理检测 API 的接口,读取 JSON 响应即可,不需要任何专门的库。

相关文章