Instagram API ошибка 500 хэштегов UTF-8 с принудительной подписью
Я получаю 500 ошибок из простого запроса GET Instagram. Мой код работает, когда хэштег содержит нормальные символы ascii или когда в моем приложении не установлен флажок "Принудительно подписывать запросы". Но я не могу заставить что-либо работать, когда пытаюсь использовать хэштег 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, если это проблема с сигнатурой. Я делаю что-то не так с кодировкой?
2 ответа
Я думаю, что эта проблема, по-видимому, является ошибкой Instagram API.
Я проверил различные шаблоны запросов.
"Принудительное выполнение подписанных запросов" включено
/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 (как и ожидалось)
"Принудительное выполнение подписанных запросов" отключено
/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 (как и ожидалось)
Когда "Принудительное выполнение подписанных запросов" включено, запрос, имеющий в своем URI не-ascii utf-8 символы, всегда получает 500. Если отключить его, все работает нормально. По-видимому, это не проблема, вызванная неправильным параметром sig или неправильной кодировкой.
Я уже сообщал об этой проблеме в Instagram через bugtool 10 дней назад. Никакой реакции от них пока нет.
(Извините, что отвечаю снова. Мой первый ответ был удален.)
[ОБНОВЛЕНИЕ 5 сентября.]
Наконец, эта проблема, кажется, исправлена.
Мое приложение IG теперь отлично работает с настройкой Enforce Signed Requests.
Примечание. Если конечная точка URI имеет символы в кодировке URL (например, /tags/%E3%81%82/media/ недавний), вам необходимо сгенерировать параметр sig из декодированной строки конечной точки.
Я только что получил сообщение из Instagram, сообщающее, что это действительно была ошибка, и теперь она исправлена! \ О /
Привет, Спасибо за ваш отчет и интерес к платформе Instagram. Проблема была исправлена. Бест, Джеки - команда Instagram