V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ToPoGE
V2EX  ›  程序员

Python 语言和 go 语言 http 请求使用代理的差异( Python 可以正常跑, go 不行)

  •  
  •   ToPoGE · 169 天前 · 864 次点击
    这是一个创建于 169 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请大佬们帮忙看下,go 怎么才能通过代理成功发起请求

    我也试了 php 也不行

    python 代码

    import requests
    
    
    def send_request_via_proxy(*args, **kwargs):
        baidu_proxy = 'http://cloudnproxy.baidu.com:443'
        kwargs['proxies'] = {'http': baidu_proxy, 'https': baidu_proxy}
        if 'headers' not in kwargs:
            kwargs['headers'] = {}
        if 'User-Agent' not in kwargs['headers']:
            kwargs['headers'][
                'User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 baiduboxapp/13.10.0.10'
    
        resp = requests.request(*args, **kwargs)
        print(resp.request.headers)
        print(resp.request)
        return resp
    
    
    if __name__ == '__main__':
        api = 'https://pubstatic.b0.upaiyun.com/?_upnode'
        ip_info = send_request_via_proxy('GET', api).json()
        print(ip_info['remote_addr'])
        print(ip_info['remote_addr_location'])
    
    

    go 代码

    package main
    
    import (
    	"fmt"
    	"io"
    	"log"
    	"net/http"
    	"net/url"
    	"time"
    )
    
    func main() {
    	URL, _ := url.Parse("http://cloudnproxy.baidu.com:443")
    	client := &http.Client{
    		Transport: &http.Transport{
    			TLSHandshakeTimeout: 30 * time.Second,
    			Proxy:               http.ProxyURL(URL),
    		},
    	}
    	req, err := http.NewRequest("GET", "https://pubstatic.b0.upaiyun.com/?_upnode", nil)
    	if err != nil {
    		log.Fatal(err)
    	}
    	req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36(KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 baiduboxapp/13.10.0.10")
    	resp, err := client.Do(req)
    	if err != nil {
    		log.Fatal(err)
    	}
    	defer resp.Body.Close()
    	bodyText, err := io.ReadAll(resp.Body)
    	if err != nil {
    		log.Fatal(err)
    	}
    	fmt.Printf("%s\n", bodyText)
    }
    
    10 条回复
    body007
        1
    body007  
       169 天前
    这里有个 http 代理服务器,经过我的测试,你上面提供的 python 和 golang 代码都能正常执行。是不是你的代理服务器有特殊逻辑啊。

    https://gist.github.com/jan-bar/b856c271712a6481260131dd66dd7ffe


    ToPoGE
        2
    ToPoGE  
    OP
       169 天前
    @body007 老哥尝试用我的上面的代理地址看看呢,只有 python 可以,但是 Go 不行
    ToPoGE
        3
    ToPoGE  
    OP
       169 天前
    @body007 问题主要就是如果使用百度的那个代理,python 那个写法就可以使用,Go 的话就会返回 403
    body007
        4
    body007  
       169 天前
    @ToPoGE 我还以为你这个代理我这边连不了呢。试了下,python 和 golang 都报错都是 403 拒绝,可能是代理服务器要认证或这别的特殊规则吧。

    body007
        5
    body007  
       169 天前
    @ToPoGE 用 curl 命令使用代理也报错啊。

    ToPoGE
        6
    ToPoGE  
    OP
       169 天前
    @body007 奇怪了,我这边只有 python 才能用,go 用不了,我试了 php 也不行
    body007
        7
    body007  
       169 天前
    @ToPoGE #6 我的 py 和库版本如下,不知道是不是 python 和库不同版本行为不一致导致你的 python 能用,反正代码我是完全复制你上面给的额。

    requests 2.31.0
    Python 3.12.3
    guanzhangzhang
        8
    guanzhangzhang  
       169 天前
    你抓包你 python 的和 go 的 http 请求,然后 curl 发下看看
    winterpotato
        9
    winterpotato  
       169 天前
    题外话,Go 的应用默认情况下会尊重 `http_proxy` 和 `https_proxy` 环境变量 。但是从楼上的回复来看,可能是你的代理的问题。
    ToPoGE
        10
    ToPoGE  
    OP
       169 天前
    @winterpotato 实际上我疑问的就是代理,一个可以在 python 中使用一个在 Go 就没法用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1191 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 18:21 · PVG 02:21 · LAX 11:21 · JFK 14:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.