Phân Tích Kỹ Thuật

Các chế độ tiện ích quay vòng của Cloudflare: Được quản lý, Không tương tác, Vô hình

Cloudflare Turnstile cung cấp ba chế độ tiện ích kiểm soát cách đưa ra các thử thách: được quản lý (Cloudflare quyết định), không tương tác (chỉ bằng chứng công việc, không bao giờ hiển thị giao diện người dùng) và ẩn hình (không có hộp chứa tiện ích, chạy im lặng). Chế độ này xác định những gì người dùng nhìn thấy, thời gian thực hiện thử thách và liệu tiện ích có hiển thị hay không. Để tự động hóa, cả ba chế độ đều tạo ra cùng một đầu ra — mã thông báo cf-turnstile-response — nhưng việc phát hiện và giải quyết chúng đòi hỏi phải hiểu được sự khác biệt.


So sánh chế độ

tính năng Được quản lý Không tương tác Vô hình
Có thể nhìn thấy tiện ích? Đôi khi Không bao giờ (chỉ vòng quay) không bao giờ
Yêu cầu phần tử vùng chứa? Có (ẩn)
Cần có sự tương tác của người dùng? Đôi khi (hộp kiểm) Không Không
Thử thách bằng chứng công việc? Có (có thể leo thang) Có (luôn luôn) Có (luôn luôn)
Dự phòng hộp kiểm tương tác? Không (thay vào đó là thất bại) Không (thay vào đó là thất bại)
Đầu ra mã thông báo cf-turnstile-response cf-turnstile-response cf-turnstile-response
Phương pháp CaptchaAI turnstile turnstile turnstile
Được đề xuất cho Đăng nhập, đăng ký Dạng ma sát thấp Xác minh lý lịch

Chế độ được quản lý (mặc định)

Chế độ được quản lý cho phép Cloudflare quyết định mức độ thử thách cho mỗi khách truy cập. Hầu hết người dùng đều vượt qua một cách vô hình. Lưu lượng truy cập đáng ngờ nhìn thấy hộp kiểm. Lưu lượng truy cập có mức độ đáng ngờ cao có thể gặp phải thách thức phức tạp hơn.

Thực hiện

<!-- Managed mode (default) -->
<div class="cf-turnstile"
     data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
     data-theme="light">
</div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>

Tự động hóa nhìn thấy gì

Chế độ được quản lý điều chỉnh dựa trên tín hiệu của người yêu cầu:

Danh tiếng Widget hiển thị dưới dạng
Độ tin cậy cao Pass vô hình (không có giao diện người dùng hiển thị)
Độ tin cậy trung bình Tiện ích hộp kiểm (bấm vào để xác minh)
Độ tin cậy thấp Thử thách hoặc chặn tương tác

Đối với tự động hóa, chế độ được quản lý là chế độ phổ biến nhất và có nhiều biến đổi nhất. Tiện ích có thể hiển thị hoặc không tùy thuộc vào tín hiệu của trình duyệt.

Phát hiện trong HTML

def is_managed_mode(html):
    """Check if Turnstile is using managed mode (default)."""
    # Managed mode is the default — no explicit mode attribute
    has_turnstile = "cf-turnstile" in html
    has_explicit_mode = 'data-appearance="interaction-only"' in html or \
                        'data-appearance="always"' in html or \
                        'appearance: "interaction-only"' in html
    return has_turnstile and not has_explicit_mode

Chế độ không tương tác

Chế độ không tương tác không bao giờ hiển thị hộp kiểm hoặc phần tử tương tác. Nó chạy thử thách bằng chứng công việc ở chế độ nền và chỉ hiển thị một vòng quay đang tải. Nếu thử thách không thể hoàn thành mà không có tính tương tác thì thử thách đó sẽ thất bại thay vì leo thang.

Thực hiện

<!-- Non-interactive mode -->
<div class="cf-turnstile"
     data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
     data-appearance="interaction-only">
</div>

Hoặc thông qua API JavaScript:

turnstile.render('#turnstile-container', {
    sitekey: '0x4AAAAAAAC3DHQhMMQ_Rxrg',
    appearance: 'interaction-only',
    callback: function(token) {
        document.getElementById('cf-turnstile-response').value = token;
    },
});

Hành vi

Page loads → Widget initializes
    ↓
Background proof-of-work runs
    ↓
Success → Token generated (no visible UI)
    OR
Failure → Widget reports error (no fallback to checkbox)

Khi các trang web sử dụng tính năng không tương tác

  • Biểu mẫu nhận xét và tiện ích phản hồi
  • Đăng ký bản tin
  • Hành động có giá trị thấp trong đó ma sát phải ở mức tối thiểu
  • Điểm cuối API có tính năng bảo vệ phía trình duyệt

Chế độ ẩn

Chế độ ẩn thực sự vô hình - không có phần tử vùng chứa nào xuất hiện trong chế độ xem. Tiện ích chạy khi tải trang (hoặc trình kích hoạt có lập trình) và tạo mã thông báo mà không có bất kỳ dấu hiệu trực quan nào.

Thực hiện

<!-- Invisible mode — container is hidden -->
<div id="turnstile-invisible"
     class="cf-turnstile"
     data-sitekey="0x4AAAAAAAC3DHQhMMQ_Rxrg"
     data-size="invisible">
</div>

Hoặc hoàn toàn thông qua JavaScript:

// Programmatic invisible Turnstile
turnstile.render('#hidden-container', {
    sitekey: '0x4AAAAAAAC3DHQhMMQ_Rxrg',
    size: 'invisible',
    callback: function(token) {
        // Token ready — submit form automatically
        submitForm(token);
    },
    'error-callback': function() {
        // Challenge failed
        console.error('Invisible Turnstile failed');
    },
});

Thử thách phát hiện

Cloudflare Turnstile vô hình khó phát hiện hơn vì thùng chứa không có kích thước hiển thị:

import re

def detect_invisible_turnstile(html):
    """Detect invisible Turnstile on a page."""
    indicators = {
        "script_loaded": "challenges.cloudflare.com/turnstile" in html,
        "size_invisible": 'data-size="invisible"' in html or
                          "size: 'invisible'" in html or
                          'size: "invisible"' in html,
        "api_render_call": "turnstile.render" in html,
        "response_field": "cf-turnstile-response" in html,
    }

    if indicators["script_loaded"] and indicators["size_invisible"]:
        return {"mode": "invisible", "confidence": "high"}
    elif indicators["script_loaded"] and indicators["api_render_call"]:
        return {"mode": "invisible_or_programmatic", "confidence": "medium"}
    elif indicators["response_field"]:
        return {"mode": "turnstile_present", "confidence": "low"}

    return {"mode": "none", "confidence": "high"}

Trích xuất sitekey trên tất cả các chế độ

Bất kể chế độ nào, cần có khóa trang web để giải quyết. Giải nén nó từ bất kỳ chế độ nào:

import re

def extract_turnstile_sitekey(html):
    """Extract Turnstile sitekey from page HTML (works for all modes)."""

    # Pattern 1: data-sitekey attribute in HTML
    match = re.search(r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', html)
    if match:
        return match.group(1)

    # Pattern 2: JavaScript render call
    match = re.search(r"sitekey:\s*['\"]([0-9x][A-Za-z0-9_-]+)['\"]", html)
    if match:
        return match.group(1)

    # Pattern 3: Turnstile config object
    match = re.search(r"siteKey['\"]?\s*[:=]\s*['\"]([0-9x][A-Za-z0-9_-]+)['\"]", html)
    if match:
        return match.group(1)

    return None

Giải quyết cả ba chế độ với CaptchaAI

Tất cả ba chế độ Turnstile đều được giải quyết giống hệt với CaptchaAI. Chế độ này không ảnh hưởng đến lệnh gọi API:

Python

import requests
import time

API_KEY = "YOUR_API_KEY"

def solve_turnstile(sitekey, page_url):
    """Solve any Turnstile mode — managed, non-interactive, or invisible."""
    submit = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "turnstile",
        "sitekey": sitekey,
        "pageurl": page_url,
        "json": 1,
    })

    task_id = submit.json()["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        }).json()

        if result.get("status") == 1:
            return result["request"]

    raise TimeoutError("Turnstile solve timed out")

# Use with any mode
token = solve_turnstile("0x4AAAAAAAC3DHQhMMQ_Rxrg", "https://staging.example.com/qa-login")
print(f"Token: {token[:50]}...")

Node.js

const axios = require("axios");

const API_KEY = "YOUR_API_KEY";

async function solveTurnstile(sitekey, pageUrl) {
  const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: {
      key: API_KEY,
      method: "turnstile",
      sitekey,
      pageurl: pageUrl,
      json: 1,
    },
  });

  const taskId = submit.data.request;

  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));

    const result = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: taskId, json: 1 },
    });

    if (result.data.status === 1) {
      return result.data.request;
    }
  }

  throw new Error("Turnstile solve timed out");
}

// Same function works for all Turnstile modes
solveTurnstile("0x4AAAAAAAC3DHQhMMQ_Rxrg", "https://staging.example.com/qa-login")
  .then((token) => console.log("Token:", token.substring(0, 50)));

Khắc phục sự cố

Triệu chứng nguyên nhân sửa chữa
Mã thông báo hợp lệ nhưng biểu mẫu từ chối nó Khóa trang web sai (khác với tiện ích hiển thị) Kiểm tra khóa trang web được hiển thị bằng JavaScript
Không tìm thấy tiện ích trong HTML Chế độ ẩn được tải sau lần hiển thị đầu tiên Đợi tải toàn bộ trang, kiểm tra phản hồi XHR
Nhiều tiện ích Turnstile trên trang Các khóa trang web khác nhau cho các hình thức khác nhau Khớp khóa trang web với biểu mẫu cụ thể
data-size="compact" phát hiện nhầm lẫn Nhỏ gọn là một biến thể kích thước, không phải là một chế độ Nhỏ gọn sử dụng chế độ được quản lý theo mặc định
Hiện tại thuộc tính data-action Thẻ hành động dành cho phân tích, không phải chế độ Bao gồm hành động trong giải quyết nếu được yêu cầu để xác thực
Mã thông báo hết hạn trước khi gửi Mã thông báo quay vòng hết hạn sau 300 giây Giải quyết ngay trước khi nộp

Câu hỏi thường gặp

Chế độ Turnstile có ảnh hưởng đến giải pháp của CaptchaAI không?

Không. CaptchaAI sử dụng cùng một phương pháp turnstile cho cả ba chế độ. Khóa trang web và URL trang là các thông số bắt buộc duy nhất. Chế độ không thay đổi định dạng mã thông báo hoặc luồng xác thực.

Làm cách nào để biết trang web sử dụng chế độ nào?

Kiểm tra HTML để tìm các thuộc tính data-appearance hoặc data-size. Nếu có data-size="invisible" thì đó là chế độ ẩn. Nếu có data-appearance="interaction-only" thì nó không tương tác. Nếu không được đặt thì đó là chế độ được quản lý (mặc định).

Một trang web có thể chuyển đổi chế độ một cách linh hoạt không?

Vâng. Một số trang web sử dụng chế độ được quản lý theo mặc định và chuyển sang chế độ không tương tác cho các trang hoặc phân đoạn người dùng cụ thể. Sitekey thường giữ nguyên. Luôn phát hiện lại chế độ trên điều hướng.

Sự khác biệt tỷ lệ thành công giữa các chế độ là gì?

CaptchaAI đạt tỷ lệ thành công 100% trên tất cả các chế độ Turnstile. Chế độ này chỉ ảnh hưởng đến hành vi của người dùng — thử thách ở cấp độ API giống hệt nhau.


Tóm tắt

Ba chế độ tiện ích của Cloudflare Turnstile — được quản lý, không tương tác và ẩn — kiểm soát trải nghiệm người dùng nhưng tạo ra cùng một mã thông báo cf-turnstile-response. Đối với tự động hóa, tất cả các chế độ đều được giải quyết giống nhau bằng cách sử dụngBộ giải cửa quay của CaptchaAIvới tỷ lệ thành công 100%. Sự khác biệt chính đối với nhà phát triển là khả năng phát hiện: chế độ được quản lý hiển thị HTML hiển thị, trong khi chế độ ẩn yêu cầu phân tích trang sâu hơn để tìm khóa trang web.

bài viết liên quan

Os comentários estão desativados para este artigo.