Advanced TLS/SSL wrapper for Python
Project description
🔥 Noble TLS
Noble TLS is an advanced HTTP library based on requests and tls-client. Now async, providing many more features and auto updating the JA3 fingerprints.
Installation
pip install noble-tls
Features
- Auto updating feature: Update TLS client libs from bogdanfinn/tls-client
- Async support
- Proxy support
- Custom JA3 string
- Custom H2 settings
- Custom supported signature algorithms
- Custom supported versions
- Custom key share curves
- Custom cert compression algorithm
- Custom pseudo header order
- Custom connection flow
- Custom header order
- Custom client identifier (Chrome, Firefox, Opera, Safari, iOS, iPadOS, Android)
- Random TLS extension order
- Custom TLS extension order
-
requests
'shistory
support -
requests
'sallow_redirects
support - much more...
Examples
The syntax is inspired by requests, so its very similar and there are only very few things that are different.
Example - Download latest tls lib for your platform:
⛔️You should run this first before using the library
import noble_tls
async def main():
await noble_tls.download_if_necessary()
# or update
# await noble_tls.update_if_necessary()
Example 1 - Preset:
import noble_tls
# Available identifiers:
"""
CHROME_103 = "chrome_103"
CHROME_104 = "chrome_104"
CHROME_105 = "chrome_105"
CHROME_106 = "chrome_106"
CHROME_107 = "chrome_107"
CHROME_108 = "chrome_108"
CHROME_109 = "chrome_109"
CHROME_110 = "chrome_110"
CHROME_111 = "chrome_111"
CHROME_112 = "chrome_112"
CHROME_116_PSK = "chrome_116_PSK"
CHROME_116_PSK_PQ = "chrome_116_PSK_PQ"
CHROME_117 = "chrome_117"
CHROME_120 = "chrome_120"
SAFARI_15_6_1 = "safari_15_6_1"
SAFARI_16_0 = "safari_16_0"
SAFARI_IPAD_15_6 = "safari_ipad_15_6"
SAFARI_IOS_15_5 = "safari_ios_15_5"
SAFARI_IOS_15_6 = "safari_ios_15_6"
SAFARI_IOS_16_0 = "safari_ios_16_0"
FIREFOX_102 = "firefox_102"
FIREFOX_104 = "firefox_104"
FIREFOX_105 = "firefox_105"
FIREFOX_106 = "firefox_106"
FIREFOX_108 = "firefox_108"
FIREFOX_110 = "firefox_110"
FIREFOX_117 = "firefox_117"
FIREFOX_120 = "firefox_120"
OPERA_89 = "opera_89"
OPERA_90 = "opera_90"
OPERA_91 = "opera_91"
ZALANDO_ANDROID_MOBILE = "zalando_android_mobile"
ZALANDO_IOS_MOBILE = "zalando_ios_mobile"
NIKE_IOS_MOBILE = "nike_ios_mobile"
NIKE_ANDROID_MOBILE = "nike_android_mobile"
CLOUDSCRAPER = "cloudscraper"
MMS_IOS = "mms_ios"
MMS_IOS_1 = "mms_ios_1"
MMS_IOS_2 = "mms_ios_2"
MMS_IOS_3 = "mms_ios_3"
MESH_IOS = "mesh_ios"
MESH_IOS_1 = "mesh_ios_1"
MESH_IOS_2 = "mesh_ios_2"
MESH_ANDROID = "mesh_android"
MESH_ANDROID_1 = "mesh_android_1"
MESH_ANDROID_2 = "mesh_android_2"
CONFIRMED_IOS = "confirmed_ios"
CONFIRMED_ANDROID = "confirmed_android"
OKHTTP4_ANDROID_7 = "okhttp4_android_7"
OKHTTP4_ANDROID_8 = "okhttp4_android_8"
OKHTTP4_ANDROID_9 = "okhttp4_android_9"
OKHTTP4_ANDROID_10 = "okhttp4_android_10"
OKHTTP4_ANDROID_11 = "okhttp4_android_11"
OKHTTP4_ANDROID_12 = "okhttp4_android_12"
OKHTTP4_ANDROID_13 = "okhttp4_android_13"
"""
async def main():
await noble_tls.update_if_necessary() # Update TLS client libs from bogdanfinn/tls-client
session = noble_tls.Session(
client_identifier=noble_tls.Client.CHROME_111,
random_tls_extension_order=True
)
res = await session.get(
"https://www.example.com/",
headers={
"key1": "value1",
},
proxy="http://user:password@host:port"
)
print(res.text)
Example 2 - Custom:
import noble_tls
async def main():
await noble_tls.update_if_necessary() # Update TLS client libs from bogdanfinn/tls-client
session = noble_tls.Session(
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,
"INITIAL_WINDOW_SIZE": 6291456,
"MAX_HEADER_LIST_SIZE": 262144
},
h2_settings_order=[
"HEADER_TABLE_SIZE",
"MAX_CONCURRENT_STREAMS",
"INITIAL_WINDOW_SIZE",
"MAX_HEADER_LIST_SIZE"
],
supported_signature_algorithms=[
"ECDSAWithP256AndSHA256",
"PSSWithSHA256",
"PKCS1WithSHA256",
"ECDSAWithP384AndSHA384",
"PSSWithSHA384",
"PKCS1WithSHA384",
"PSSWithSHA512",
"PKCS1WithSHA512",
],
supported_versions=["GREASE", "1.3", "1.2"],
key_share_curves=["GREASE", "X25519"],
cert_compression_algo="brotli",
pseudo_header_order=[
":method",
":authority",
":scheme",
":path"
],
connection_flow=15663105,
header_order=[
"accept",
"user-agent",
"accept-encoding",
"accept-language"
]
)
res = await session.post(
"https://www.example.com/",
headers={
"key1": "value1",
},
proxy="http://user:password@host:port"
)
print(res.text)
Pyinstaller / Pyarmor
If you want to pack the library with Pyinstaller or Pyarmor, make sure to add this to your command:
Linux - Ubuntu / x86:
--add-binary '{path_to_library}/tls_client/dependencies/tls-client-x86.so:tls_client/dependencies'
Linux Alpine / AMD64:
--add-binary '{path_to_library}/tls_client/dependencies/tls-client-amd64.so:tls_client/dependencies'
MacOS M1 and older:
--add-binary '{path_to_library}/tls_client/dependencies/tls-client-x86.dylib:tls_client/dependencies'
MacOS M2:
--add-binary '{path_to_library}/tls_client/dependencies/tls-client-arm64.dylib:tls_client/dependencies'
Windows:
--add-binary '{path_to_library}/tls_client/dependencies/tls-client-64.dll;tls_client/dependencies'
Acknowledgements
Big shout out to Bogdanfinn for open sourcing his tls-client in Golang. and FlorianREGAZ
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file Noble_TLS-0.0.2-py3-none-any.whl
.
File metadata
- Download URL: Noble_TLS-0.0.2-py3-none-any.whl
- Upload date:
- Size: 14.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | da75d9ad5eb96c72b3d45ccaefdcccecc361b227296dad901af9e33a317f8385 |
|
MD5 | 8568006809c34cca9e162ecc8d2b50fb |
|
BLAKE2b-256 | 50074b2dfab176a301177256f80836878bcb2841c30a868685c7549baf7f7ae8 |