curl-impersonate คือ curl รุ่นบิลด์พิเศษที่สามารถเลียนแบบเว็บเบราว์เซอร์หลักอย่าง Chrome, Edge, Safari และ Firefox ได้
- ทำ TLS และ HTTP handshake ให้เหมือนกับเบราว์เซอร์จริง
- ใช้งานได้ทั้งเป็นเครื่องมือบรรทัดคำสั่งหรือผนวกรวมเป็นไลบรารี
- ความสำคัญ
- เมื่อ HTTP client เข้าถึงเว็บไซต์ที่ใช้ TLS จะมีการทำ TLS handshake และในกระบวนการนี้สามารถระบุลักษณะเฉพาะของไคลเอนต์ได้
curl-impersonate ทำให้ handshake เหล่านี้เหมือนกับเบราว์เซอร์จริง เพื่อให้เว็บเซอร์วิสไม่สามารถระบุไคลเอนต์ได้
- การทำงานเชิงเทคนิค
- คอมไพล์ curl โดยใช้ BoringSSL ซึ่งเป็นไลบรารี TLS ของ Google
- ปรับแก้ TLS extensions และตัวเลือก SSL หลายรายการ
- เปลี่ยนการตั้งค่าการเชื่อมต่อ HTTP/2
- รัน curl ด้วยแฟลกที่ไม่ใช่มาตรฐาน
- เบราว์เซอร์ที่รองรับ
- สามารถเลียนแบบเบราว์เซอร์หลายเวอร์ชัน เช่น Chrome, Edge, Safari และ Firefox
- มีสคริปต์สำหรับแต่ละเบราว์เซอร์ให้ใช้งาน
- วิธีใช้งานพื้นฐาน
- มี wrapper script สำหรับรัน
curl-impersonate แยกตามแต่ละเบราว์เซอร์ที่รองรับ
- ตัวอย่าง:
curl_chrome123 https://www.wikipedia.org
- การใช้งานขั้นสูง
- ใช้ไลบรารี
libcurl-impersonate เพื่อตั้งค่าผ่าน API ได้
- สามารถสลับไลบรารีตอนรันไทม์ได้ด้วยตัวแปรแวดล้อม
CURL_IMPERSONATE
- การติดตั้ง
- มีไบนารีที่คอมไพล์ไว้ล่วงหน้าสำหรับ Windows, Linux และ macOS บนหน้า GitHub Releases
- ใช้งานผ่าน Docker image ได้เช่นกัน
- รีโพซิทอรีนี้เป็นฟอร์กที่มีความเคลื่อนไหวมากกว่าของ
curl-impersonate และมีความแตกต่างสำคัญดังนี้
- รองรับ Encrypted Client Hello (ECH): เพิ่มฟีเจอร์ ECH ที่เปิดตัวใน Chrome 119
- รองรับการบีบอัด ZSTD: รองรับโปรโตคอลการบีบอัด ZSTD ที่เปิดตัวใน Chrome 123
- รองรับเส้นโค้ง X25519Kyber768: เพิ่มเส้นโค้งเข้ารหัสใหม่ที่เปิดตัวใน Chrome 124
- ขยายตัวเลือก Akamai HTTP/2 fingerprint: เสริมตัวเลือก fingerprint ของ HTTP/2 รวมถึง Safari
- อัปเกรดเป็น curl เวอร์ชันล่าสุด: อัปเดตเป็น curl 8.7.1
- ตั้งค่าลำดับ TLS extensions และ GREASE ได้: เพิ่มตัวเลือกเปิด/ปิด GREASE และกำหนดลำดับ TLS extensions
- เตรียมรองรับเบราว์เซอร์ที่ใช้ Webkit และ Gecko: กำลังพัฒนาไบนารีเดียวสำหรับ Chrome และ Firefox
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มีโปรเจ็กต์ที่ให้ API คล้ายกับ requests ผ่าน Python binding ซึ่งช่วยให้ส่งคำขอ HTTP ได้ง่ายโดยไม่ต้องรันสแตกเบราว์เซอร์ทั้งหมด
บางเว็บไซต์ต้องมีการตรวจจับเบราว์เซอร์ด้วย JavaScript และยังสามารถทำให้
puppeteer-extra-plugin-stealthใช้ไม่ได้ด้วยสคริปต์สำหรับบิลด์มีความซับซ้อน ใช้ autotools แต่ต้องบิลด์จากไดเรกทอรีย่อย
makeทำงานได้ดีกว่า-Werrorออก รายการ dependency ยังไม่ครบถ้วนlibc++-XX-devและlibc++abi-XX-devกระบวนการติดตั้งยังไม่ค่อยสมบูรณ์เคยทำโปรเจ็กต์ลักษณะคล้ายกันสำหรับ Python และกำลังมองหาคนมาช่วยเรื่องการบิลด์บน Windows
มีเว็บไซต์เพียงไม่กี่แห่งที่ใช้ JA3/JA4 fingerprinting และยังมีเว็บที่ใช้เทคนิคขั้นสูงเพื่อเชื่อมโยง header กับ fingerprint
ใช้ ja3proxy เพื่อเปิดเผย HTTP proxy ผ่าน utls ไม่มีฟีเจอร์พิเศษสำหรับ HTTP/2
ในภาษา Go มักใช้แพ็กเกจ tls-client เป็นหลัก
มีการพูดถึงเรื่องที่ AI scraper farm ทำให้เว็บไซต์โดน DDoS ซึ่งน่าสนใจ
คิดว่าโปรเจ็กต์แบบนี้ไม่ควรถูกเผยแพร่ อาจมีศัตรูแฝงอยู่ในหมู่พวกเรา
หากจำเป็นต้องอ่านข้อมูลจากบางเว็บไซต์ เว็บไซต์จะใช้ข้อมูล handshake เพื่อกันไม่ให้ซอฟต์แวร์อ่านได้