goproxy icon indicating copy to clipboard operation
goproxy copied to clipboard

How do I send the request using the req module?

Open tocha688 opened this issue 8 months ago • 1 comments

How do I send the request using the req module?

https://github.com/imroc/req I need to create a transit server to forward all proxy requests through the req module

package main

/**
正向代理
*/

import (
	"context"
	"log"
	"net"
	"net/http"
	"retls/libs/config"
	"retls/libs/utils"
	"strings"

	"github.com/elazarl/goproxy"
	"github.com/elazarl/goproxy/ext/auth"
	"github.com/imroc/req/v3"
)

type Logger struct {
	goproxy.Logger
}

// Printf implements goproxy.Logger.
func (p Logger) Printf(format string, v ...interface{}) {
	// panic("unimplemented")
}

func main() {
	proxy := goproxy.NewProxyHttpServer()
	proxy.Logger = Logger{}
	proxy.Verbose = true
	auth.ProxyBasic(proxy, "my_realm", func(user, pwd string) bool {
		return user == config.Local.GetString("auth.user") && pwd == config.Local.GetString("auth.pass")
	})
	XPool := &utils.ProxyPool{}
	XPool.LoadFile("assets/proxies.txt")
	proxy.ConnectDialWithReq = func(reqr *http.Request, network, addr string) (net.Conn, error) {
		x := XPool.Next()
		userAgent := reqr.Header.Get("User-Agent")
		client := req.C()
		if userAgent != "" {
			// 设置随机的TLS指纹
			if strings.Contains(strings.ToLower(userAgent), "chrome") {
				client.ImpersonateChrome()
			} else if strings.Contains(strings.ToLower(userAgent), "firefox") {
				client.ImpersonateFirefox()
			} else if strings.Contains(strings.ToLower(userAgent), "safari") {
				client.ImpersonateSafari()
			} else if strings.Contains(strings.ToLower(userAgent), "edge") {
				client.SetTLSFingerprintEdge()
			} else if strings.Contains(strings.ToLower(userAgent), "iphone") || strings.Contains(strings.ToLower(userAgent), "ipad") {
				client.SetTLSFingerprintIOS()
			} else if strings.Contains(strings.ToLower(userAgent), "android") {
				client.SetTLSFingerprintAndroid()
			} else {
				client.SetTLSFingerprintChrome()
			}
		}
		client.SetTLSFingerprintRandomized()
		// 设置代理
		proxyURL := "http://" + x.Host + ":" + x.Port
		if x.Username != "" {
			proxyURL = "http://" + x.Username + ":" + x.Password + "@" + x.Host + ":" + x.Port
		}
		client.SetProxyURL(proxyURL)

		// 使用req库的底层传输层
		transport := client.GetTransport()

		// 创建一个自定义的拨号器,使用req库的传输层
		return transport.DialContext(context.Background(), network, addr)
	}
	log.Println("Port:", config.Local.GetString("port"))
	http.ListenAndServe(":"+config.Local.GetString("port"), proxy)
}

This didn't work, I needed to use the tls fingerprint of the req.

tocha688 avatar Apr 23 '25 09:04 tocha688

I rewrote the method, but I found that the request did not enter the proxy.OnRequest().DoFunc method github.com/elazarl/goproxy v1.7.2 // indirect

func getClient(XPool *utils.ProxyPool, reqr *http.Request) *req.Client {
	x := XPool.Next()
	userAgent := reqr.Header.Get("User-Agent")
	client := req.C()
	if userAgent != "" {
		// 设置随机的TLS指纹
		if strings.Contains(strings.ToLower(userAgent), "chrome") {
			client.ImpersonateChrome()
		} else if strings.Contains(strings.ToLower(userAgent), "firefox") {
			client.ImpersonateFirefox()
		} else if strings.Contains(strings.ToLower(userAgent), "safari") {
			client.ImpersonateSafari()
		} else if strings.Contains(strings.ToLower(userAgent), "edge") {
			client.SetTLSFingerprintEdge()
		} else if strings.Contains(strings.ToLower(userAgent), "iphone") || strings.Contains(strings.ToLower(userAgent), "ipad") {
			client.SetTLSFingerprintIOS()
		} else if strings.Contains(strings.ToLower(userAgent), "android") {
			client.SetTLSFingerprintAndroid()
		} else {
			client.SetTLSFingerprintChrome()
		}
	}
	client.SetTLSFingerprintRandomized()
	// 设置代理
	proxyURL := "http://" + x.Host + ":" + x.Port
	if x.Username != "" {
		proxyURL = "http://" + x.Username + ":" + x.Password + "@" + x.Host + ":" + x.Port
	}
	client.SetProxyURL(proxyURL)
	return client
}

func main() {
	proxy := goproxy.NewProxyHttpServer()
	// proxy.Logger = Logger{}
	proxy.Verbose = true
	auth.ProxyBasic(proxy, "my_realm", func(user, pwd string) bool {
		return user == config.Local.GetString("auth.user") && pwd == config.Local.GetString("auth.pass")
	})
	XPool := &utils.ProxyPool{}
	XPool.LoadFile("assets/proxies.txt")
	proxy.OnRequest().DoFunc(func(req *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) {
		cr := getClient(XPool, req)

		log.Println("Request URL:", req.URL.String())
		r := cr.NewRequest()

		//请求头
		for k, v := range req.Header {
			r.SetHeader(k, v[0])
		}
		//参数
		r.URL = req.URL
		r.Method = req.Method
		r.SetBody(req.Body)

		resp := r.Do()
		if resp.Err != nil {
			ctx.Logf("Failed to forward request: " + resp.Err.Error())
			return nil, nil
		}
		ctx.Logf("Succesfully forwarded request to socks proxy")
		return req, r.RawRequest.Response
	})

	log.Println("Port:", config.Local.GetString("port"))
	http.ListenAndServe(":"+config.Local.GetString("port"), proxy)
}

tocha688 avatar Apr 23 '25 09:04 tocha688