我们有一个脚本,每天检查所有数据库记录中的所有Web链接(当链接过期时,用户需要通知)。
有几个站点可以通过Web浏览器从这个IP地址正常工作,但是当通过GO获取时,它们会在完成请求之前断开连接或返回HTTP授权拒绝消息。
我假设某种防火墙(F5)正在过滤/阻止请求。即使我更改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
}
答案 0 :(得分:3)
尝试匹配来自网络浏览器的请求中的确切标头,以消除其他因素。智能防火墙可以在网络浏览器和机器人之间进行启发式扫描。
请注意,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