Scarnox · Blog

Headless browser detected: สาเหตุและวิธีแก้ (2026)

เว็บไซต์บางแห่งจะขึ้นข้อความ "headless browser detected" หรือเงียบ ๆ แสดงหน้าเว็บอีกแบบให้กับเบราว์เซอร์อัตโนมัติของคุณ เว็บไซต์ทำแบบนี้เพราะ headless browser ทำงานโดยไม่มีหน้าต่าง และมักต่างจากเบราว์เซอร์บนเดสก์ท็อปทั่วไปในรายละเอียดเล็ก ๆ ที่วัดได้ คู่มือนี้อธิบายว่าเว็บไซต์ดูสัญญาณอะไรบ้าง วิธีตรวจสอบว่าเบราว์เซอร์ของคุณเปิดเผยอะไรออกไป และแนวทางแก้ที่สมเหตุสมผลเป็นอย่างไร รวมถึงจุดที่คำตอบที่ถูกต้องคือการหยุด หรือการมองการตรวจสอบนั้นเป็นขั้นตอน captcha

ทำไมเว็บไซต์ถึงตรวจหา headless browser

เฟรมเวิร์ก automation ควบคุมเอนจินของเบราว์เซอร์จริง ดังนั้นส่วนใหญ่ของหน้าเว็บจึงทำงานเหมือนกัน ความต่างจะปรากฏที่ขอบ ๆ:

เว็บไซต์จะรวมสัญญาณเหล่านี้เป็นคะแนน คะแนนต่ำอาจหมายถึงการลดระดับการให้บริการแบบเงียบ ๆ ชุดการตรวจสอบเพิ่มเติม หรือการบล็อก

ขั้นตอนที่ 1: ดูว่าเบราว์เซอร์ของคุณเปิดเผยอะไรบ้าง

ก่อนเปลี่ยนแปลงอะไร ให้ดูว่าหน้าเว็บสามารถอ่านอะไรจาก automation ของคุณได้บ้าง สคริปต์ด้านล่างเปิดหน้าที่คุณควบคุมและพิมพ์สัญญาณที่สำคัญออกมา นี่คือเครื่องมือวินิจฉัย ใช้กับหน้าทดสอบของคุณเองเท่านั้น ไม่ใช่เพื่อตรวจสอบระบบของคนอื่น

from playwright.sync_api import sync_playwright

CHECK = """() => ({
    webdriver: navigator.webdriver,
    languages: navigator.languages,
    plugins: navigator.plugins.length,
    userAgent: navigator.userAgent,
    screen: [screen.width, screen.height],
    viewport: [window.innerWidth, window.innerHeight],
    timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
})"""

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com")  # เปลี่ยนเป็นหน้าที่คุณเป็นเจ้าของ
    print(page.evaluate(CHECK))
    browser.close()

รันสคริปต์เดิมด้วย headless=False แล้วเปรียบเทียบผลลัพธ์ทั้งสองชุด ความแตกต่างคือสิ่งที่เว็บไซต์อาจสังเกตเห็นได้

ขั้นตอนที่ 2: แก้ความไม่สอดคล้องกัน ไม่ใช่แค่ปิด flag

การซ่อน flag หนึ่งตัวแต่ปล่อย flag อื่นไว้ไม่เปลี่ยน เป็นความผิดพลาดที่พบบ่อยที่สุด User agent ที่บอกว่าเป็น Windows ในขณะที่ฟอนต์ เขตเวลา และขนาดหน้าจอบ่งบอกว่าเป็นเซิร์ฟเวอร์ Linux เป็นสัญญาณที่แรงกว่าคุณสมบัติเพียงตัวเดียว ให้มุ่งไปที่สภาพแวดล้อมที่สอดคล้องกันภายใน:

Playwright ให้คุณตั้งค่าหลายอย่างเหล่านี้ได้ในที่เดียว:

context = browser.new_context(
    locale="en-US",
    timezone_id="America/New_York",
    viewport={"width": 1366, "height": 768},
)
page = context.new_page()

ขั้นตอนที่ 3: ชะลอลงและทำตัวเหมือนผู้เข้าชมจริง

automation จะเห็นได้ชัดเมื่อทำงานเร็วกว่าที่คนจะทำได้ ให้เพิ่มช่วงหยุดที่สมจริงระหว่างการโหลดหน้า หลีกเลี่ยงการคลิกองค์ประกอบเดิมด้วยจังหวะที่สม่ำเสมอเป๊ะ และอย่าเปิดหลายร้อยหน้าพร้อมกันจากที่อยู่เดียว การส่ง request น้อยลงและช้าลงช่วยลดภาระให้เว็บไซต์ด้วย ซึ่งเป็นสิ่งที่ควรทำอยู่แล้ว

ขั้นตอนที่ 4: รู้ว่าเมื่อไรการตรวจสอบคือ captcha

การตรวจจับบางรูปแบบจบลงด้วยความท้าทาย ไม่ใช่การบล็อก คุณจะเห็น widget captcha และขั้นตอนนั้นต้องใช้ token จาก solver ปัจจุบัน captcha ประเภทที่ใช้งานได้จริงบน Scarnox คือ PopularCaptcha คู่มือ PopularCaptcha ด้วย Python แสดงวิธีขอและส่ง token ส่วน widget อื่น เช่น Cloudflare Turnstile อยู่ในแผนงานแต่ยังไม่พร้อมใช้งาน ดังนั้นให้ตรวจ ประเภทของ captcha ก่อนวางแผนรองรับ

การเจอขั้นตอน captcha ไม่ได้แปลว่าส่วนอื่นของระบบคุณถูกต้องแล้ว ถ้าเว็บไซต์เดิมบล็อกทุก headless session ไม่ว่าคุณจะตั้งค่าอย่างไร นั่นเป็นสัญญาณชัดเจนว่าเจ้าของไม่ต้องการให้เข้าถึงแบบอัตโนมัติ ให้เคารพสัญญาณนั้น

สิ่งที่ไม่ควรทำ

อย่าพยายามซ่อน automation จากเว็บไซต์ที่ห้ามไว้ และอย่าใช้เครื่องมือหลบการตรวจจับเพื่อผ่านระบบควบคุมการเข้าถึง นั่นเป็นโปรเจกต์คนละประเภทกับการทดสอบและการเก็บข้อมูลสาธารณะที่คู่มือนี้ครอบคลุม ถ้าโปรเจกต์ของคุณต้องการการเข้าถึงที่คุณยังไม่ได้รับอนุญาต ให้ถามเจ้าของเว็บไซต์ หรือมองหา API หรือ data feed อย่างเป็นทางการ

Scrape อย่างมีความรับผิดชอบ

แนวทางต่อจากนี้

ถ้า automation ของคุณใช้สำหรับ end-to-end test แนวทางจะต่างออกไป ดู captcha ในการทดสอบอัตโนมัติ หากคุณใช้ Playwright หรือ Puppeteer การจัดการ captcha ด้วย Playwright และ Puppeteer อธิบายว่า token ควรไปอยู่ตรงไหน

เริ่มต้นด้วยเครดิตทดลองใช้ฟรี ไม่ต้องใช้บัตรเครดิต: สร้างบัญชี แล้วทดสอบขั้นตอน PopularCaptcha บนหน้าของคุณเอง ดูอัตราค่าบริการปัจจุบันได้ที่ หน้าราคา

ขั้นตอนถัดไป