【问题标题】:How to oAuth weather yahoo api如何 oAuth 天气 yahoo api
【发布时间】:2016-04-29 10:00:44
【问题描述】:

我使用此代码从 yahoo 访问天气数据,一切正常。 不知何故,这会停止从雅虎收到“错误请求”...

"请提供有效的凭据。OAuth oauth_problem="OST_OAUTH_PARAMETER_ABSENT_ERROR", realm="yahooapis.com" "

我试图了解发生了什么,我认为这与 yahoo 的 oAuth 有关,但我不知道如何使用它,而且 yahoo 的文档很烂...

下面的代码..

mForcastTown.Add(MainForm.ExtraFE_IdHttp.Get('http://weather.yahooapis.com/forecastrss?w='+ mAdd_Town[mTonwNum].mWoeID +'&u='+ mAdd_Town[mTonwNum].mDegree);

谢谢...

更新...

我在下面找到了这个,当在浏览器中运行时,我得到了我需要的 xml,但是当我将它运行到

IdHttp.get('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid=55903793%20and%20u=%27c%27&format=xml') 

我发现未知版本...

这是什么... 谢谢...

【问题讨论】:

  • 您必须提供 OAuth 身份验证信息才能访问此 API。
  • smooty86...我想通了,但我不知道该怎么做你有什么例子可以帮助我...谢谢...
  • 您可以阅读它......当您在浏览器中完成这些步骤一次然后重复使用您的“密钥”时可能就足够了(将其添加为自定义标题 IdHttp.Requests.CustomHeaders['OAuth ']="你的钥匙")。文档:developer.yahoo.com/oauth
  • @smooty86:提供 OAuth 参数的正确方法是使用 Authorization 标头,而不是 OAuth 标头。对于 OAuth 1,使用:IdHttp.Requests.CustomHeaders['Authorization'] := 'OAuth <parameters>'; 对于 OAuth 2,使用:IdHttp.Requests.CustomHeaders['Authorization'] := 'Bearer <base64 encoded parameters>'; 请参阅 Using OAuth in Yahoo API RequestsMaking API Requests
  • 对错误信息表示抱歉。我很着急,这只是一个例子。我没有考虑清楚。

标签: delphi delphi-7 indy weather-api


【解决方案1】:

我对 Java 也有同样的问题,也许这会引导你找到一些东西。

在这个link中有一个示例java代码:

    // Copyright 2019 Oath Inc. Licensed under the terms of the zLib license see https://opensource.org/licenses/Zlib for terms.
    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;

    import java.util.List;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.Base64;
    import java.util.Base64.Encoder;
    import java.util.Random;
    import java.util.Collections;
    import java.net.URLEncoder;
    import java.net.http.HttpClient;
    import java.net.http.HttpRequest;
    import java.net.http.HttpResponse;
    import java.net.http.HttpResponse.BodyHandlers;
    import java.net.URI;

    /**
    *
    * <pre>
    * % java --version
    * % java 11.0.1 2018-10-16 LTS
    *
    * % javac WeatherYdnJava.java && java -ea WeatherYdnJava
    * </pre>
    *
    */
    public class WeatherYdnJava {
        public static void main(String[] args) throws Exception {

            final String appId = "test-app-id";
            final String consumerKey = "your-consumer-key";
            final String consumerSecret = "your-consumer-secret";
            final String url = "https://weather-ydn-yql.media.yahoo.com/forecastrss";

            long timestamp = new Date().getTime() / 1000;
            byte[] nonce = new byte[32];
            Random rand = new Random();
            rand.nextBytes(nonce);
            String oauthNonce = new String(nonce).replaceAll("\\W", "");

            List<String> parameters = new ArrayList<>();
            parameters.add("oauth_consumer_key=" + consumerKey);
            parameters.add("oauth_nonce=" + oauthNonce);
            parameters.add("oauth_signature_method=HMAC-SHA1");
            parameters.add("oauth_timestamp=" + timestamp);
            parameters.add("oauth_version=1.0");
            // Make sure value is encoded
            parameters.add("location=" + URLEncoder.encode("sunnyvale,ca", "UTF-8"));
            parameters.add("format=json");
            Collections.sort(parameters);

            StringBuffer parametersList = new StringBuffer();
            for (int i = 0; i < parameters.size(); i++) {
                parametersList.append(((i > 0) ? "&" : "") + parameters.get(i));
            }

            String signatureString = "GET&" +
                URLEncoder.encode(url, "UTF-8") + "&" +
                URLEncoder.encode(parametersList.toString(), "UTF-8");

            String signature = null;
            try {
                SecretKeySpec signingKey = new SecretKeySpec((consumerSecret + "&").getBytes(), "HmacSHA1");
                Mac mac = Mac.getInstance("HmacSHA1");
                mac.init(signingKey);
                byte[] rawHMAC = mac.doFinal(signatureString.getBytes());
                Encoder encoder = Base64.getEncoder();
                signature = encoder.encodeToString(rawHMAC);
            } catch (Exception e) {
                System.err.println("Unable to append signature");
                System.exit(0);
            }

            String authorizationLine = "OAuth " +
                "oauth_consumer_key=\"" + consumerKey + "\", " +
                "oauth_nonce=\"" + oauthNonce + "\", " +
                "oauth_timestamp=\"" + timestamp + "\", " +
                "oauth_signature_method=\"HMAC-SHA1\", " +
                "oauth_signature=\"" + signature + "\", " +
                "oauth_version=\"1.0\"";

            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url + "?location=sunnyvale,ca&format=json"))
                .header("Authorization", authorizationLine)
                .header("X-Yahoo-App-Id", appId)
                .header("Content-Type", "application/json")
                .build();

            HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
            System.out.println(response.body());
        }
    }

此代码的问题在于oauthNonce 生成随机字节。在这里,错误是由无法识别的字符引起的。因为对于任何随机字节,都可能存在系统无法识别且无法处理的任何字符,因为它将其转换为字符串。

我用这个替换整个部分:

String oauthNonce = RandomStringUtils.random(10, true, true);

它就像一个魅力。我目前没有任何错误并且能够得到响应。我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多