来自weather.gov禁止的当前观察饲料(403)

时间:2015-09-17 22:40:16

标签: xml rss weather noaa

对于来自HTTPClient的所有请求,Weather.gov当前观察源突然开始失败,同样我发现互联网上许多使用AJAX来调用weather.gov的网站也都失败了。

对weather.gov当前观察馈送的所有调用的结果,例如http://w1.weather.gov/xml/current_obs/TAPA.xml,返回403.所述网址在浏览器中正确解析。

4 个答案:

答案 0 :(得分:18)

联系weather.gov得到了非常快速的回应,其中包括:

  

在weather.gov上访问资源的应用程序现在需要提供一个   任何HTTP请求中的User-Agent标头。没有用户代理的请求   被自动阻止。我们已实施此使用政策   少数客户利用的资源远远超过了什么   大多数人会认为合理。

     

我们建议使用以下格式提供用户代理字符串:

     

ApplicationName / vX.Y(http://your.app.url/; contact.email@example.com)

     

这将唯一标识您的应用程序并允许我们   如果我们观察到异常申请,请与您联系并与您合作   可能导致阻止的行为。

     

如果您以后继续遇到问题,请随时给我们发电子邮件   验证您的应用程序是否正在发送正确的标题。

     

感谢您使用weather.gov。

=======

这是一段C#代码。关键是您需要创建请求对象,然后在进行调用之前向其附加自定义用户代理字符串。

...
var request = new HttpRequestMessage(HttpMethod.Post, httpClient.BaseAddress.AbsoluteUri);
request.Headers.Add("User-Agent", "MyApplication/v1.0 (http://foo.bar.baz; foo@bar.baz)");
var httpResponse = httpClient.SendAsync(request).Result;
...

希望这有助于人们。 干杯

答案 1 :(得分:2)

这很棒,但你不能设置" User-Agent"当你使用XMLDocument并调用Load()时(这曾经工作):

        XmlDocument doc = new XmlDocument();
        string stationName = @"http://w1.weather.gov/xml/current_obs/PASC.xml";
        doc.Load(stationName);  // exception 403 occurs here now

现在您需要执行GET,然后将User-Agent设置为您的公司或电子邮件,然后使用XmlDocument,如:

       XmlDocument doc = new XmlDocument();

       string stationName = @"http://w1.weather.gov/xml/current_obs/PASC.xml";

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(stationName);

        request.Method = "GET";
        request.ContentType = "application/x-www-form-urlencoded";
        request.UserAgent = "MyApplication/v1.0 (http://foo.bar.baz; foo@bar.baz)";
        request.Accept = "Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream resStream = response.GetResponseStream();

        doc.Load(resStream);
        try
        {

            XmlNodeList list = doc.GetElementsByTagName("temp_f");
            if (list.Count > 0)
            {
                float fTemperature = float.Parse(list.Item(0).InnerText);

            }
        }

答案 2 :(得分:2)

关于您从Étude 12-1 Études for Elixir发现此问题的机会,这里有什么最终为我工作

  s_url = "http://w1.weather.gov/xml/current_obs/" <> weather_station <> ".xml"
 :httpc.request(:get, { to_char_list(s_url),
                        [ {'User-Agent','ErlangEtudes/v1.0 (http://example.org;me@example.org)' } ] 
                      },[],[] )

答案 3 :(得分:1)

我遇到了同样的问题,但使用的是PowerShell。这是一种使用HttpWebRequest设置用户代理的方法。

$weather_url = "http://w1.weather.gov/xml/current_obs/KLNK.xml"
$request = [System.Net.HttpWebRequest]::Create($weather_url)
$request.UserAgent = " {Enter your agent} "
$response = $request.GetResponse()

$doc = New-Object System.Xml.XmlDocument    
$doc.Load($response.GetResponseStream())

$temp_f = [int] $doc.current_observation.temp_f