Http 发送请求时如何使用uTLS连接?
我试图通过使用uTLS库使用Hello Chrome指纹发送请求,但在查看文档后,我很难弄清楚在发送请求时如何使用uTLS连接 我已经得到了下面代码的两部分,但不确定如何将它们组合在一起,或者我是否用正确的方法来做Http 发送请求时如何使用uTLS连接?,http,go,request,tls1.2,Http,Go,Request,Tls1.2,我试图通过使用uTLS库使用Hello Chrome指纹发送请求,但在查看文档后,我很难弄清楚在发送请求时如何使用uTLS连接 我已经得到了下面代码的两部分,但不确定如何将它们组合在一起,或者我是否用正确的方法来做 package main import ( "fmt" "io/ioutil" "net" "net/http" "net/http/cookiejar
package main
import (
"fmt"
"io/ioutil"
"net"
"net/http"
"net/http/cookiejar"
tls "github.com/refraction-networking/utls"
)
func main() {
tcpConn, err := net.Dial("tcp", "151.101.65.69:443")
if err != nil {
fmt.Printf("net.Dial() failed: %+v\n", err)
return
}
config := tls.Config{ServerName: "www.stackoverflow.com"}
tlsConn := tls.UClient(tcpConn, &config, tls.HelloChrome_Auto)
defer tlsConn.Close()
err = tlsConn.Handshake()
if err != nil {
fmt.Printf("uTlsConn.Handshake() error: %+v", err)
} else {
fmt.Println("Handshake met")
}
cookieJar, _ := cookiejar.New(nil)
client := &http.Client{
Jar: cookieJar,
Transport: &http.Transport{},
}
req, err := http.NewRequest("GET", "https://ja3er.com/json", nil)
req.Header.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36")
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(resp.StatusCode)
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}
}
只需将代码移动到: DialTLSContext指定用于创建的可选拨号函数 用于非代理HTTPS请求的TLS连接 [……] 假定返回的net.Conn已为 通过TLS握手
我似乎在使用关闭的网络连接时遇到了一个持续的错误
tcp[addr]->[addr]
我忽略了延迟的关闭调用。当然,那不应该在那里。我更新了答案。这在一些网站上可以完美地工作,但有些网站我得到了net/http:http/1.x传输连接中断:格式错误的http响应\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\\x00\x00\x00\x00\x00\x00\x00\\x00\x00\x00\\您遇到问题的站点不支持http2。
client := &http.Client{
Jar: cookieJar,
Transport: &http.Transport{
DialTLSContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
// Note that hardcoding the address is not necessary here. Only
// do that if you want to ignore the DNS lookup that already
// happened behind the scenes.
tcpConn, err := (&net.Dialer{}).DialContext(ctx, network, addr)
if err != nil {
return nil, err
}
config := tls.Config{ServerName: "www.stackoverflow.com"}
tlsConn := tls.UClient(tcpConn, &config, tls.HelloChrome_Auto)
err = tlsConn.Handshake()
if err != nil {
return nil, fmt.Errorf("uTlsConn.Handshake() error: %w", err)
}
return tlsConn, nil
},
},
}