Kembali ke blog

Cara Menghindari Deteksi Cloudflare Saat Menggunakan Proxy

Cloudflare memblokir permintaan Anda melalui proxy? Kami membahas metode teknis untuk menghindari deteksi: dari pengaturan TLS yang benar hingga penggunaan browser headless dengan contoh nyata.

📅17 Desember 2025
```html

7 cara teruji untuk melewati deteksi Cloudflare saat bekerja melalui proxy

Cloudflare memproses lebih dari 20% dari seluruh lalu lintas web dan menggunakan sistem perlindungan multi-level terhadap bot. Saat bekerja melalui server proxy, kemungkinan untuk mendapatkan captcha atau pemblokiran meningkat secara signifikan. Dalam panduan ini, kita akan membahas aspek teknis deteksi dan metode praktis untuk melewatinya yang berfungsi pada tahun 2024.

Bagaimana Cloudflare mendeteksi proxy dan bot

Cloudflare menggunakan sistem analisis komprehensif yang memeriksa puluhan parameter dari setiap permintaan. Memahami mekanisme deteksi adalah langkah pertama untuk berhasil melewati perlindungan.

Metode deteksi utama

TLS Fingerprinting: Cloudflare menganalisis parameter handshake SSL/TLS (cipher suites, ekstensi, urutan mereka). Setiap klien HTTP memiliki "sidik jari" yang unik. Misalnya, Python requests menggunakan OpenSSL dengan set cipher yang khas, yang mudah dibedakan dari Chrome atau Firefox.

Saat menganalisis permintaan, Cloudflare mencocokkan TLS fingerprint dengan User-Agent yang dinyatakan. Jika Anda menyebutkan Chrome 120, tetapi parameter TLS sesuai dengan Python requests — ini adalah deteksi bot yang instan.

Parameter pemeriksaan Apa yang dianalisis Risiko deteksi
TLS fingerprint Cipher suites, ekstensi, versi TLS Tinggi
HTTP/2 fingerprint Urutan header, frame SETTINGS Tinggi
Reputasi IP Riwayat IP, afiliasi dengan pusat data Sedang
Tantangan JavaScript Eksekusi JS, canvas fingerprint, WebGL Tinggi
Analisis perilaku Polanya permintaan, timing, gerakan mouse Sedang

Sejak 2023, Cloudflare secara aktif menggunakan pembelajaran mesin untuk menganalisis pola perilaku. Sistem ini tidak hanya melacak parameter teknis, tetapi juga interval waktu antara permintaan, urutan tindakan pengguna, gerakan mouse, dan scroll halaman.

Menyamarkan TLS fingerprint

TLS fingerprinting adalah metode deteksi bot yang paling efektif. Klien HTTP standar (requests, curl, axios) menghasilkan fingerprint yang tidak dapat dibedakan dari browser nyata. Solusinya adalah menggunakan pustaka khusus yang meniru perilaku TLS browser.

Menggunakan curl-impersonate

Pustaka curl-impersonate adalah versi modifikasi dari curl yang meniru dengan tepat TLS dan HTTP/2 fingerprints dari browser populer. Mendukung Chrome, Firefox, Safari, dan Edge.

# Instalasi curl-impersonate
git clone https://github.com/lwthiker/curl-impersonate
cd curl-impersonate
make chrome-build

# Menggunakan dengan meniru Chrome 120
curl_chrome120 -x http://username:password@proxy.example.com:8080 \
  -H "Accept-Language: en-US,en;q=0.9" \
  https://example.com

Python: pustaka tls-client

Untuk Python, ada pembungkus tls-client yang menggunakan curl-impersonate di belakang layar dan menyediakan antarmuka yang mirip dengan requests.

import tls_client

# Membuat sesi dengan fingerprint Chrome 120
session = tls_client.Session(
    client_identifier="chrome_120",
    random_tls_extension_order=True
)

# Mengatur proxy
proxies = {
    'http': 'http://username:password@proxy.example.com:8080',
    'https': 'http://username:password@proxy.example.com:8080'
}

# Melakukan permintaan
response = session.get(
    'https://example.com',
    proxies=proxies,
    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'DNT': '1',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
    }
)

print(response.status_code)

Penting: Saat menggunakan tls-client, sangat penting agar User-Agent dalam header sesuai dengan client_identifier yang dipilih. Ketidaksesuaian akan menyebabkan deteksi instan.

Memeriksa TLS fingerprint

Sebelum memulai pengambilan data, disarankan untuk memeriksa TLS fingerprint Anda. Gunakan layanan tls.peet.ws atau ja3er.com untuk analisis.

# Memeriksa fingerprint
response = session.get('https://tls.peet.ws/api/all')
print(response.json()['tls']['ja3'])

# Bandingkan dengan fingerprint Chrome nyata:
# https://kawayiyi.com/tls-fingerprint-database/

Pengaturan HTTP header yang benar

Bahkan dengan TLS fingerprint yang benar, HTTP header yang salah akan mengungkapkan bot. Cloudflare menganalisis tidak hanya keberadaan header, tetapi juga urutan, format nilai, dan konsistensi logis.

Header wajib untuk Chrome

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.9',
    'Accept-Encoding': 'gzip, deflate, br',
    'DNT': '1',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'none',
    'Sec-Fetch-User': '?1',
    'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
    'Sec-Ch-Ua-Mobile': '?0',
    'Sec-Ch-Ua-Platform': '"Windows"',
    'Cache-Control': 'max-age=0'
}

Header Sec-Ch-Ua-* muncul di Chrome 89 dan merupakan bagian dari Client Hints API. Ketidakhadirannya saat menggunakan User-Agent modern adalah tanda jelas bot.

Urutan header itu penting

Di HTTP/2, urutan header tetap untuk setiap browser. Python requests dan klien standar lainnya mengirimkan header dalam urutan alfabetis, yang berbeda dari perilaku browser. Gunakan pustaka yang mendukung urutan header kustom.

Tip: Gunakan DevTools browser (tab Jaringan → klik kanan pada permintaan → Salin → Salin sebagai cURL) untuk mendapatkan salinan header yang tepat dari browser nyata. Kemudian sesuaikan dengan kode Anda.

Generasi dinamis User-Agent

Menggunakan User-Agent yang sama untuk semua permintaan meningkatkan risiko deteksi. Buat kumpulan User-Agent yang relevan dan rotasi mereka.

import random

# Kumpulan User-Agent yang relevan (Desember 2024)
USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
]

def get_random_headers():
    ua = random.choice(USER_AGENTS)
    
    # Penyesuaian header lain sesuai dengan UA yang dipilih
    if 'Chrome' in ua:
        return {
            'User-Agent': ua,
            'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120"',
            # ... header Chrome lainnya
        }
    elif 'Firefox' in ua:
        return {
            'User-Agent': ua,
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            # ... header Firefox
        }
    # ... penanganan browser lainnya

Menggunakan browser headless

Ketika Cloudflare menggunakan tantangan JavaScript atau deteksi canggih, satu-satunya cara yang dapat diandalkan untuk melewati adalah dengan menggunakan browser nyata. Browser headless secara otomatis menangani JavaScript, cookies, dan menghasilkan fingerprint yang sepenuhnya autentik.

Playwright dengan patch anti-detect

Playwright adalah alternatif modern untuk Selenium dengan kinerja yang lebih baik. Namun, Playwright standar mudah terdeteksi melalui navigator.webdriver dan marker lainnya. Gunakan playwright-stealth untuk menyamarkan.

from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync

def bypass_cloudflare(url, proxy):
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=True,
            proxy={
                "server": f"http://{proxy['host']}:{proxy['port']}",
                "username": proxy['username'],
                "password": proxy['password']
            },
            args=[
                '--disable-blink-features=AutomationControlled',
                '--disable-dev-shm-usage',
                '--no-sandbox'
            ]
        )
        
        context = browser.new_context(
            viewport={'width': 1920, 'height': 1080},
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            locale='en-US',
            timezone_id='America/New_York'
        )
        
        page = context.new_page()
        stealth_sync(page)  # Menerapkan patch anti-detect
        
        # Mengunjungi halaman
        page.goto(url, wait_until='networkidle', timeout=30000)
        
        # Menunggu melewati tantangan Cloudflare (biasanya 5-10 detik)
        page.wait_for_timeout(8000)
        
        # Memeriksa keberhasilan bypass
        if 'Just a moment' in page.content():
            print('Tantangan Cloudflare tidak terlewati')
            return None
        
        # Mengambil cookies untuk penggunaan selanjutnya
        cookies = context.cookies()
        html = page.content()
        
        browser.close()
        return {'html': html, 'cookies': cookies}

# Penggunaan
proxy_config = {
    'host': 'proxy.example.com',
    'port': 8080,
    'username': 'user',
    'password': 'pass'
}

result = bypass_cloudflare('https://example.com', proxy_config)

Puppeteer Extra dengan plugin

Untuk ekosistem Node.js, solusi terbaik adalah puppeteer-extra dengan plugin puppeteer-extra-plugin-stealth. Plugin ini menerapkan lebih dari 30 teknik penyamaran otomatisasi yang berbeda.

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

puppeteer.use(StealthPlugin());

async function bypassCloudflare(url, proxyUrl) {
    const browser = await puppeteer.launch({
        headless: 'new',
        args: [
            `--proxy-server=${proxyUrl}`,
            '--disable-blink-features=AutomationControlled',
            '--window-size=1920,1080'
        ]
    });
    
    const page = await browser.newPage();
    
    // Mengatur viewport dan user-agent
    await page.setViewport({ width: 1920, height: 1080 });
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
    
    // Menghapus navigator.webdriver
    await page.evaluateOnNewDocument(() => {
        delete Object.getPrototypeOf(navigator).webdriver;
    });
    
    // Mengunjungi halaman
    await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
    
    // Menunggu melewati tantangan
    await page.waitForTimeout(8000);
    
    // Mengambil konten dan cookies
    const content = await page.content();
    const cookies = await page.cookies();
    
    await browser.close();
    
    return { content, cookies };
}

// Contoh penggunaan
bypassCloudflare('https://example.com', 'http://user:pass@proxy.example.com:8080')
    .then(result => console.log('Sukses'))
    .catch(err => console.error(err));

Kinerja: Browser headless mengkonsumsi sumber daya yang jauh lebih besar (200-500 MB RAM per instance). Untuk tugas dengan beban tinggi, gunakan mereka hanya untuk mendapatkan cookies, kemudian beralih ke klien HTTP dengan cookies tersebut.

Memilih jenis proxy untuk bypass Cloudflare

Jenis proxy secara kritis mempengaruhi keberhasilan bypass. Cloudflare memiliki basis data IP alamat pusat data dan menerapkan aturan pemeriksaan yang lebih ketat.

Jenis proxy Kemungkinan bypass Kecepatan Biaya Rekomendasi
Datacenter 30-40% Tinggi Rendah Hanya dengan browser headless
Residential 85-95% Sedang Tinggi Pilihan optimal
Mobile 90-98% Sedang Sangat tinggi Untuk tugas kritis
ISP (Static Residential) 80-90% Tinggi Sedang Keseimbangan harga dan kualitas

Mengapa proxy residential lebih efektif

Proxy residential menggunakan alamat IP dari perangkat nyata (router rumah, smartphone). Cloudflare tidak dapat memblokir IP ini secara massal karena akan memblokir pengguna biasa. Statistik menunjukkan bahwa IP residential mendapatkan captcha 15-20 kali lebih jarang dibandingkan dengan pusat data.

Saat bekerja dengan proxy residential, geolokasi sangat penting. Jika situs target berorientasi pada AS, menggunakan proxy dari Asia akan meningkatkan kecurigaan. Pilih penyedia dengan jangkauan geografis yang luas dan kemampuan penargetan berdasarkan kota.

Proxy mobile untuk keandalan maksimum

Proxy mobile menggunakan alamat IP dari operator seluler (4G/5G). Ciri khas jaringan seluler adalah pergantian IP yang dinamis melalui mode pesawat, yang memberikan jumlah IP bersih yang hampir tidak terbatas. Kemungkinan pemblokiran IP mobile mendekati nol.

# Contoh rotasi IP mobile melalui API
import requests
import time

def rotate_mobile_ip(proxy_api_url):
    """Mengganti IP proxy mobile"""
    response = requests.get(f"{proxy_api_url}/rotate")
    if response.status_code == 200:
        print("IP berhasil diubah")
        time.sleep(5)  # Menunggu penerapan perubahan
        return True
    return False

# Penggunaan dengan proxy mobile
mobile_proxy = "http://user:pass@mobile.proxy.com:8080"

for i in range(10):
    # Melakukan permintaan
    response = requests.get(
        'https://example.com',
        proxies={'http': mobile_proxy, 'https': mobile_proxy}
    )
    
    # Rotasi IP setelah setiap permintaan
    rotate_mobile_ip('https://api.proxy.com/mobile')

Mengelola cookies dan sesi

Setelah berhasil melewati tantangan Cloudflare, server mengatur cookies (cf_clearance, __cfduid, dan lainnya) yang mengonfirmasi legitimasi klien. Mengelola cookies ini dengan benar memungkinkan untuk menghindari pemeriksaan ulang.

Mengambil dan menggunakan kembali cf_clearance

Cookie cf_clearance biasanya berlaku selama 30-60 menit. Setelah diterima melalui browser headless, cookie ini dapat digunakan dalam permintaan HTTP biasa.

import requests
import pickle
from datetime import datetime, timedelta

class CloudflareCookieManager:
    def __init__(self, cookie_file='cf_cookies.pkl'):
        self.cookie_file = cookie_file
        self.cookies = self.load_cookies()
    
    def load_cookies(self):
        """Memuat cookies yang disimpan"""
        try:
            with open(self.cookie_file, 'rb') as f:
                data = pickle.load(f)
                # Memeriksa masa berlaku
                if data['expires'] > datetime.now():
                    return data['cookies']
        except FileNotFoundError:
            pass
        return None
    
    def save_cookies(self, cookies, ttl_minutes=30):
        """Menyimpan cookies dengan TTL"""
        data = {
            'cookies': cookies,
            'expires': datetime.now() + timedelta(minutes=ttl_minutes)
        }
        with open(self.cookie_file, 'wb') as f:
            pickle.dump(data, f)
    
    def get_cf_clearance(self, url, proxy):
        """Mendapatkan cf_clearance melalui browser"""
        if self.cookies:
            return self.cookies
        
        # Di sini kode untuk menjalankan browser (dari bagian sebelumnya)
        # ...
        browser_cookies = bypass_cloudflare(url, proxy)['cookies']
        
        # Mengonversi ke format requests
        cookies_dict = {c['name']: c['value'] for c in browser_cookies}
        self.save_cookies(cookies_dict)
        self.cookies = cookies_dict
        
        return cookies_dict
    
    def make_request(self, url, proxy):
        """Permintaan dengan pengelolaan cookies otomatis"""
        cookies = self.get_cf_clearance(url, proxy)
        
        response = requests.get(
            url,
            cookies=cookies,
            proxies={'http': proxy, 'https': proxy},
            headers=get_random_headers()
        )
        
        # Jika mendapatkan tantangan lagi — perbarui cookies
        if response.status_code == 403 or 'cf-browser-verification' in response.text:
            print("Cookies sudah kadaluarsa, mendapatkan yang baru...")
            self.cookies = None
            return self.make_request(url, proxy)
        
        return response

# Penggunaan
manager = CloudflareCookieManager()
response = manager.make_request(
    'https://example.com/api/data',
    'http://user:pass@proxy.example.com:8080'
)

Mengikat cookies ke alamat IP

Cloudflare mengikat cf_clearance ke alamat IP dari mana tantangan dilalui. Menggunakan cookie ini dari IP lain akan menyebabkan pemblokiran. Saat bekerja dengan proxy yang berotasi, perlu menyimpan set cookies terpisah untuk setiap IP.

import hashlib

class IPBoundCookieManager:
    def __init__(self):
        self.cookies_by_ip = {}
    
    def get_ip_hash(self, proxy_url):
        """Membuat hash untuk identifikasi proxy"""
        return hashlib.md5(proxy_url.encode()).hexdigest()
    
    def get_cookies_for_proxy(self, proxy_url, target_url):
        """Mendapatkan cookies untuk proxy tertentu"""
        ip_hash = self.get_ip_hash(proxy_url)
        
        if ip_hash in self.cookies_by_ip:
            cookies_data = self.cookies_by_ip[ip_hash]
            if cookies_data['expires'] > datetime.now():
                return cookies_data['cookies']
        
        # Mendapatkan cookies baru melalui browser
        new_cookies = self.fetch_cookies_with_browser(target_url, proxy_url)
        
        self.cookies_by_ip[ip_hash] = {
            'cookies': new_cookies,
            'expires': datetime.now() + timedelta(minutes=30)
        }
        
        return new_cookies

Rotasi proxy dan kontrol frekuensi permintaan

Bahkan dengan tumpukan teknis yang benar, frekuensi permintaan yang terlalu tinggi dari satu IP akan memicu rate limiting. Cloudflare menganalisis pola lalu lintas dan mendeteksi aktivitas yang tidak normal.

Strategi rotasi proxy

Ada tiga pendekatan utama untuk rotasi: round-robin (berurutan), random (acak), dan sticky sessions (ikatan ke sesi). Untuk melewati Cloudflare, strategi sticky sessions dengan pembatasan permintaan per IP adalah yang paling optimal.

import time
import random
from collections import defaultdict
from datetime import datetime, timedelta

class SmartProxyRotator:
    def __init__(self, proxy_list, max_requests_per_ip=20, cooldown_minutes=10):
        self.proxy_list = proxy_list
        self.max_requests_per_ip = max_requests_per_ip
        self.cooldown_minutes = cooldown_minutes
        
        # Penghitung penggunaan
        self.usage_count = defaultdict(int)
        self.last_used = {}
        self.cooldown_until = {}
    
    def get_proxy(self):
        """Mendapatkan proxy berikutnya yang tersedia"""
        available_proxies = []
        
        for proxy in self.proxy_list:
            # Memeriksa cooldown
            if proxy in self.cooldown_until:
                if datetime.now() < self.cooldown_until[proxy]:
                    continue
                else:
                    # Mereset penghitung setelah cooldown
                    self.usage_count[proxy] = 0
                    del self.cooldown_until[proxy]
            
            # Memeriksa batas permintaan
            if self.usage_count[proxy] < self.max_requests_per_ip:
                available_proxies.append(proxy)
        
        if not available_proxies:
            # Jika semua proxy dalam cooldown — tunggu
            wait_time = min(
                (self.cooldown_until[p] - datetime.now()).total_seconds()
                for p in self.cooldown_until
            )
            print(f"Semua proxy dalam cooldown. Menunggu {wait_time:.0f} detik...")
            time.sleep(wait_time + 1)
            return self.get_proxy()
        
        # Memilih proxy dengan penggunaan terendah
        proxy = min(available_proxies, key=lambda p: self.usage_count[p])
        
        self.usage_count[proxy] += 1
        self.last_used[proxy] = datetime.now()
        
        # Mengatur cooldown saat mencapai batas
        if self.usage_count[proxy] >= self.max_requests_per_ip:
            self.cooldown_until[proxy] = datetime.now() + timedelta(
                minutes=self.cooldown_minutes
            )
            print(f"Proxy {proxy} telah mencapai batas. Cooldown {self.cooldown_minutes} menit.")
        
        return proxy
    
    def add_delay(self):
        """Penundaan acak antara permintaan (meniru manusia)"""
        delay = random.uniform(2, 5)  # 2-5 detik
        time.sleep(delay)

# Penggunaan
proxy_pool = [
    'http://user:pass@proxy1.example.com:8080',
    'http://user:pass@proxy2.example.com:8080',
    'http://user:pass@proxy3.example.com:8080',
    # ... hingga 50-100 proxy untuk operasi yang stabil
]

rotator = SmartProxyRotator(
    proxy_pool,
    max_requests_per_ip=15,  # Nilai konservatif
    cooldown_minutes=15
)

# Melakukan permintaan
for i in range(1000):
    proxy = rotator.get_proxy()
    
    response = requests.get(
        'https://example.com/page',
        proxies={'http': proxy, 'https': proxy},
        headers=get_random_headers()
    )
    
    print(f"Permintaan {i+1}: {response.status_code}")
    rotator.add_delay()

Adaptive rate limiting

Pendekatan yang lebih maju adalah penyesuaian dinamis frekuensi permintaan berdasarkan respons server. Jika mulai muncul kesalahan 429 atau captcha, secara otomatis kurangi tempo.

class AdaptiveRateLimiter:
    def __init__(self, initial_delay=3.0):
        self.delay = initial_delay
        self.min_delay = 1.0
        self.max_delay = 30.0
        self.success_streak = 0
        self.failure_streak = 0
    
    def on_success(self):
        """Permintaan berhasil — bisa mempercepat"""
        self.success_streak += 1
        self.failure_streak = 0
        
        if self.success_streak >= 10:
            # Mengurangi penundaan sebesar 10%
            self.delay = max(self.min_delay, self.delay * 0.9)
            self.success_streak = 0
    
    def on_failure(self, status_code):
        """Kesalahan — melambat"""
        self.failure_streak += 1
        self.success_streak = 0
        
        if status_code == 429:  # Rate limit
            # Melambat secara agresif
            self.delay = min(self.max_delay, self.delay * 2.0)
        elif status_code == 403:  # Kemungkinan pemblokiran
            self.delay = min(self.max_delay, self.delay * 1.5)
        
        print(f"Penundaan meningkat menjadi {self.delay:.2f}s")
    
    def wait(self):
        """Menunggu sebelum permintaan berikutnya"""
        # Menambahkan kebetulan ±20%
        actual_delay = self.delay * random.uniform(0.8, 1.2)
        time.sleep(actual_delay)

Alat dan pustaka siap pakai untuk bypass

Mengembangkan solusi sendiri dari nol membutuhkan waktu dan keahlian. Ada alat siap pakai yang mengotomatiskan proses bypass Cloudflare.

cloudscraper (Python)

Pustaka cloudscraper adalah lapisan di atas requests yang secara otomatis menyelesaikan tantangan JavaScript. Bekerja dengan perlindungan dasar, tetapi mungkin tidak dapat menangani pemeriksaan yang lebih canggih.

import cloudscraper

# Membuat scraper dengan dukungan proxy
scraper = cloudscraper.create_scraper(
    browser={
        'browser': 'chrome',
        'platform': 'windows',
        'desktop': True
    }
)

# Mengatur proxy
proxies = {
    'http': 'http://user:pass@proxy.example.com:8080',
    'https': 'http://user:pass@proxy.example.com:8080'
}

# Melakukan permintaan
response = scraper.get('https://example.com', proxies=proxies)

if response.status_code == 200:
    print("BYPASS berhasil")
    print(response.text)
else:
    print(f"Kesalahan: {response.status_code}")

FlareSolverr (universal)

FlareSolverr adalah server proxy yang menjalankan browser headless untuk menyelesaikan tantangan Cloudflare. Bekerja melalui API HTTP, mendukung bahasa pemrograman apa pun.

# Menjalankan FlareSolverr melalui Docker
docker run -d \
  --name=flaresolverr \
  -p 8191:8191 \
  -e LOG_LEVEL=info \
  ghcr.io/flaresolverr/flaresolverr:latest

# Penggunaan dari Python
import requests

def solve_cloudflare(url, proxy=None):
    flaresolverr_url = "http://localhost:8191/v1"
    
    payload = {
        "cmd": "request.get",
        "url": url,
        "maxTimeout": 60000
    }
    
    if proxy:
        payload["proxy"] = {
            "url": proxy
        }
    
    response = requests.post(flaresolverr_url, json=payload)
    result = response.json()
    
    if result['status'] == 'ok':
        return {
            'html': result['solution']['response'],
            'cookies': result['solution']['cookies'],
            'user_agent': result['solution']['userAgent']
        }
    else:
        raise Exception(f"Kesalahan FlareSolverr: {result['message']}")

# Contoh penggunaan
result = solve_cloudflare(
    'https://example.com',
    proxy='http://user:pass@proxy.example.com:8080'
)

print(result['html'])

undetected-chromedriver

Versi patch dari Selenium ChromeDriver yang secara otomatis menerapkan banyak teknik anti-detect. Lebih mudah digunakan daripada Playwright, tetapi kurang fleksibel.

import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def bypass_with_uc(url, proxy):
    options = uc.ChromeOptions()
    options.add_argument(f'--proxy-server={proxy}')
    options.add_argument('--disable-blink-features=AutomationControlled')
    
    driver = uc.Chrome(options=options, version_main=120)
    
    try:
        driver.get(url)
        
        # Menunggu tantangan Cloudflare hilang
        WebDriverWait(driver, 20).until_not(
            EC.presence_of_element_located((By.ID, "cf-spinner-please-wait"))
        )
        
        # Penantian tambahan untuk keandalan
        time.sleep(3)
        
        # Mengambil hasil
        html = driver.page_source
        cookies = driver.get_cookies()
        
        return {'html': html, 'cookies': cookies}
    
    finally:
        driver.quit()

# Penggunaan
result = bypass_with_uc(
    'https://example.com',
    'http://user:pass@proxy.example.com:8080'
)

Pendekatan gabungan: Strategi optimal adalah menggunakan browser headless hanya untuk mendapatkan cookies awal, kemudian beralih ke klien HTTP (tls-client, cloudscraper) dengan cookies tersebut. Ini memberikan keseimbangan antara keandalan dan kinerja.

Kesimpulan

Melewati Cloudflare saat bekerja melalui proxy membutuhkan pendekatan komprehensif: fingerprint TLS yang benar, header HTTP yang autentik, proxy berkualitas, dan pengelolaan sesi yang cermat. Rekomendasi kunci:

  • Gunakan proxy residential atau proxy mobile daripada pusat data
  • Gunakan pustaka dengan fingerprint TLS yang benar (tls-client, curl-impersonate)
  • Untuk kasus yang kompleks, gunakan browser headless dengan patch anti-detect
  • Simpan dan gunakan kembali cookies cf_clearance
  • Rotasi proxy dengan mempertimbangkan rate limiting (tidak lebih dari 15-20 permintaan per IP)
  • Tambahkan penundaan acak antara permintaan (2-5 detik)

Perlindungan Cloudflare terus berkembang, jadi penting untuk secara teratur memperbarui alat dan menyesuaikan strategi. Pantau perubahan dalam teknik fingerprinting dan uji solusi pada versi perlindungan yang terbaru.

Untuk operasi yang stabil, disarankan untuk menggunakan layanan proxy profesional dengan kumpulan IP yang luas dan rotasi otomatis.

```