TLS Client Bypass Cloudflare
🔥🔥🔥 ja3-client
Why
If you're having trouble with the fucking “just a moment” or fucking http status code 429 in your project, you might want to try using this. It may help you . Demonstrates good performance with 10 million concurrent requests. It is safe to use.
Features
- Proxy support : HTTP ,HTTPS , Socks4 , Socks5, Socks5h
- Custom headers
- Custom JA3 string
- Custom H2 settings
- Random TLS extension order
- Custom TLS extension order
- Custom connection flow
- Custom header order
- Custom client identifier (Chrome, Firefox, Opera, Safari, iOS, iPadOS, Android, Tor, Brave ,360 ,QQ ,UC...)
- Supported Http3 protocols
Supported browsers
The following browsers can be impersonated.
| Browser | Version |
|---|---|
| Chrome | chrome_140,chrome_139, chrome_138, chrome_137, chrome_137, chrome_136, chrome_135, chrome_134, chrome_133, chrome_132, chrome_131_android, chrome_99_android, chrome_131, chrome_130, chrome_129, chrome_128, chrome_127, chrome_126, chrome_125, chrome_124, chrome_123, chrome_122, chrome_121, chrome_120, chrome_119, chrome_117 |
| Firefox | firefox_142, firefox_141, firefox_140, firefox_139, firefox_138, firefox_137, firefox_136, firefox_135, firefox_134, firefox_133, firefox_132, firefox_123, firefox_120, firefox_117 |
| Safari Mac | safari_15_3 , safari_15_5 , safari_17_0 , safari_18_0 , safari_18_1 , safari_18_5 , safari_26_0 , |
| Safari IOS | safari_ios_17_0, safari_ios_18_0, safari_ios_18_5, safari_ios_26_0 |
| Edge | edge_140,edge_139, edge_138, edge_137, edge_136, edge_135, edge_134, edge_133, edge_132, edge_131, edge_101 |
| Opera | opera_120, opera_119, opera_117 |
| 360 | qh360_16_0 |
| UC | uc_17_9 |
| Xiaomi | xiaomi_15_9 |
| Samsung | samsung_27_1 |
| Tor | tor_14_5 |
| Brave | brave_1_8 |
Dependencies
golang ^v1.21x
Installation
go get github.com/smallerqiu/ja3-client
Usage
Basic Usage
default impersonate chrome 138 , but you can set you customized ja3 string or others browser and version
package main
import (
"io"
"log"
tls "github.com/smallerqiu/ja3-client"
)
func main() {
// support Get,Post,Delete,Put
response, err := tls.Get("https://tls.browserleaks.com/json",nil)
if err != nil {
log.Printf("Error response: %v", err)
}
defer response.Body.Close()
bytes, err := io.ReadAll(response.Body)
if err != nil {
log.Printf("Error response: %v", err)
}
log.Printf("Response: %s", string(bytes))
log.Printf("%v,%s: %s", response.StatusCode)
}
Custom ja3 string
use custom ja3 string do http request . If you're going to use a customized JA3 , you'd better know the browser type. Or you can just use the Custom Client
package main
import (
"io"
"log"
tls "github.com/smallerqiu/ja3-client"
)
func main() {
reqBody := &tls.Ja3Request{
Method: "GET",
URL: "https://www.google.com",
// Proxy: "http://127.0.0.1:7890", // optional
// Headers: make(map[string][]string), // optional , your custom headers
Ja3: "771,4867-4865-4866-52393-52392-49195-49199-49196-49200-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21,29-23-24,0",
// Akamai: "1:65535;2:0;4:5840;6:262144|15663105|0|m,a,s,p" // Optional, if you want to use akamai to keep http2 fingerprint more accurate.
// RandomExtensionOrder: true, // Optional , if is true, the extension order will be randomized
}
var response, err := tls.DoRequest(reqBody)
if err != nil {
log.Printf("Client Error: %v", err)
}
defer response.Body.Close()
bytes, err := io.ReadAll(response.Body)
if err != nil {
log.Printf("Error response: %v", err)
}
log.Printf("Response: %s", string(bytes))
log.Printf("%v,%s: %s", response.StatusCode, reqBody.Method, reqBody.URL)
}
Custom Client
package main
import (
"io"
"log"
tls "github.com/smallerqiu/ja3-client"
)
func main() {
reqBody := &tls.Ja3Request{
Method:"GET",
URL:"https://tls.browserleaks.com/json",
// Proxy:"http://127.0.0.1:7890", // optional
// Headers:make(map[string][]string), //optional
Impersonate:"chrome_136",
// RandomExtensionOrder: true, //optional , if is true, the order of extensions will be randomized
}
var response, err := tls.DoRequest(reqBody)
if err != nil {
log.Printf("Client Error: %v", err)
}
defer response.Body.Close()
bytes, err := io.ReadAll(response.Body)
if err != nil {
log.Printf("Error response: %v", err)
}
log.Printf("Response: %s", string(bytes))
log.Printf("%v,%s: %s", response.StatusCode, reqBody.Method, reqBody.URL)
}
Options
| Name | Description | Type | Default | Optional | example |
|---|---|---|---|---|---|
| Method | request type | string | - | No | GET, POST ,PUT, DELETE |
| URL | request url | http.Header | - | No | https://example.com |
| Body | request body | []byte | - | Yes | b'{"a": 1}' |
| Proxy | request proxy url | string | - | Yes | http://198.168.1.55:7890 |
| SourceIP | if your server has multiple IPs,you can decide on one of them as the source IP. | string | - | Yes | 193.189.xx.xx |
| Impersonate | which type of browser to impersonate | string | chrome_138 | Yes | chrome_137 |
| Ja3 | customized ja3 key | string | - | Yes | 771,867-4865-.... |
| Akamai | customized akamai key | string | chrome's akamai | Yes | 1:65535;2:0;4:... |
| Timeout | the timeout for the request. | int | 30(s) | Yes | 60 |
| ClientData | if you want to customized a browser's fingerprint, you can set this options | *ClientData | - | Yes | .... |
Of course, you can also look at other projects, such as curl_cffi, REQ etc.
multple ips