web-dev-qa-db-fra.com

Faire une requête Yahoo Weather API avec OAuth 1

J'ai rencontré un problème avec Yahoo Weather API car il ne me donnait aucune donnée. Après avoir visité le site Web de YDN, j'ai découvert que toutes les demandes devraient être mises à jour vers OAuth 1 à partir du 15 mars (mais je l'ai travaillé juste aujourd'hui!). Il est également censé inclure la clé de l'application Yahoo et à quoi devrait ressembler l'URL de demande maintenant, quand je dois utiliser la clé et le secret de mon application?

Avant, je recevais une telle chaîne de requête: https://query.yahooapis.com/v1/public/yql?q=SOME_QUERY&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=

MISE À JOUR

13 minutes après avoir initialement posé cette question, les appels d'API avec/v1/public/endpoint fonctionnent à nouveau. Mais il est toujours intéressant pour moi d'obtenir une réponse à ma question.

MISE À JOUR

Il est à nouveau en baisse :(

16
phbelov

Si vous remplacez simplement

http://weather.yahooapis.com/

avec

http://xml.weather.yahoo.com/

ça devrait marcher;)

12
Tadej

Solution actuelle à la mi-avril 2016 - Yahoo autorise les demandes YQL sans Oauth Again en raison de l'indignation des développeurs

Vous pouvez à nouveau écrire une requête sans aucune authentification comme celle-ci:

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

Réponses précédentes ci-dessous au cas où elles aideraient quelqu'un. Pendant certaines périodes des changements de Yahoo, ils ont fonctionné.


Vous trouverez ci-dessous des versions plus anciennes de cette réponse pour des raisons historiques qui peuvent également fonctionner


Réponse mise à jour après la dernière série de mises à jour de Yahoo - Insécurité OAuth Solution de contournement

Vous devrez créer un compte Yahoo, puis créer une application Web à l'adresse https://developer.yahoo.com/apps/create/

Vous devrez ensuite utiliser une bibliothèque OAuth pour coder correctement votre ID client et secret client. Voici un exemple en JavaScript basé sur un Page d'exemple Yahoo & a - Article de blog 2008 par Paul Donnelly . Cela génère une URL encodée à utiliser pour demander un flux météo.

//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); 

Il convient de noter de ne jamais montrer votre clé de consommateur ou votre secret de consommateur au public. Vous pouvez utiliser vos propres informations d'identification Yahoo dans ce Plunkr: http://plnkr.co/edit/EvLbgs

Réponse originale

Malheureusement, en ce moment, les serveurs sont en panne pour créer cette application. Idéalement, une fois qu'ils sont sauvegardés, vous pouvez utiliser le code côté serveur pour faire la partie oauth. J'essaierai de modifier cette réponse lorsque cela se produira. Selon Yahoo, l'URL sera la même sauf sans la partie/public. La grande différence sera que vous devez envoyer des en-têtes de demande avec l'URL qui authentifie votre compte.

Voici une solution temporaire jusque-là. Vous pouvez toujours utiliser une géolocalisation de requête YQL avec un code postal pour obtenir le malheur.

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

Vous pouvez ensuite récupérer votre malheur à partir de là et l'utiliser dans l'url suivante pour obtenir un flux xml:

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

J'ai créé un Plunker comme exemple de ce correctif temporaire ici: http://plnkr.co/edit/dClPDtnToMhHqvKpfCzj?p=preview

Voici l'essentiel en utilisant 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);
        });
    },
});
5
mattferderer

Nous avons enfin fait fonctionner à nouveau notre météo yql en utilisant une autorisation à deux pattes en utilisant yosdk: ( https://github.com/isaacs/authentipede )

Et en utilisant ce 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);

J'ai trouvé cela à partir de cette discussion: ( Comment puis-je commencer avec oauth pour YQL pour les données de stock historiques? )

4
Gian O'Neil

Apparemment, il est censé ne plus fonctionner avec API publique. Pour l'instant, vous devrez utiliser OAuth à Secret Key.

2
Llogari Casas