如何避免一些网站拒绝 HTTP get 使用 go
How to avoid some sites rejecting HTTP get using go
我们有一个脚本,每天检查我们所有数据库记录中的所有网络 link(用户希望在 link 过时时收到通知)。
有几个站点可以通过 Web 浏览器从此 IP 地址正常工作,但是当通过 GO 获取时,它们要么在完成请求之前断开连接,要么 return HTTP 授权被拒绝消息。
我假设某种防火墙 (F5) 是 filtering/blocking 请求。即使我将 HTTP 请求更改为使用通用用户代理,也会发生这种情况。我们可以做些什么来确保 GO 请求看起来像标准浏览器?
func fetch_url(url string, d time.Duration) (int, error) {
client := &http.Client{
Timeout: d,
}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return 0, err
}
req.Header.Set("User-Agent", "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53")
resp, err := client.Do(req)
if err != nil {
return 0, err
}
status := resp.StatusCode
resp.Body.Close()
return status, nil
}
尝试匹配网络浏览器请求中的确切 headers 以排除其他因素。智能防火墙可以启发式判断网络浏览器与机器人的区别。
请注意,go http 客户端仅发送最小的 HTTP 请求:
GET /foo HTTP/1.1
Host: localhost:3030
User-Agent: Go 1.1 package http
Accept-Encoding: gzip
而网络浏览器则更繁琐:
GET /foo HTTP/1.1
Host: localhost:3030
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
我们有一个脚本,每天检查我们所有数据库记录中的所有网络 link(用户希望在 link 过时时收到通知)。
有几个站点可以通过 Web 浏览器从此 IP 地址正常工作,但是当通过 GO 获取时,它们要么在完成请求之前断开连接,要么 return HTTP 授权被拒绝消息。
我假设某种防火墙 (F5) 是 filtering/blocking 请求。即使我将 HTTP 请求更改为使用通用用户代理,也会发生这种情况。我们可以做些什么来确保 GO 请求看起来像标准浏览器?
func fetch_url(url string, d time.Duration) (int, error) {
client := &http.Client{
Timeout: d,
}
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return 0, err
}
req.Header.Set("User-Agent", "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53")
resp, err := client.Do(req)
if err != nil {
return 0, err
}
status := resp.StatusCode
resp.Body.Close()
return status, nil
}
尝试匹配网络浏览器请求中的确切 headers 以排除其他因素。智能防火墙可以启发式判断网络浏览器与机器人的区别。
请注意,go http 客户端仅发送最小的 HTTP 请求:
GET /foo HTTP/1.1
Host: localhost:3030
User-Agent: Go 1.1 package http
Accept-Encoding: gzip
而网络浏览器则更繁琐:
GET /foo HTTP/1.1
Host: localhost:3030
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8