Pull to refresh

Comments 38

А уже работающие приложения с использования Javascript API можно посмотреть?
понятно — спасибо
настроение поднялось =))
Секаса осенна многа, насяльника.

«Пользовательские» методы API используют куки для проверки авторизации. Передать эти куки на свой домен через iframe — отдельная проблема.
Не труъ, аякс рулит. Сам сначала пытался через пхп сделать, потом заюзал скрипт автора и я понял, что на аяксе будет гараздо проще. А пхп там все равно пригодился, с методами secure.* не секьюрно через аякс работать.
А почему бы не обращатся к своему сценарию на PHP через AJAX? И сделать чтобы свой сценарий на PHP высчитывал «эти» подписи?
Да, это повысит безопасность приложения — секретный ключ больше не будет фигурировать в клиентской части ни в каком виде. И если это критично, то можно так и делать.

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

Все финансовые операции проводятся через механизм защищенного взаимодействия, в котором участвует совершенно другой ключ, не фигурирующий на стороне клиента. Кроме того, приложение выполняется в контексте определенного пользователя, так что навредить другому пользователю, злоумышленник не сможет — только себе. Приложению злоумышленник тоже никак не навредит, потому что от имени администратора он все равно не сможет никакие API-функции выполнить.

В общем, красть секретный ключ и подделывать подпись совершенно бесполезно. И ничего страшного, даже если этот ключ будет в тексте в открытом виде. Вообще, из Flash-приложений этот ключ тоже извлекается, при желании.
Объясните плз как без JSONP получать ответы api-сервера вконтакте. Насколько я понимаю, json-ответ так и приходит в json-формате, без вызова какого-либо метода. То есть по событию загрузки динамически созданного тега script приложение выкинет JS ошибку. То есть это будет равноценно тому, что у нас на странице появится что-то типа:
<script>
{answer: [some_answer_in_vk_format]}
</script>


а не
<script>
hadle_answer({answer: [some_answer_in_vk_format]});
</script>

Все, понял, скачал ваш код. Про параметр callback нигде в доках vkontakte Iframe API не написано. Откуда вы про него узнали? Вы — Дуров? :)
Про параметр callback нигде в доках vkontakte Iframe API не написано.

О, да. По началу, это меня выбило из колеи. Обнаружил чисто случайно, когда экспериментировал с jQuery.
Речь шла о get-параметре callback в API вконтакта, это во первых. Во вторых, в jsonp нет никаких стандартных параметров, callback там уже обрамляет json-ответ.
Я прекрасно понял о чем идет речь. Насчет стандартной я преувеличил, но например в JQuery — по умолчанию передается параметр с названием callback для того, чтобы реализовать кросс доменный JSONP запрос.
А мне объясните — что толкает вас (разработчики) на переход с одного единого файла (swf) на сотню (html, css, js, jpg...)? — и на переход с того, что выполняется одинаково на любом браузере, на чехарду с парком браузеров пользователей(?) В чём есть огромнейшее преимущество перед SWF, что вы готовы на такой геморрой?
А мне объясните — что толкает вас (разработчики) на переход с одного единого файла (swf) на сотню (html, css, js, jpg...)?

Про всех говорить не стану, но лично мне не нравится то, что в линуксе еще с ранних версий Flash-плагина существует баг, не позволяющий вводить в текстовые поля русский текст. Вернее даже, не то, что мне это не нравится, а из-за этого я вообще не могу использовать ни одну флешку, в которой надо вводить русский текст.

этот баг появляется только в случае если у флешки wmode=opaque
Кстати, библиотеку вполне можно портировать на Actionscript.
Я просто не интересовался, возможно, там уже что-то подобное есть. Все же, Flash-приложения доступны там уже давным давно.
А не подскажите, есть ли готовый пример вывода РСС с своего сайта, например?
А сильверлайт, интересно, поддерживается кроссдомейн.иксэмэлем?..
Вообщем, под IE8 баг — правильная часть кода:
function decodeSecret(api_secret) {

// decode api_secret
if (api_secret.substring(0, 4) == 'sx--') {

var api_secret_decoded = '';
var char_code = '';
var code = '';
for ( var i = 4; i < api_secret.length; i++) {
// form char code
code = api_secret.substring(i,i+1);
if (code != 'l') {
char_code += code;
} else {
api_secret_decoded += String
.fromCharCode(parseInt(char_code) + 31);
char_code = '';
}
}
return api_secret_decoded;

// api_secret is not encoded, so just return it
} else {
return api_secret;
}
}
Спасибо за замечание.

Поначалу, честно говоря, был озадачен. Полез в доки, естественно — оказалось, точно:
Treating the string as an array is not part of ECMAscript; it's a Javascript feature (and not supported in all browsers)


Единственное, чем писать api_secret.substring(i,i+1), наверное, проще будет писать api_secret.charAt(i)
А это точно кроссбраузерно? Потому как сейчас я даже с айфона могу загружать приложение своё.
А это точно кроссбраузерно? Потому как сейчас я даже с айфона могу загружать приложение своё.

У меня нет IE, так что проверить мне сложнее. Но вообще, как бы, да. Квадратные скобки не являются частью стандарта ECMAscript, и не обязаны поддерживаться всеми браузерами (каюсь, не знал). А метод charAt() должен поддерживаться всем. Так или иначе, надо проверять.
кстати, протестировать на екмаскриптовость помогает jslint.com.
там ещё и ворнинги полезные есть.
Подскажите, тут такой вопрос. Есть скрипт:
var api = new vk_api('...','..');
api.params.viewer_id = <?php echo $_GET['viewer_id']; ?>;
api.params.api_id = 123;
api.call('isAppUser',function(data) {alert(123);});

Все вроде просто. При вызове call firebug говорит:
MD5 is not defined
[Break on this error] parameters.sig = MD5(sig);

Пытался разобраться с исходниками — не вышло. Как лечить?
Подсунул MD5 прямо в скрипт — заработало. Иначе — нет.
Вы неверно работаете со скриптом. Дело в том, что все манипуляции нужно проводить внутри callback-функции, выполняющейся при успешной инициализации. Т.е., в данном случае:

var api = new vk_api(
    '...',
    function() {
        api.params.viewer_id = <?php echo $_GET['viewer_id']; ?>;
        api.params.api_id = 123;
        api.call('isAppUser', function(data) {alert(123);});
    }
);


Более того, устанавливать api.params.* через PHP — совершенно бессмысленно. Все эти параметры устанавливаются скриптом автоматически! Так что, если все далать еправильно, то Ваш скрипт должен быть таким:

var api = new vk_api(
    '...',
    function() {
        api.call('isAppUser', function(data) {alert(123);});
    }
);

Господин Колонист, спасибо вам за удобную библиотеку. Однако я вижу, что на странице xinit.ru/solutions/vkontakte-javascript-api-wrapper больше нет ничего, относящегося к vk_jsapi. Это смущает. :( Я уже взялся за проект, в котором vk_api вовсю используется, и хотелось бы быть уверенным (ишь, чего захотел!) что ваша библиотека не исчезнет из интернета и даже (еще более наглое пожелание) будет поддерживаться автором. :) В любом случае спасибо за удобную и полезную разработку, и надеюсь, что перемены на вашем сайте не означают конца vk-jsapi.
1. Из сети ничего не исчезнет, ибо Google Code: vk-jsapi.googlecode.com рулит. Свой сайт я тоже скоро приведу в порядок.

2. Поддерживаться библиотека уже не будет, потому что Контакт сделал свое решение VK.api(). И я бы рекомендовал использовать именно решение самого Контакта. Тем более, что вызовы api.call() и VK.api() абсолютно идентичны.

Тем не менее, библиотека работает. И если вы сделали приложение на ее основе, то оно будет прекрасно работать, пока вы не соберетесь его перестраивать.
Наткнулся на вашу библиотеку сегодня (разбирался с VK и искал, как там там добраться до params) и грешным делом решил, что это надстройка _над_ VK.api. А получается, что он ее полностью заменяет?
Да, полностью заменяет. Когда я ее делал, еще не было никакого VK.api, так что сейчас надо использовать контактовскую библиотеку.
Only those users with full accounts are able to leave comments. Log in, please.