Instagram API 带有强制签名的错误 500 UTF-8 主题标签

Instagram API error 500 UTF-8 hashtags with enforced signature

我从简单的 Instagram GET 请求中收到 500 错误。当主题标签包含正常的 ascii 字符时,或者当我的应用程序未选中复选框 "Enforce signed requests" 时,我的代码有效。但是当我尝试使用 utf8 主题标签并强制执行签名请求时,我什么也做不了。我看到签名的请求很快就会成为强制性的,所以我需要它来工作。我想获取像#über 这样的标签的所有图像。

public static String signRequest(String key, String data) throws Exception {
    Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
    SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
    sha256_HMAC.init(secret_key);
    return Hex.encodeHexString(sha256_HMAC.doFinal(data.getBytes("UTF-8")));
}

public static void getLatestImagesForHashtag(String hashtag, String client_id, String secret) throws Exception {
    String endpoint = "/tags/" + URLEncoder.encode(hashtag, "UTF-8") + "/media/recent";
    String request_data = endpoint + "|client_id=" + client_id;
    System.out.println("SIGNING DATA: " + request_data);
    String signature = InstagramUtil.signRequest(secret, request_data);
    System.out.println("SIG VAL: " + signature);
    String url = "https://api.instagram.com/v1" + endpoint + "?client_id=" + client_id + "&sig=" + signature;
    URL obj;
    try {
        obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        //Blah blah blah

我得到的回应

Info:   SIGNING DATA: /tags/%C3%BCber/media/recent|client_id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Info:   SIG VAL: 503fd3fb7072eea8284576940b3fe75125a5bbbd9f505f22507776cbb6760d5d
Info:   Sending 'GET' request to URL : https://api.instagram.com/v1/tags/%C3%BCber/media/recent?client_id=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&sig=503fd3fb7072eea8284576940b3fe75125a5bbbd9f505f22507776cbb6760d5d
Info:   Response Code : 500
Info:   Response Msg : INTERNAL SERVER ERROR

数据响应是:糟糕,发生错误。

我已经尝试了很多不同的组合来对端点和签名数据中的主题标签进行编码。奇怪的是,如果是签名问题,我会收到 500 错误而不是 403。我是不是编码有问题?

我认为这个问题显然是 Instagram 的一个错误 API。
我测试了各种请求模式。

"Enforce signed requests" 已启用

/v1/tags/search?access_token=<access token>&q=%e3%81%82&sig=<correct sig>

-> 500(预计 200)

/v1/tags/search?access_token=<access token>&q=%e3%81%82&sig=<incorrect sig>

-> 500(预期 403)

/v1/tags/search?access_token=<access token>&q=%e3%81%82

-> 403(如预期)

/v1/tags/search?access_token=<access token>&q=abc&sig=<correct sig>

-> 200(如预期)

"Enforce signed requests" 已禁用

/v1/tags/search?access_token=<access token>&q=%e3%81%82&sig=<correct sig>

-> 200(符合预期)

/v1/tags/search?access_token=<access token>&q=%e3%81%82&sig=<incorrect sig>

-> 403(如预期)

启用 "Enforce signed requests" 时,其 uri 中包含非 ascii utf-8 字符的请求始终为 500。如果关闭它,一切正常。这显然不是由错误的 sig 参数或错误的编码引起的问题。
我已经在 10 天前通过 bugtool 向 Instagram 报告了这个问题。到目前为止他们没有任何反应。
(抱歉再次回答,我的第一个回答被删除了。)

[9 月 5 日更新]
这个问题终于解决了。
我的 IG 应用现在可以在 Enforce Signed Requests 设置下正常工作。
注意:如果端点 uri 具有 url 编码的字符(例如 /tags/%E3%81%82/media/recent),则需要从解码的端点字符串生成 sig 参数。

我刚刚收到来自 Instagram 的消息,告诉我这确实是一个错误,现在已修复! \o/

Hi, Thanks for your report and interest in the Instagram platform. The issue has been fixed. Best, Jackie - Instagram team