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

39 天前
 ToPoGE

请大佬们帮忙看下,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)
}
693 次点击
所在节点    程序员
10 条回复
body007
39 天前
这里有个 http 代理服务器,经过我的测试,你上面提供的 python 和 golang 代码都能正常执行。是不是你的代理服务器有特殊逻辑啊。

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


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

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

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

requests 2.31.0
Python 3.12.3
guanzhangzhang
39 天前
你抓包你 python 的和 go 的 http 请求,然后 curl 发下看看
winterpotato
39 天前
题外话,Go 的应用默认情况下会尊重 `http_proxy` 和 `https_proxy` 环境变量 。但是从楼上的回复来看,可能是你的代理的问题。
ToPoGE
39 天前
@winterpotato 实际上我疑问的就是代理,一个可以在 python 中使用一个在 Go 就没法用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1041589

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX