Создание запроса API погоды Yahoo с OAuth 1
я столкнулся с проблемой с Yahoo Weather API, потому что он не давал мне никаких данных. После посещения сайта YDN я узнал, что все запросы должны быть обновлены до OAuth 1, начиная с 15 марта (но я получил работу только сегодня!). Это также включает приложение Yahoo Key и Secret. Как должен выглядеть url-адрес запроса, когда я должен использовать свой ключ приложения и секрет?
раньше я получал такую строку запроса:https://query.yahooapis.com/v1/public/yql?q=SOME_QUERY&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=
обновление
13 через несколько минут после того, как я задал этот вопрос, вызовы API с /v1/public/ endpoint снова работают. Но мне все равно интересно получить ответ на свой вопрос.
обновление
это снова вниз: (
4 ответов
текущее решение по состоянию на середину апреля 2016 года-Yahoo разрешает запросы YQL без Oauth снова из-за возмущения разработчиков
вы можете еще раз написать запрос без какой-либо аутентификации, как показано ниже:
https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22nome%2C%20ak%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys
предыдущие ответы ниже, если они были полезны для кого-либо. В определенные периоды изменений Yahoo они действительно работали.
Ниже приведены более старые версии этого ответа по историческим причинам, которые также могут Работа
обновленный ответ после последнего раунда обновлений Yahoo-небезопасный обходной путь OAuth
вам нужно будет создать учетную запись Yahoo , а затем создать веб-приложение вhttps://developer.yahoo.com/apps/create/
затем вам нужно будет использовать библиотеку OAuth для правильного кодирования вашего идентификатора клиента и секрет клиента. Вот пример в JavaScript, основанный на Yahoo Пример Страницы & a 2008 блог статья Павла Доннелли!--21-->. Это создает закодированный URL-адрес для запроса фида погоды.
//Fill in your consumer Key & Secret from Yahoo's App & adjust location as needed.
//This Key & Secret combination is invalid & won't work for you
var consumerKey = "dj0yJmk9NkRjbXpjUEhPbjlnJmQ9WVdrOVFUQTFaV2wxTjJrbXnHbz3NQSktJnM9Y29uc3VtZXJzZWNyZXQmeD0wOQ--";
var consumerSecret = "9bea8a9k3934d16365ek7e23e0abo1bba4q5c03c";
var locationToQuery = "90210"; //Can be zip code or anything that works in the query select woeid from geo.places(1) where text=<Your Location>
var makeSignedRequest = function(ck,cs,loc) {
var encodedurl = "https://query.yahooapis.com/v1/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22"+loc+"%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
var accessor = { consumerSecret: cs, tokenSecret: ""};
var message = { action: encodedurl, method: "GET", parameters: [["oauth_version","1.0"],["oauth_consumer_key",ck]]};
OAuth.setTimestampAndNonce(message);
OAuth.SignatureMethod.sign(message, accessor);
var parameterMap = OAuth.getParameterMap(message);
var baseStr = OAuth.decodeForm(OAuth.SignatureMethod.getBaseString(message));
var theSig = "";
if (parameterMap.parameters) {
for (var item in parameterMap.parameters) {
for (var subitem in parameterMap.parameters[item]) {
if (parameterMap.parameters[item][subitem] == "oauth_signature") {
theSig = parameterMap.parameters[item][1];
break;
}
}
}
}
var paramList = baseStr[2][0].split("&");
paramList.push("oauth_signature="+ encodeURIComponent(theSig));
paramList.sort(function(a,b) {
if (a[0] < b[0]) return -1;
if (a[0] > b[0]) return 1;
if (a[1] < b[1]) return -1;
if (a[1] > b[1]) return 1;
return 0;
});
var locString = "";
for (var x in paramList) {
locString += paramList[x] + "&";
}
var finalStr = baseStr[1][0] + "?" + locString.slice(0,locString.length - 1);
return finalStr;
};
//Use the encodedURL to make your request
var encodedURL = makeSignedRequest(consumerKey, consumerSecret, locationToQuery);
следует отметить, что никогда не показывать свой потребительский ключ или потребительский секрет общественности. Вы можете использовать свои собственные учетные данные Yahoo в этом Plunkr:http://plnkr.co/edit/EvLbgs
Оригинальный Ответ
к сожалению, на данный момент серверы не работают, чтобы создать это приложение. В идеале, после их резервного копирования вы можете использовать код на стороне сервера для выполнения oauth часть. Я попытаюсь отредактировать этот ответ, когда это произойдет. Согласно Yahoo, URL-адрес будет таким же, за исключением /public части. Большая разница будет в том, что вам нужно отправить заголовки запросов с URL-адресом, который аутентифицирует вашу учетную запись.
вот временное решение до тех пор. Вы все еще можете использовать гео-запрос YQL.места с почтовым индексом, чтобы получить woeid.
select * from geo.places where text=90210 limit 1
затем вы можете захватить свой woeid оттуда и использовать его в следующем url-адресе, чтобы получить xml подача:
http://weather.yahooapis.com/forecastrss?w=WOEID_GOES_HERE
Я создал Планкер в качестве примера этого временного исправления здесь:http://plnkr.co/edit/dClPDtnToMhHqvKpfCzj?p=preview
вот суть этого, хотя с помощью jQuery:
var zipCode = 90210;
$.ajax({
dataType: "json",
headers: { "Accept": "application/json; odata=verbose" },
url: "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20geo.places%20where%20text%3D"+zipCode+"%20limit%201&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys",
beforeSend: function(xhr){xhr.setRequestHeader('Accept', 'application/json; odata=verbose');},
success: function(data){
$.getJSON("https://query.yahooapis.com/v1/public/yql?callback=?", {
q: "select * from xml where url=\"https://weather.yahooapis.com/forecastrss?w="+data.query.results.place.locality1.woeid+"\"",
format: "json"
},function (data) {
var weather = data.query.results.rss.channel;
var html = '<div><span class="temperature">'+weather.item.condition.temp+'<span class="degree">°</span><sup>'+weather.units.temperature+'</sup></span><br><span class="wind-chill">Feels like: '+weather.wind.chill+'<span class="degree">°</span></span></div></a>';
$("#weather").html(html);
});
},
});
мы, наконец, получили нашу погоду yql, снова используя двуногую авторизацию с помощью yosdk: (https://github.com/isaacs/authentipede)
и, используя этот скрипт
<?php
include_once("yosdk/lib/Yahoo.inc");
define("API_KEY","your-api-key-here");
define("SHARED_SECRET","your-secret-here");
YahooLogger::setDebug(true);
$twoleg = new YahooApplication (API_KEY, SHARED_SECRET);
$query = 'select * from weather.forecast where woeid in (select woeid from geo.places(1) where text="84054") and u="f"';
print_r ($results);
Я нашел это обсуждение: (как начать работу с oauth for YQL за прошлые данные по акциям?)
по-видимому, он больше не работает с помощью публичный API. На данный момент, Вы должны будете использовать OAuth через Secret Key
.