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.4.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.4-py3-none-win_amd64.whl (23.9 MB view details)

Uploaded Python 3Windows x86-64

tls_client_python-1.15.0.4-py3-none-win32.whl (23.9 MB view details)

Uploaded Python 3Windows x86

tls_client_python-1.15.0.4-py3-none-musllinux_1_1_x86_64.whl (23.9 MB view details)

Uploaded Python 3musllinux: musl 1.1+ x86-64

tls_client_python-1.15.0.4-py3-none-macosx_11_0_arm64.whl (23.9 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

tls_client_python-1.15.0.4-py3-none-macosx_10_9_x86_64.whl (23.9 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: tls_client_python-1.15.0.4.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.4.tar.gz
Algorithm Hash digest
SHA256 ae52de4feb8cfc6290e02dbe2a542b8314e97a6cc5c0454f71f27d8ffa88b08b
MD5 e66664276f3bef189f829a7bd20cd885
BLAKE2b-256 d28b9a9a54561f24981b41c0629dbe70d9707e259b21fc1b18b9de6a583f0682

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.4.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.4-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.4-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 e45e5ad091340b34e6ad2869403910ae5e71fa143e5013edb4c0821cf7a38732
MD5 59d7450afeddab8ef7efb86a2b381ff4
BLAKE2b-256 28795714b04fb385350e9abcd20454ae778502babc54e3b55e5d77a796dd7c3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.4-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.4-py3-none-win32.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.4-py3-none-win32.whl
Algorithm Hash digest
SHA256 bf85dcf19dc25415378ff82a74bb9cc44d8643908312a9918568ce24f66e4e00
MD5 bdd0d9e72101b8f5e4e06760d108964f
BLAKE2b-256 f7de1db6761bfd0b3465e63af54b95790063974ec4d6e08437089eb79b8df38c

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.4-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.4-py3-none-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.4-py3-none-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 c85f3321acf180640ad615e8290fde054da72fa324aab79a01acde8bf5d10679
MD5 1c4f2ac5edf2970dfcee7479ab3f2659
BLAKE2b-256 86fff3dccf468b9d165521405793946156b54d02d45afbad77b0b6026d783541

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.4-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.4-py3-none-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.4-py3-none-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ae450bb29a29ad6f94d0c956ec93c3bddec6b7584b82cb9a24427c777a064b81
MD5 ce39f03743c01f60312192f1bfca476f
BLAKE2b-256 6de1db6709723cfdcf82ce018b52627af79870e79352c02901617f125ed547ee

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.4-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.4-py3-none-manylinux2014_i686.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.4-py3-none-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 99002725f9382f384fbfeec0dbc53e3acaa59830d500e4218f17e92a3338f217
MD5 0d719818205c9070a93605bfbae6bcd8
BLAKE2b-256 ed99bfd7403160fa02c9e8b43faefdca44d0743fd16ac3d759e0fb722b2655bd

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.4-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.4-py3-none-manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.4-py3-none-manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 88344f2b0fbd2c1a7a99acc061afea7944630ad81b88bde2076df5652442a357
MD5 9b664b96f2ac801593ffb200ef849192
BLAKE2b-256 87e38a6351ebe4539161d6f732fc74ff5a451654dcf394087bd4f266efd399ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.4-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.4-py3-none-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.4-py3-none-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 72612fae2cb2233502ec04f52210a23616230c3147fb02f7468222f702e8ec5b
MD5 6e6dbb29466eec380db20182c8aad7ba
BLAKE2b-256 caffb406137d4f44ab4e8c6826de701021d19d19481b3c5afcddbbd53fe32f13

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.4-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.4-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.4-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 92ffe217acd52ec0d28d2c646f17f4c3a10dd669af6cea2d931a01854bac70e2
MD5 b90ca7e6576b44a6b6ad8a8cb5c0c926
BLAKE2b-256 f052f386a49b877e94f94f63e507608718c4f09ec69482ed17463927a86c170e

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.4-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.4-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for tls_client_python-1.15.0.4-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 155daaab37c75a4779ae19659c2314453a3863af821062060fe82eb1a7ffc640
MD5 2e6feca3eb292f4b3542d8dea3491102
BLAKE2b-256 9bb08fed2c85d2c184ae1381cadafba4e15e109765012fde16d80b36b29edbc8

See more details on using hashes here.

Provenance

The following attestation bundles were made for tls_client_python-1.15.0.4-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