登录
首页 >  Golang >  Go问答

使用 uTLS 连接发送请求的方法是什么?

来源:stackoverflow

时间:2024-03-05 20:54:18 485浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《使用 uTLS 连接发送请求的方法是什么?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

我正在尝试通过 utls 库使用 hello chrome 指纹发送请求,但在查看文档后,我很难弄清楚如何在发送请求时利用 utls 连接。

我已经获得了下面的两部分代码,但不确定如何将它们组合在一起,或者是否以正确的方式进行操作。

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))
    }
}

解决方案


只需将您的代码移至 Transport.DialTLSContext

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
        },
    },
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>