Выполнение запроса API Yahoo Weather с помощью OAuth 1

У меня возникла проблема с Yahoo Weather API, потому что это не давало мне никаких данных. После посещения веб-сайта YDN я узнал, что все запросы должны быть обновлены до OAuth 1 с 15 марта (но я получил работу только сегодня!). Он также сказал, что включает в себя ключ Yahoo и секрет. Какой URL-адрес запроса должен выглядеть сейчас, когда я должен использовать ключ приложения и секрет?

До этого я получил такую ​​строку запроса: https://query.yahooapis.com/v1/public/yql?q=SOME_QUERY&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=

UPDATE

Через 13 минут после того, как я изначально задал этот вопрос, API-вызовы с /v 1/public/endpoint снова работают. Но мне все же интересно получить ответ на мой вопрос.

UPDATE

Снова снова: (

Ответы

Ответ 2

Текущее решение По состоянию на середину апреля 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 и Блог 2008 года Статья Пола Доннелли. Это генерирует кодированный URL-адрес, который будет использоваться для запроса прогноза погоды.

//Fill in your consumer Key & Secret from Yahoo 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-адрес будет таким же, за исключением без/публичной части. Большая разница будет заключаться в том, что вам нужно отправить заголовки запросов с URL-адресом, который аутентифицирует вашу учетную запись.

Здесь временное исправление до тех пор. Вы можете по-прежнему использовать geo.places запроса YQL с почтовым индексом, чтобы получить woeid.

select * from geo.places where text=90210 limit 1

Затем вы можете схватить свою woeid и использовать ее в следующем URL-адресе, чтобы получить XML файл:

http://weather.yahooapis.com/forecastrss?w=WOEID_GOES_HERE

Я создал Plunker в качестве примера этого временного исправления здесь: 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">&deg;</span><sup>'+weather.units.temperature+'</sup></span><br><span class="wind-chill">Feels like: '+weather.wind.chill+'<span class="degree">&deg;</span></span></div></a>';
          $("#weather").html(html);
        });
    },
});

Ответ 3

Наконец, мы снова получили нашу yql-погоду, используя двунаправленную авторизацию с помощью yosdk: (https://github.com/isaacs/authentipede)

И используя этот script

<?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 для YQL для исторических данных запаса?)

Ответ 4

По-видимому, он больше не работает, используя Открытый API. Теперь вы должны будете использовать OAuth через Secret Key.