Возникли проблемы с доступом к файлу JSON из API - получена ошибка 403 (однако работает с другого сервера) - PullRequest
0 голосов
/ 16 апреля 2019

При доступе к https://api.weather.gov/products/fead3465-2e6f-4350-ae90-15aaa61b91ff для получения строки JSON я получаю (403): Запрещенная ошибка. Тот же код успешно работает с другим другим URL-адресом (http://mesonet.agron.iastate.edu/json/nwstext_search.py?sts=2019-04-15T00:00Z&ets=2019-04-18T00:00Z&awipsid=PNSBOX),, однако этот URL-адрес не такой надежный, как api.weather.gov.

Я не уверен, что мне нужно эмулировать учетные данные браузера для доступа к этому JSON из API. Я пишу код с помощью Windows Powershell 2.0 (не могу обновить, к сожалению).

$url = "https://api.weather.gov/products/fead3465-2e6f-4350-ae90-15aaa61b91ff"  
$WebRequest = [System.Net.WebRequest]::Create($url)
$WebRequest.Method = "GET"
$WebRequest.ContentType = "application/json"
$WebRequest.UseDefaultCredentials = $true
$Response = $WebRequest.GetResponse()
$ResponseStream = $Response.GetResponseStream()
$ReadStream = New-Object System.IO.StreamReader $ResponseStream
$data = $ReadStream.ReadToEnd()

[System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
$ser = New-Object System.Web.Script.Serialization.JavaScriptSerializer
$json = $ser.DeserializeObject($data)
echo $json

Ожидаем увидеть JSON, но получим (403): запрещенная ошибка.

1 Ответ

0 голосов
/ 16 апреля 2019

Глядя на FAQ по этому API , я вижу, что они упоминают UserAgent.Я смог заставить это работать для меня, если я укажу другой UserAgent.Я бы пересмотрел их лицензию на API, чтобы убедиться, что это действительный / законный способ доступа к этому API, чтобы убедиться, что вы не получаете к нему доступ в соответствии с их условиями использования.

$url = "https://api.weather.gov/products/fead3465-2e6f-4350-ae90-15aaa61b91ff"  
$WebRequest = [System.Net.WebRequest]::Create($url)
$WebRequest.Method = "GET"
$WebRequest.ContentType = "application/json"
$WebRequest.UserAgent = 'Mozilla/5.0 (Windows NT; Windows NT 6.1; en-US) AppleWebKit/534.6 (KHTML, like Gecko) Chrome/7.0.500.0 Safari/534.6'
$Response = $WebRequest.GetResponse()
$ResponseStream = $Response.GetResponseStream()
$ReadStream = New-Object System.IO.StreamReader $ResponseStream
$data = $ReadStream.ReadToEnd()

[System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
$ser = New-Object System.Web.Script.Serialization.JavaScriptSerializer
$json = $ser.DeserializeObject($data)
echo $json
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...