0
<< предыдущая заметкаследующая заметка >>
10 мая 2014
PHP: json_decode - слушайте, ну это вообще йобаный стыд!

Ситуация: разбираюсь с API Вконтактика - на моем тестовом домашнем сервере работает, на канадском сайте - нет. Почему? Вконтактик возвращает посылку в формате json:

{"response":[{"pid":328328322,"id":"photo83220314_328328322","aid":194496433,"owner_id":83220314,"src":"http:\/\/cs608929.vk.me\/v608929314\/9b2c\/_gMwKCSPHvQ.jpg","src_big":"http:\/\/cs608929.vk.me\/v608929314\/9b2d\/VRi0-64LxHg.jpg","src_small":"http:\/\/cs608929.vk.me\/v608929314\/9b2b\/s-iiUj9HIMA.jpg","width":3,"height":14,"text":"95% (864)<br><br>Нет, нашу Победу не отдадим никому!","created":1399682380}]}

Если вдруг у кого-то на хостинге нет поддержки JSON, я в коде PHP пишу заплатку:

if(!function_exists('json_decode')) { function json_decode( $string, $assoc_array = false ) {
эмулирующая библиотека
} }

Теперь следите за руками. На домашнем сервере JSON нет. Поэтому он эмулируется заплаткой и всё прекрасно работает. А вот в Канаде JSON есть. Поэтому заплатка не задействована. И этот самый встроенный json_decode на этой самой посылке спотыкается и возвращает пустой массив.

PHP Version 5.3.10-1ubuntu3.11
json support enabled
json version 1.2.1

Я хуею, дорогая редакция!

<< предыдущая заметка следующая заметка >>
пожаловаться на эту публикацию администрации портала
архив понравившихся мне ссылок
Оставить комментарий
Linux Ubuntu Firefox
 Ижевск
6
7
igel
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
в петоне все загружается нормально.
бейте лопатой авторов библиотеки за багу.
Linux Firefox
 Москва
1
0
Леонит Каганофф
Авторов какой, простите, библиотеки? Встроенной библиотеки php? Потому что библиотека-заплатка работает прекрасно.
Linux Ubuntu Firefox
 Москва
0
0
igel
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
да, авторов стандартной библиотеки.
лопатой, конечно, не обязательно, но багрепорт для приличия отправить стоит.

UPD. прочитал комментарии ниже. мда, как все печально неудобно с обработкой ошибок, однако.
Windows Firefox
 Москва
0
1
miyuki
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Ну, с виду JSON валидный. Смущает разве что вот это:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
в заголовке этой страницы. Строка перед json_decode никак не преобразуется (из UTF-8 в CP1251, например)? JSON должен быть в UTF-8.
А так вообще, можно поэкспериментировать, вырезая из этого JSON-а куски, пока не станет ясно, на чём именно спотыкается json_decode.
Linux Firefox
 Москва
0
0
Леонит Каганофф
Какое отношение имеет заголовок страницы html в браузере посетителя к процедуре json, которая выполняется на сервере?
Windows Firefox
 Новосибирск
0
0
Oreolek
Прямого не имеет, но если сервер тоже выдаёт JSON как text/html, а не application/json, то могут быть проблемы.
Windows Safari Chrome
 Москва
1
0
miyuki
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
Отношение, разумеется, косвенное. Раз страница отдаётся в CP1251, то и на сервере строки в каких-то участках кода обрабатываются в этой кодировке. Вот у меня и возникло подозрение: а вдруг строка с JSON-ом конвертируется в CP1251, а дальше вызывается json_decode.
В общем, я бы посмотрел, в какой кодировке возвращает vk строку (сделать bin2hex и записать в лог, например) и в какой кодировке она подаётся на вход json_encode. Можно, конечно, просто забить на это дело и всегда использовать "заплатку".
Ну и в порядке "общего бреда": не добавляется ли в HTTP-запрос на vk что-то типа заголовка "Accept-Charset" с не-utf8?
Linux Firefox
 Санкт-Петербург
1
0
SunChaser
PHP 5.6 всё расшифровывет. А что показывает функция json_last_error(), запущенная сразу после такого?
Linux Firefox
 Москва
0
0
Леонит Каганофф
Спасибо попробовал - показывает "5".
Linux Firefox
 Санкт-Петербург
1
0
SunChaser
как ни странно, товарищ коментом выше прав
5 это JSON_ERROR_UTF8 (Malformed UTF-8 characters, possibly incorrectly encoded) — json обязан быть в валидном UTF-8, сp1251 не катит
Windows Safari Chrome
 Москва
0
0
miyuki
Этот человек не загрузил свой юзерпик, и я подобрал ему этот. Человек, пишущий такое, должен именно так выглядеть, верно?
По поводу PHP 5.6 - как вы это определили? Если просто скопипастили из браузера - то это мало о чём скажет. Текст в буфер копируется или вместе с информацией о кодировке или сразу в юникоде (что в виндах, что в X11 - специально полуркал).
А если посмотреть исходник страницы, то по нему тоже трудно что-то понять о том, что же было скормлено json_decode-у (там всё поэскейплено).
P.S. Но это всё уже тонкости (и даже занудство) :)
Linux Ubuntu Firefox
 Белоруссия
0
0
meequz
Где-то у вас ошибка. Под каждой фоткой в контакте подпись к следующей, а не к ней.
Linux Firefox
 Москва
0
0
Леонит Каганофф
Это сделано специально, чтобы при сборе пост выглядел цельным постом с текстом и фотками. Отдельно просматривать фотографии в отрыве от поста - нет, на это не затачивалось.
Linux Ubuntu Firefox
 Белоруссия
0
0
meequz
А смысл не затачивать на это, если все смотрят фотки поста из своей ленты, листая их? Редко кто открывает пост отдельной страницей.
Linux Firefox
 Москва
0
0
Леонит Каганофф
Я не очень значит понимаю устройство вконтакта.

Давайте попробуем разобраться.

1. Задача: максимально корректно отобразить пост из блога так, чтобы его могли легко и удобно читать пользователи Вконтакта.

2. У меня есть в блоге некий пост, который состоит из текста, перемежающегося фотками. Сразу оговорим, что пост писался для моего блога, и никакого другого поста у меня нет и вручную подготовлено не будет - речь об организации автоматической трансляции имеющегося без приложения ручных усилий.

3. Я никогда не создаю фотоальбомы ради выкладывания верениц всяких пляжных, путевых и прочих фоток. Сами по себе фотографии у меня не являются целью публикации в отрыве от текста и контекста. Мне нет смысла делать усилия по публикации фотографий (для примера представим, что это фотка рукоятки электроплиты), если читатель увидит это в фотоальбоме и не будет обладать остальной информацией из поста о том, что это, с какой целью и для иллюстрации чего выложено.

4. Вконтакт позволяет залить фотки (с короткими подписями) и публиковать текст поста на стену. В этом случае пост выглядит как текст со вставленными в разных местах фотками. Если фотки публиковать без подписей - они просто сгрудятся кучей внизу поста, и будет неясно, о чем речь.

5. Я не нашел возможности публиковать пост с вставкой фоток в нужных местах. Есть возможность делать некую "заметку", но она, насколько я понял, не отображается в лентах для удобного просмотра без дополнительного клика. А если заставлять людей кликать, чтобы "прочитать больше" - то нахуя тогда заметка, пусть тогда прямо на мой сайт попадают.

Как-то так формулируется задача.

Что бы вы предложили?

PS: Я, конечно, могу как в Твиттере и Фейсбуке - постить голый текст или его кусок с предложением "читать дальше на моем сайте". Тогда и фотки не нужны. Но нет ли идеи умнее?
Linux Firefox
 Белоруссия
0
0
meequz
В ВК пост имеет две части. Первая - текст. Вторая - вложения, до десяти штук. Обычно это фотки. Под каждой фоткой можно написать небольшой комментарий. Упрощая, можно сказать, что пользователь вк приучен прочесть текст, посмотреть фотки под ним и перейти к следующему посту.

Сделать полноценную запись с кучей текста, потом фотками, потом снова текстом, как в жж или у вас в блоге, в контакте нельзя. Если очень хочется, есть заметки и вики-страницы. Но они да, без дополнительного клика не откроются.

Выход я вижу такой: постить сначала весь текст, а потом фотки с подписями. Ведь и в вашем дневнике подпись отображается под фоткой, если кликнуть на неё.

Можно, кстати, больше десяти фоток, но тогда надо создать так называемый альбом и вставить его ссылку в пост. Контакт её подхватит и отобразит как приложенный альбом. Фотки из него будут листаться так же удобно.

Откройте в ленте vk.com/feed любой пост с фотками и пощёлкайте по ним, должно стать ясно.

Если ещё какие вопросы по вконтакту, с удовольствием отвечу.
Linux Firefox
 Москва
0
0
Леонит Каганофф
а могу я создавать по новому альбому на каждый пост?
Linux Firefox
 Москва
0
0
Леонит Каганофф
в смысле - в посте ограничение 10 фотографий, а какое ограничение по альбомам - сколько их себе может создать пользователь?
Linux Ubuntu Firefox
 Белоруссия
0
0
meequz
Наверное бесконечность, не слышал чтобы были ограничения на это. Извинясь за задержку с ответом, уведомление о коменте gmail положил в спам.

всего комментариев: 19

<< предыдущая заметка следующая заметка >>