V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
douyacun
V2EX  ›  Go 编程语言

go 代理: http/socks5 proxy

  •  
  •   douyacun ·
    douyacun · 2021-01-14 10:56:52 +08:00 · 874 次点击
    这是一个创建于 1413 天前的主题,其中的信息可能已经有所发展或是发生改变。

    博客地址:https://www.douyacun.com

    http 代理

    正确的 http 代理使用姿势

    proxy, _ := url.Parse("http://127.0.0.1:1081")
    clt := http.Client{
      Timeout: 5 * time.Second,
      Transport: &http.Transport{
        Proxy:           http.ProxyURL(proxy),  // 使用代理请求
        TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // 跳过 https 证书资格验证
      },
    }
    resp, err := clt.Get(fmt.Sprintf("http://www.google.com/ping?sitemap=%s", sitemapUrl))
    

    go http 提供了 2 个函数:

    // 使用环境变量: HTTP_PROXY,HTTPS_PROXY
    func ProxyFromEnvironment(req *Request) (*url.URL, error)
    // 指定端口
    func ProxyURL(fixedURL *url.URL) func(*Request) (*url.URL, error)
    

    Socks5 代理

    http 代理直接使用 http 包即可完成,不过 socks5 就得用: golang.org/x/net/proxy

    package main
    
    import (
    	"crypto/tls"
    	"fmt"
    	"golang.org/x/net/proxy"
    	"io/ioutil"
    	"log"
    	"net/http"
    	"time"
    )
    
    func main() {
    	dialer, err := proxy.SOCKS5("tcp", "127.0.0.1:1080", nil, proxy.Direct)
    	if err != nil {
    		log.Fatalf("socks5 init err: %s", err.Error())
    		return
    	}
    	clt := http.Client{
    		Timeout: 5 * time.Second,
    		Transport: &http.Transport{
    			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
    			Dial:            dialer.Dial,
    		},
    	}
    	resp, err := clt.Get("https://www.google.com")
    	if err != nil {
    		log.Fatalf("ping google sitemap err: %s", err.Error())
    		return
    	}
    	defer resp.Body.Close()
    	if resp.StatusCode != http.StatusOK {
    		log.Fatalf("curl google failed~")
    		return
    	}
    	body, err := ioutil.ReadAll(resp.Body)
    	if err != nil {
    		log.Fatalf("google response body read err: %s", err.Error())
    	}
    	fmt.Println(string(body))
    	return
    }
    

    结果是可以正常返回的,服务器是在北京的。

    image-20210103211632721

    1 条回复    2021-01-14 22:51:59 +08:00
    douyacun
        1
    douyacun  
    OP
       2021-01-14 22:51:59 +08:00
    我是因为博客接了 Github 登录(京东云,因为便宜)大部分情况都是超时的,当时的做法是租一个阿里云香港的服务器( 25¥),然后 go 写了一套的代理来访问, 只做这一件事情有点奢侈~,毕竟有其他的 ss
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2732 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 00:20 · PVG 08:20 · LAX 16:20 · JFK 19:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.