Skip to main content

High-performance Python binding for bogdanfinn/tls-client via CFFI – zero-copy, panic-proof, full TLS fingerprint control

Project description

tls-client-python

PyPI version Python License: MIT

High-performance Python binding for bogdanfinn/tls-client via CFFI.


What is TLS Fingerprinting?

Some people think it is enough to change the user-agent header of a request to let the server think that the client requesting a resource is a specific browser. Nowadays this is not enough, because the server might use a technique to detect the client browser which is called TLS Fingerprinting.

For a deep dive, see this excellent article on TLS fingerprinting.

✨ Features

Category Details
🔐 TLS Fingerprinting Impersonate Chrome, Firefox, Safari, Brave, Opera, OkHttp & more
🌐 Protocol Support HTTP/1.1, HTTP/2 (h2), HTTP/3 (QUIC) with automatic negotiation
Protocol Racing Chrome-style Happy Eyeballs for HTTP/2 vs HTTP/3
📋 Header Ordering Control the exact order of HTTP headers per request
🔒 Certificate Pinning Pin server certificates for enhanced security
🍪 Cookie Jar Built-in cookie handling with customisable jar
🚇 Proxy Support HTTP and SOCKS5 proxies with CONNECT auth
🔀 Redirect Control Choose whether to follow redirects per request
📊 Bandwidth Tracking Monitor upload/download bytes in real time
🔄 sync/Async Session + AsyncSession
🛡️ Panic-proof All Go panics caught and surfaced as Python exceptions
⚙️ Custom TLS Full 26-field custom TLS client configuration

📦 Installation

pip install tls-client-python

Pre-compiled binaries are included for 9 platforms — no Go toolchain required.

Requirements: Python 3.6+


🚀 Quick Start

from tls_client import Session

# Create a session with Chrome 146 fingerprint
session = Session(client_identifier="chrome_146", verify=False)

# GET request
resp = session.get("https://tls.browserleaks.com/json")
print(resp.status_code)
print(resp.text)

# POST request
resp = session.post("https://tools.scrapfly.io/api/fp/ja3")
data = resp.json()
print(resp.status_code)
print(data)


# Context Manager
with Session(client_identifier="firefox_148") as session:
    resp = session.get("https://tls.browserleaks.com/json")
    print(resp.status_code)
    print(resp.text)


# Async Usage
import asyncio
from tls_client import AsyncSession

async def main():
    async with AsyncSession(client_identifier="firefox_148") as s:
        resp = await s.get("https://tls.browserleaks.com/json")
        print(resp.status_code)
        print(resp.json())

asyncio.run(main())

🖥️ Supported Platforms

Pre-compiled native libraries are bundled for these platforms:

OS Architecture Binary
Windows x86-64 tls-client-windows-amd64.dll
Windows x86 (32-bit) tls-client-windows-386.dll
macOS x86-64 tls-client-darwin-amd64.dylib
macOS ARM64 (Apple Silicon) tls-client-darwin-arm64.dylib
Linux x86-64 (glibc) tls-client-linux-amd64.so
Linux x86 (32-bit, glibc) tls-client-linux-386.so
Linux ARM64 tls-client-linux-arm64.so
Linux ARMv7 tls-client-linux-arm.so
Alpine Linux x86-64 (musl) tls-client-alpine-amd64.so

The correct binary is automatically selected at runtime. Override via TLS_CLIENT_LIB environment variable.


🎭 Supported Browser Profiles — 79 Identifiers

🌐 Chrome — 24 Profiles

Identifier Notes
chrome_103chrome_112 Chrome Stable 103–112
chrome_116_PSK Chrome 116 with PSK key exchange
chrome_116_PSK_PQ Chrome 116 with PSK + Post-Quantum
chrome_117 Chrome 117
chrome_120 Chrome 120
chrome_124 Chrome 124
chrome_130_PSK Chrome 130 with PSK
chrome_131 · chrome_131_PSK Chrome 131 (standard & PSK)
chrome_133 · chrome_133_PSK Chrome 133 (standard & PSK)
chrome_144 · chrome_144_PSK Chrome 144 (standard & PSK)
chrome_146 · chrome_146_PSK Chrome 146 — default (standard & PSK)

🦊 Firefox — 16 Profiles

Identifier Notes
firefox_102 · firefox_104 · firefox_105 · firefox_106 Firefox 102–106
firefox_108 · firefox_110 Firefox 108 · 110
firefox_117 · firefox_120 · firefox_123 Firefox 117–123
firefox_132 · firefox_133 · firefox_135 Firefox 132–135
firefox_146_PSK Firefox 146 with PSK
firefox_147 · firefox_147_PSK Firefox 147 (standard & PSK)
firefox_148 Firefox 148

🍏 Safari — 10 Profiles

Identifier Device
safari_15_6_1 Safari 15.6.1 (macOS)
safari_16_0 Safari 16.0 (macOS)
safari_ipad_15_6 Safari 15.6 (iPadOS)
safari_ios_15_5 · safari_ios_15_6 Safari iOS 15.5–15.6
safari_ios_16_0 · safari_ios_17_0 Safari iOS 16 · 17
safari_ios_18_0 · safari_ios_18_5 Safari iOS 18 · 18.5
safari_ios_26_0 Safari iOS 26

🦁 Brave — 2 Profiles

Identifier Notes
brave_146 Brave Browser 146
brave_146_PSK Brave 146 with PSK

🎭 Opera — 3 Profiles

Identifier
opera_89 · opera_90 · opera_91

🤖 OkHttp (Android) — 7 Profiles

Identifier
okhttp4_android_7okhttp4_android_13

📱 Mobile / App SDKs — 16 Profiles

Category Identifiers
Zalando zalando_android_mobile · zalando_ios_mobile
Nike nike_ios_mobile · nike_android_mobile
MMS mms_ios · mms_ios_1 · mms_ios_2 · mms_ios_3
Mesh mesh_ios · mesh_ios_1 · mesh_ios_2 · mesh_android · mesh_android_1 · mesh_android_2
Confirmed confirmed_ios · confirmed_android

☁️ Cloudflare-specific — 1 Profile

Identifier Notes
cloudscraper Custom profile tuned for Cloudflare-protected sites

🔧 Advanced Usage

Custom TLS Client (Full Control)

Set custom_tls_client with up to 26 fields to bypass client_identifier entirely:

session = Session(custom_tls_client={
    "ja3_string": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513,29-23-24,0",
    "h2_settings": {"HEADER_TABLE_SIZE": 65536, "MAX_CONCURRENT_STREAMS": 1000},
    "h2_settings_order": ["HEADER_TABLE_SIZE", "MAX_CONCURRENT_STREAMS"],
    "pseudo_header_order": [":method", ":authority", ":scheme", ":path"],
    "connection_flow": 1048576,
    "key_share_curves": ["X25519", "P256"],
    "alpn_protocols": ["h2", "http/1.1"],
    "supported_versions": ["1.3", "1.2"],
    "stream_id": 3,
})

Certificate Pinning

session = Session(
    certificate_pinning_hosts={
        "example.com": ["sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="]
    }
)

Client Certificates (mTLS)

session = Session(
    client_certificates=[{
        "cert_pem": open("client.crt", "rb").read(),
        "key_pem": open("client.key", "rb").read(),
    }]
)

Stream Response to Disk

resp = session.stream_to_file(
    "GET", "https://tls.browserleaks.com/",
    output_path="/tmp/image.png"
)
print(resp.status_code)  # response metadata still available

Per-Request Overrides

All Session constructor parameters can be overridden per request:

s = Session(client_identifier="chrome_146")
# Override fingerprint for a single request
resp = s.get("https://tls.browserleaks.com/json", client_identifier="firefox_148")

🔬 Architecture

Layer Technology
Go Engine bogdanfinn/tls-client compiled as C shared library (-buildmode=c-shared)
FFI Boundary Raw C structs via CFFI — no JSON serialization overhead
Memory Safety ffi.gc(resp, FreeResponse) — Go panics surfaced as RuntimeError
Python API requests-style Session, Response, AsyncSession

📚 API Reference

Session

Method Description
get(url, **kwargs) HTTP GET
post(url, **kwargs) HTTP POST
put(url, **kwargs) HTTP PUT
delete(url, **kwargs) HTTP DELETE
head(url, **kwargs) HTTP HEAD
patch(url, **kwargs) HTTP PATCH
execute_request(method, url, **kwargs) Generic request with full options
typed_request(Request) Strongly-typed request
stream_to_file(method, url, path) Stream response body to disk
clear_client_pool() Close idle connections (static)

Response

Property / Method Description
status_code HTTP status code (int)
headers Response headers (dict of list)
content Raw bytes body
text Decoded text body
encoding Detected charset
url Final URL after redirects
cookies Response cookies dict
used_protocol Protocol used (e.g. HTTP/2.0)
ok True if status_code < 400
reason HTTP reason phrase
json() Parse body as JSON
raise_for_status() Raise RuntimeError on 4xx/5xx

🔗 Credits

This project is a Python binding for bogdanfinn/tls-client, which itself is built upon:


📄 License

MIT — see LICENSE.


🙏 Community

Join the Discord server for support and discussion.


Powered by
JetBrains logo.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tls_client_python-1.15.0.3.tar.gz (23.8 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

tls_client_python-1.15.0.3-py3-none-win_amd64.whl (3.3 MB view details)

Uploaded Python 3Windows x86-64

tls_client_python-1.15.0.3-py3-none-win32.whl (3.0 MB view details)

Uploaded Python 3Windows x86

tls_client_python-1.15.0.3-py3-none-musllinux_1_1_x86_64.whl (4.6 MB view details)

Uploaded Python 3musllinux: musl 1.1+ x86-64

tls_client_python-1.15.0.3-py3-none-macosx_11_0_arm64.whl (4.1 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

tls_client_python-1.15.0.3-py3-none-macosx_10_9_x86_64.whl (4.4 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

Details for the file tls_client_python-1.15.0.3.tar.gz.

File metadata

  • Download URL: tls_client_python-1.15.0.3.tar.gz
  • Upload date:
  • Size: 23.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tls_client_python-1.15.0.3.tar.gz
Algorithm Hash digest
SHA256 369436ab732673a30cbf18926c6de15378c7b95191812e91423ecb9dc97dc1dd
MD5 7ce9cf306acf899d6199283ca39d1104
BLAKE2b-256 5c828d839398a7902246653f60be5baeac44be07c6a004ab405481f345c91f6e

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.3.tar.gz:

Publisher: build_workflow.yml on komAAmok/tls-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tls_client_python-1.15.0.3-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 bc0401c64facebb92c599c9610d066bbe38ea5a57987d8a5f37eb9297bc8db86
MD5 19600afe5f606e4f02b1f815a4e1fbc0
BLAKE2b-256 f5f65fb67a9993b2ebf540a98f18101cd4397502194067d1801e42a64b6e10f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.3-py3-none-win_amd64.whl:

Publisher: build_workflow.yml on komAAmok/tls-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tls_client_python-1.15.0.3-py3-none-win32.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.3-py3-none-win32.whl
Algorithm Hash digest
SHA256 88aa248959ffc17dbcfd830be76dcf9b953dbeb8c20282ebcaa398932335a838
MD5 fbf5f05cfd18251541ba84c13b8ee20f
BLAKE2b-256 36c25abfda99dec80348c6af743b3e4e59aa2d9c1f3a5409f23882becd18eeb5

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.3-py3-none-win32.whl:

Publisher: build_workflow.yml on komAAmok/tls-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tls_client_python-1.15.0.3-py3-none-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.3-py3-none-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 7be2e6bbd0d887a499a70abfdf7e2ca4f60b6c1da3b197b0e26f467bbfa3330f
MD5 d7083939235845f97ac9a6eeda976165
BLAKE2b-256 7cebee8c165cf29e7bf3fe7c8781a696482c8aa804acf9425702c16191ed00e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.3-py3-none-musllinux_1_1_x86_64.whl:

Publisher: build_workflow.yml on komAAmok/tls-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tls_client_python-1.15.0.3-py3-none-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.3-py3-none-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 711eac13e10ae5a0472c7fda815bf8431ed11547b708100cabc80884f36ed330
MD5 4ae99a819758954636a97abade7e586f
BLAKE2b-256 84a3aa0f93ad0239c6b3988700d9f5b360ccd591d2ab4fe7dcac0d36c51aa3ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.3-py3-none-manylinux2014_x86_64.whl:

Publisher: build_workflow.yml on komAAmok/tls-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tls_client_python-1.15.0.3-py3-none-manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.3-py3-none-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 0c0c3a5734ded81e49f814a11cbab323d0e20d9b4749e2a3ca4d86af898aadbb
MD5 4a2e072c27077ca15e954ed721422aac
BLAKE2b-256 147631d876cc7661be1390c3971c3e181f92313874b474305cfc527b48f55e9d

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.3-py3-none-manylinux2014_i686.whl:

Publisher: build_workflow.yml on komAAmok/tls-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tls_client_python-1.15.0.3-py3-none-manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.3-py3-none-manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 290a00e03ed1b6758ed8398b59600f88667945d4cab60837c8dae68f1075eba2
MD5 c3f9e431f67984088889ab62c2335375
BLAKE2b-256 70201639fc52ed3a5d3e9893df24dda021171dcc96921550fcb79f3564f8dc60

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.3-py3-none-manylinux2014_armv7l.whl:

Publisher: build_workflow.yml on komAAmok/tls-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tls_client_python-1.15.0.3-py3-none-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.3-py3-none-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1ffa8e7acee2af72588687d1fb9638d0f6118ca61e6d85e9ea6b53d8c91fdfe7
MD5 249ff50a0d4f6014ad952e325d65397b
BLAKE2b-256 ef95ee8e523d65ec43f5f1cbdf85c0486e308cf0acf24f76a9bcaf7dbaabf5be

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.3-py3-none-manylinux2014_aarch64.whl:

Publisher: build_workflow.yml on komAAmok/tls-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tls_client_python-1.15.0.3-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f1e95621f674ffa76d491b23b44bb7eeb2bdaa3b4f0d4bed86189b36b081f10b
MD5 9ada66f500ee939ea296a46e0e81306a
BLAKE2b-256 cd0bf0bc03463106d19e4081ca56e3fed38543e394cb6e0e90b1d3d61e32e109

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.3-py3-none-macosx_11_0_arm64.whl:

Publisher: build_workflow.yml on komAAmok/tls-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tls_client_python-1.15.0.3-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.3-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 bb88e62c3b2c77e4e4c85a6af09081ac654dff8a2532895df3cbd63a5e035789
MD5 e6d14ded2920181a5fe5eea423b9b649
BLAKE2b-256 aed171e541782dd3f3e859732429b9096c20378576dcbdb8fd338271ce21b9f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.3-py3-none-macosx_10_9_x86_64.whl:

Publisher: build_workflow.yml on komAAmok/tls-client-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page