explaingit

lwthiker/curl-impersonate

5,999PythonAudience · developerComplexity · 3/5Setup · moderate

TLDR

A modified curl that makes web requests look exactly like Chrome, Firefox, Edge, or Safari, bypassing TLS fingerprint checks that block regular automated tools.

Mindmap

mindmap
  root((curl-impersonate))
    What it does
      Browser TLS mimicry
      HTTP/2 fingerprinting
      Bypass bot detection
    Supported browsers
      Chrome and Edge
      Firefox
      Safari
    How it works
      Recompiled with BoringSSL
      NSS for Firefox
      Wrapper scripts
    Deployment
      Docker images
      libcurl replacement
      CLI usage
Click or tap to explore — scroll the page freely

Code map

Detail Auto

An interactive map of this repo's files and how they connect — its source is parsed live in your browser. Click Visualize to build it.

filefunction / class

Things people build with this

USE CASE 1

Scrape websites that block regular curl by detecting non-browser TLS fingerprints

USE CASE 2

Test whether your own website correctly identifies real browsers versus automated tools

USE CASE 3

Integrate a browser-impersonating HTTP client into an existing program that uses libcurl

USE CASE 4

Run browser-fingerprint web requests inside Docker containers for automated data collection

Tech stack

CPythonShellDockerBoringSSL

Getting it running

Difficulty · moderate Time to first run · 30min

Docker images are the easiest path, building from source requires matching the correct TLS library (BoringSSL or NSS) to the target browser variant.

License terms not specified in the explanation, check the repository directly.

In plain English

curl is a widely used command-line tool for making web requests from a terminal. When curl connects to a website over HTTPS, it sends a message called a Client Hello as part of the connection setup. This message contains technical details about how curl wants to communicate, and those details differ from what a real browser like Chrome or Firefox sends. Some websites use these differences to detect that they are talking to an automated tool rather than a real human using a browser, and they may block the request or return different content as a result. curl-impersonate is a modified version of curl that makes the connection setup look identical to that of a real browser. It replicates the exact TLS and HTTP/2 handshake patterns produced by Chrome, Firefox, Edge, and Safari, including the specific encryption settings, extensions, and protocol parameters each browser uses. From the website's point of view, the connection appears to come from an actual browser. To achieve this, the project recompiles curl with different underlying TLS libraries. The Firefox version uses NSS, the same TLS library Firefox uses. The Chrome version uses BoringSSL, which is Google's TLS library. Additional changes are made to match the exact configuration parameters each browser sends. Usage is similar to regular curl. For each supported browser version, a wrapper script is provided. Running a command like curl_chrome116 followed by a URL will make the request using Chrome 116's exact network signature. The tool also works as a library that developers can integrate into programs that currently use libcurl. The supported browser list includes multiple versions of Chrome, Edge, Firefox, and Safari on Windows and macOS. Docker images are available for easier deployment. The README links to detailed technical blog posts explaining the underlying mechanics of TLS and HTTP/2 fingerprinting.

Copy-paste prompts

Prompt 1
I need to fetch a page that blocks curl but allows Chrome. Show me how to use curl-impersonate's curl_chrome116 wrapper to make the request look like Chrome 116.
Prompt 2
How do I build curl-impersonate from source on Ubuntu so I can use the Firefox variant with NSS? Walk me through the build steps and any common pitfalls.
Prompt 3
I have a Python scraping script that uses requests. How do I replace the underlying HTTP calls with curl-impersonate so my requests look like a real browser?
Prompt 4
Which wrapper script should I use if I want to impersonate Safari on macOS, and are there any known differences in what it replicates compared to the Chrome variant?
Prompt 5
How do I run curl-impersonate in a Docker container, pass in a URL, and get the raw response body back, and which image tag should I use for the Chrome variant?
Open on GitHub → Explain another repo

← lwthiker on gitmyhub — every repo by this author, as a profile.

Verify against the repo before relying on details.