TLS-客户端
前言
这个TLS客户端是基于https://github.com/Carcraftz/fhttp和https://github.com/Carcraftz/utls (https://github.com/refraction-networking/utls)构建的。非常感谢迄今为止所有的贡献者。遗憾的是,Carcraftz的原始仓库似乎不再维护了。
什么是TLS指纹识别?
一些人认为只需更改请求的用户代理头部就足以让服务器认为请求资源的客户端是特定的浏览器。 如今这还不够,因为服务器可能使用一种称为TLS指纹识别的技术来检测客户端浏览器。
尽管这篇文章是关于NodeJS中的TLS指纹识别,但它很好地描述了该技术的一般原理。 https://httptoolkit.tech/blog/tls-fingerprinting-node-js/#how-does-tls-fingerprinting-work
为什么需要这个库?
使用这个库,你可以创建一个HTTP客户端,实现类似于Golang的net/http客户端接口的接口。 这个TLS客户端允许你在请求服务器时指定要使用的客户端(浏览器和版本)。
HTTP客户端的接口如下所示,它扩展了基本的net/http客户端接口,增加了一些有用的功能。
最可能的是,你会像以前使用net/http客户端一样使用Do()
函数。
type HttpClient interface {
GetCookies(u *url.URL) []*http.Cookie
SetCookies(u *url.URL, cookies []*http.Cookie)
SetCookieJar(jar http.CookieJar)
GetCookieJar() http.CookieJar
SetProxy(proxyUrl string) error
GetProxy() string
SetFollowRedirect(followRedirect bool)
GetFollowRedirect() bool
CloseIdleConnections()
Do(req *http.Request) (*http.Response, error)
Get(url string) (resp *http.Response, err error)
Head(url string) (resp *http.Response, err error)
Post(url, contentType string, body io.Reader) (resp *http.Response, err error)
}
快速使用示例
package main
import (
"fmt"
"io"
"log"
http "github.com/bogdanfinn/fhttp"
tls_client "github.com/bogdanfinn/tls-client"
"github.com/bogdanfinn/tls-client/profiles"
)
func main() {
jar := tls_client.NewCookieJar()
options := []tls_client.HttpClientOption{
tls_client.WithTimeoutSeconds(30),
tls_client.WithClientProfile(profiles.Chrome_120),
tls_client.WithNotFollowRedirects(),
tls_client.WithCookieJar(jar), // 创建cookieJar实例并作为参数传递
}
client, err := tls_client.NewHttpClient(tls_client.NewNoopLogger(), options...)
if err != nil {
log.Println(err)
return
}
req, err := http.NewRequest(http.MethodGet, "https://tls.peet.ws/api/all", nil)
if err != nil {
log.Println(err)
return
}
req.Header = http.Header{
"accept": {"*/*"},
"accept-language": {"de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"},
"user-agent": {"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"},
http.HeaderOrderKey: {
"accept",
"accept-language",
"user-agent",
},
}
resp, err := client.Do(req)
if err != nil {
log.Println(err)
return
}
defer resp.Body.Close()
log.Println(fmt.Sprintf("状态码: %d", resp.StatusCode))
readBytes, err := io.ReadAll(resp.Body)
if err != nil {
log.Println(err)
return
}
log.Println(string(readBytes))
}
详细文档
https://bogdanfinn.gitbook.io/open-source-oasis/
有问题?
加入我的免费Discord支持服务器:https://discord.gg/7Ej9eJvHqk 不提供私信支持!