PDA

Просмотр полной версии : [Вконтакте] error_msg: Incorrect signature


FW7
12.12.2009, 14:30
вот основной класс тестового приложения

package
{
// путь до библиотеки мд5, для просчета сигнатуры запроса к АПИ
import com.adobe.crypto.MD5;

import flash.display.*;
import flash.events.*;
import flash.net.*;

/**
* Class TestAPI Тестовый запрос к АПИ ВКонтакте и вывод списка друзей пользователя
* @author Yuriy (Mur4ik) Kulkoff
* @version 0.1
* @date 26.07.2009
*/
public class testAPI extends Sprite
{
//ID приложения
var apiID:String = "735931";
//Секретный ключ приложения
var secret:String = "SZvqkJwYoE";
//режим тестирования(0-выключен,1-включен)
var testMode:String = "1";
// Юзер, список друзей которого нужно вывести
// В данном случае берем юзера просматривающего рпиложение
var viewerID:String = root.loaderInfo.parameters.viewer_id;

private var friendsList:XML;

public function testAPI()
{
if (stage) getFriends(null);
else addEventListener(Event.ADDED_TO_STAGE, getFriends);
}

public function getFriends(event:Event):void
{
var r:URLRequest = new URLRequest("http://api.vkontakte.ru/api.php");
var l:URLLoader = new URLLoader();
var v:URLVariables = new URLVariables();
// Необходимый метод изи АПИ
//var methodFromAPI:String = "getFriends";
var methodFromAPI:String = "audio.get";
// Для тестов не локально должно быть 0

v.api_id = apiID;
v.aids = "66160268";
v.v = "2.0"; // Версия АПИ
v.method = methodFromAPI;
v.aids = "62484093";
v.test_mode = testMode;
v.sig = MD5.hash(viewerID + 'api_id=' + apiID + 'method=' + methodFromAPI + 'test_mode=' + testMode + 'v=2.0' + secret);

r.data = v;
r.method = URLRequestMethod.GET;

l.load(r);
l.addEventListener(Event.COMPLETE, loader_completeHandler);
}

private function loader_completeHandler(event:Event):void
{
friendsList = new XML(event.target.data);

// Выводим ID друзей
friendsList.*.( trace(name() + ": " + toString()) );

}
}
}

я хочу вывести ОДНУ аудиозапись,но выдается ошибка 4. если убрать строку v.aids = "66160268";,то все работает. что я не так делаю?

udaaff
12.12.2009, 15:13
В подписи не все параметры. aids нужно добавить.

У меня чего-то testMode, вообще, отказывается работать в последние два дня. Не могу понять в чем проблема. Любой запрос возвращает ошибку 4 (неправильная сигнатура) и этот пример тоже, если заливаешь на хост, ничего при этом не меняя, то все начинает работать как положено.

FW7
12.12.2009, 15:17
В подписи не все параметры. aids нужно добавить.
В каком смысле?я же написал v.aids = "62484093";

udaaff
12.12.2009, 15:23
v.sig = MD5.hash(viewerID + 'aids=' + '62484093' + 'api_id=' + apiID + 'method=' + methodFromAPI + 'test_mode=' + testMode + 'v=2.0' + secret);
//

FW7
12.12.2009, 17:20
понял,спасибо. надо было мне документацию внимательней читать)))

sandy5
05.01.2010, 02:17
так. не помню где это на форуме было, но хочу вернуться к прежней задаче: вывод в trace список друзей вконтакте. во первых у меня флешь CS4 ругается на эту строчку: 1172: Definition com.adobe.crypto:MD5 could not be found. (import com.adobe.crypto.MD5;)
а потом на это: 1061: Call to a possibly undefined method hash through a reference with static type Class.

вот исходный код:

package
{
// путь до библиотеки мд5, для просчета сигнатуры запроса к АПИ
import com.adobe.crypto.MD5;

import flash.display.*;
import flash.events.*;
import flash.net.*;

/**
* Class TestAPI Тестовый запрос к АПИ ВКонтакте и вывод списка друзей пользователя
* @author Yuriy (Mur4ik) Kulkoff
* @version 0.1
* @date 26.07.2009
*/
public class TestAPI extends Sprite
{
private var friendsList:XML;

public function TestAPI()
{
if (stage) getFriends(null);
else addEventListener(Event.ADDED_TO_STAGE, getFriends);
}

public function getFriends(event:Event):void
{
var r:URLRequest = new URLRequest("http://api.vkontakte.ru/api.php");
var l:URLLoader = new URLLoader();
var v:URLVariables = new URLVariables();

// Юзер, список друзей которого нужно вывести
// В данном случае берем юзера просматривающего рпиложение
var viewerID:String = root.loaderInfo.parameters.viewer_id;
//ID приложения
var apiID:String = "1776421";
//Секретный ключ приложения
var secret:String = "4NvIhgWvkm";
// Необходимый метод изи АПИ
var methodFromAPI:String = "getFriends";
// Для тестов не локально должно быть 0
var testMode:String = "1";

v.api_id = apiID;
v.v = "2.0"; // Версия АПИ
v.method = methodFromAPI;
v.test_mode = testMode;
v.sig = MD5.hash(viewerID + 'api_id=' + apiID + 'method=' + methodFromAPI + 'test_mode=' + testMode + 'v=2.0' + secret);

r.data = v;
r.method = URLRequestMethod.POST;

l.load(r);
l.addEventListener(Event.COMPLETE, loader_completeHandler);
}

private function loader_completeHandler(event:Event):void
{
friendsList = new XML(event.target.data);

// Выводим ID друзей
friendsList.*.( trace(name() + ": " + toString()) );

// Далее по этим ID можно узнать более подробную информацию
// с помошью метода getProfiles из АПИ
}
}
}

ну эт еще ладно. я нашел решение(чисто не по человечески)

убрал строчку import com.adobe.crypto.MD5;
и исправил другую на v.sig = MD5.encrypt(viewerID + 'api_id=' + apiID + 'method=' + methodFromAPI + 'test_mode=' + testMode + 'v=2.0' + secret); , благо у меня есть файл MD5.as но мне почему то все равно флеш выдает ошибку error_code: 4
error_msg: Incorrect signature. кто нибудь может выложить исходник или хотя бы подсказать, почему неправильно?

Добавлено через 46 минут
ага. хоть как то разобрался с ошибкой import com.adobe.crypto.MD5;

теперь все вроде правильно, но пишет 1061: Call to a possibly undefined method hash through a reference with static type Class. никто не подскажет в чем я не прав?))

udaaff
05.01.2010, 08:46
Где это файл (MD5.as) у вас лежит? И что это, вообще, за класс? com.adobe.crypto.MD5?

Wolsh
05.01.2010, 13:33
1. Посмотрите package класса MD5.
2. Если он пустой (просто "package" и сразу фигурная скобка { ) - навряд ли это адобовский класс - проверьте, есть ли у него public static function hash().
Я, к примеру, долгое время пользовался другим классом MD5 и у него были совсем другие названия методов.
3. Если же package - адобовский com.adobe.crypto, то Вам надо в директории проекта создать соответствующую директорию com/adobe/crypto, в которую уже положить файл MD5.as, и снова написать импорт в начале пакета, как в приведенном здесь примере кода.

sandy5
05.01.2010, 14:26
ответ udaaff'u: файло MD5 можно скачать отсюда: http://fsca.ru/flash/vkontakte/vksender/vksender.rar. в архиве возьми папку "com". оттуда и будет класс import com.adobe.crypto.MD5;

вопрос ко всем:
предисловие: ну хорошо. все разобрался. теперь он почему то только моих друзей показывает вконтакте.
сам вопрос: как сделать так, чтобы он и у других юзеров показывал друзей? когда я пишу var viewerID:Numer = (ид другого человека, который разрешил все действия приложению), то опять выдает ошибку неправильной сигнатуры

chabapok
06.01.2010, 23:13
никак. запукать должно от имени того юзера, в кукисы должны быть того юзера и тд.
Узнать можно только друзей человека, от имени которого запущено приложение, если тот в настройках разрешил. Если все таки очень нужно -- через свой сервер в своей бд пересохранять эти списки.

vasya87
12.01.2010, 00:47
У меня тоже не получается правильно вычислить сигнатуру, я новичок в апи вконтакта. Для метода getProfiles вычисляю так:
var sig=MD5.hash("мой_айдиapi_id=ади_приложенияmethod=getProfilesv=2.0секрет");
var request:URLRequest = new URLRequest("http://api.vkontakte.ru/api.php?api_id=айди_приложения&v=2.0&method=getProfiles&uids=мой_айди&sig="+sig);
var loader:URLLoader = new URLLoader();
loader.load(request);
loader.addEventListener(Event.COMPLETE, onComplete);
//и так далее

в результате получаю что-то такое:
<?xml version="1.0" encoding="utf-8"?>
<error>
<error_code>4</error_code>
<error_msg>Incorrect signature</error_msg>
<request_params list="true">
<param>
<key>api_id</key>
<value>айди_приложения</value>
</param>
<param>
<key>v</key>
<value>2.0</value>
</param>
<param>
<key>method</key>
<value>getProfiles</value>
</param>
<param>
<key>uids</key>
<value>мой_айди</value>
</param>
<param>
<key>sig</key>
<value>5a3cf0ab0ee7b70ce56eeadaf9b89645</value>
</param>
</request_params>
</error>

секрет беру со страницы редактирования, а не платежей.
если поменять api.vkontakte.ru/api.php на api.vk.com/api.php, то вообще выдаёт ошибку 5 (ошибка авторизации).
вроде всё по их документации. что я делаю неправильно?:(

udaaff
12.01.2010, 03:22
Читайте про то, как правильно подпись формировать http://vkontakte.ru/pages.php?o=-1&p=%C2%E7%E0%E8%EC%EE%E4%E5%E9%F1%F2%E2%E8%E5%20%EF%F0%E8%EB%EE%E6%E5%ED%E8%FF%20%F1%20API

vasya87
12.01.2010, 11:56
Так дело в том, что я отсюда же и брал. viewer_id и api_id получаю из flashVars (проверял, получаются какие надо). Далее размещаю всё в порядке, как там написано
var met:String="getProfiles";
var skey:String="ключ";
var sig=MD5.hash(viewerID+'api_id='+apiID+'method='+met+'v=2.0'+skey);
результат тот же..
(при этом, я так понял, при формировании запроса порядок переменных кроме апи_айди и сиг не важен? запрос такой:
"http://api.vkontakte.ru/api.php?api_id="+aipID+"&v=2.0&method="+met+"&uids="+viewerID+"&sig="+sig)

udaaff
12.01.2010, 12:34
В запросе конечно же не важен.
Далее размещаю всё в порядке, как там написано
Не всё. uids'a нету в подписи.

vasya87
12.01.2010, 20:44
Да, помогло. Потом до меня даже безболезненно дошло, что если добавляю fields в запрос, то нужно его добавить и в подпись. За что Вам большое спасибо:)

YaMaha
13.05.2010, 03:59
а мне не помогло.. уже все документацию до дыр протерла, но никак не выходит получить getUserInfoEx.
:( не понимаю что не так делаю( вроде все по правилам.
посылаю запрос в адресной строке браузера и в ответ вместо желаемого XML выводится сообщение об ошибке с неправильной сигнатурой.
<error_msg>Incorrect signature</error_msg>

а может дело в том, что обязательно нужно запрашивать методы из самого приложения? :wacko: подскажите пожалуйста!

пс-моя ссылка для получения getUserInfoEx :umnik2:

"http://api.vkontakte.ru/api.php?api_id="+id приложения+"&v=2.0&method=getUserInfoEx&sig="+MD5[мой id+"api_id="+id приложения+"method=getUserInfoExv=2.0secret"]

HotIceCream
13.05.2010, 07:24
Yamaha , раз говорит о неправильной сигнатеру, то покажите как вы ее формируете.

YaMaha
13.05.2010, 12:30
формирую сигнатуру с помощью этого сайта http://www.kontrolnaya-rabota.ru/s/online-calculators/md5/ там онлайн md5 генератор
записываю такую строку:
МОЙАЙДИВКОНТАКТЕapi_id=АЙДИМОЕГОПРИЛОЖЕНИЯmethod=getUserInfoExv=2.0secret
с виду же правильно.. :o так как в навконтактовой документации написано:


sig = md5(viewer_idname1=value1name2=value2secret)

В данном случае sig равен md5("6492api_id=4method=getFriendsv=2.0secret")
то есть b499ce268e9995a08b2f2aebff2488be
(из вконтакта)

:wacko:

Neborya
13.05.2010, 16:13
Параметр sig равен md5 от конкатенации следующих строк:
* пар "parameter_name=parameter_value", расположенных в порядке возрастания имени параметра (по алфавиту).
Вот на этот пункт ты не обратил внимания.

Нет, всё правильно.

YaMaha
13.05.2010, 16:58
Вот на этот пункт ты не обратил внимания.
но у меня все по алфавиту же..

1.МОЙАЙДИВКОНТАКТЕ
2.api_id=АЙДИМОЕГОПРИЛОЖЕНИЯ
3.method=getUserInfoEx
4.v=2.0
5.secret

попробовала сделать запрос из примера вконтакта, с целью получить getFriends. то же самое :(
http://api.vkontakte.ru/api.php?api_id=АЙДИАПИ&method=getFriends&v=2.0&sig=7df24b447d350b7377920a9ce3b74bcf

где 7df24b447d350b7377920a9ce3b74bcf== md5(МОЙАЙДИapi_id=АЙДИАПИmethod=getFriendsv=2.0secret)
может приложение нужно как то особо настраивать?
ПС-оно у меня в настройках "включено и доступно всем", повторюсь ссылку вписываю в адресную строку браузера, не из моего флеш-приложения

Добавлено через 7 часов 50 минут
Вот на этот пункт ты не обратил внимания.

Нет, всё правильно.

:wacko: так в чем же дело..
вечно у меня ничего не работает.. :(

vasya87
14.05.2010, 03:09
где 7df24b447d350b7377920a9ce3b74bcf== md5(МОЙАЙДИapi_id=АЙДИАПИmethod=getFriendsv=2.0secret)
меня смутило "МОЙАЙДИ". имеется ввиду viewer_id или как?

3.method=getUserInfoExэтот метод хоть поддерживается ещё?:confused:

udaaff
14.05.2010, 03:43
ПС-оно у меня в настройках "включено и доступно всем", повторюсь ссылку вписываю в адресную строку браузера, не из моего флеш-приложения
Если бы было выключено, то выдало бы Application is disabled. Enable your application or use test mode.
Запрос составлен правильно. Строка браузера тут не причем также. Неправильная подпись значит. Ключ может не тот вставляете.

YaMaha
14.05.2010, 12:18
меня смутило "МОЙАЙДИ". имеется ввиду viewer_id или как?

этот метод хоть поддерживается ещё?:confused:

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

ну я еще пробовала с getFriends.. такая же ошибка.. :( может md5 на сайте криво формируется.. уже так долго неполучается осилить этот затык :wacko:

Добавлено через 2 минуты
Если бы было выключено, то выдало бы Application is disabled. Enable your application or use test mode.


да я помню такую ошибку - поэтому приложение включила в настройках. пробовала при выключенном делать и добавлять test_mode=1 но та же ошибка была с инкорректной сигнатурой.

Добавлено через 4 часа 3 минуты
Итак, нашла вконтакте простое приложение
http://vkontakte.ru/app743131
добавила его на свою страницу, в настройках разрешила доступ ко всему.
попыталась получить (на основе его айдишника) список своих аудиозаписей. то же самое. некорректная сигнатура.

http://api.vkontakte.ru/api.php?api_id=743131&method=audio.get&v=2.0&sig=d5f99a3835c024eafcd428b2c8e4c61a
где d5f99a3835c024eafcd428b2c8e4c61a = MD5 от строки
******api_id=743131method=audio.getv=2.0secret

ну ****** тут - это мой viewer_id

возвращает <error_msg>Incorrect signature</error_msg> со всеми вытекающими..
как говорится, It drives me crazy.. :wacko:

Neborya
14.05.2010, 18:41
В конце у тебя "secret".
Ты заменяешь его на секретный ключ приложения?

YaMaha
14.05.2010, 19:17
В конце у тебя "secret".
Ты заменяешь его на секретный ключ приложения?

ой :eek: спасибо, какая то я невнимательная :umnik2: на автомате писала слово secret..)

но я не нашла где там в редактировании приложение можно вводить секретный ключ?
есть только Ключ приложения и Защищенный ключ..

Neborya
14.05.2010, 19:45
Добавлено через 3 минуты
на автомате писала слово secret..)
Ну вот :)

Secret - это "ключ приложения".

YaMaha
15.05.2010, 18:56
Добавлено через 3 минуты

Ну вот :)

Secret - это "ключ приложения".

о.. оооооооооо!!! большое спасибо! заработало!!! :victory: фуф.. :)
премного благодарю!!!

Gorrr
15.05.2010, 19:09
У меня следующая проблема.
Посчу на стену, (фото загружается ок), далее делаю запрос wall.savePost.
При попытке отправить кириллицу в message, получаю сабж. Пробовал в различных комбинациях (мыслимых и немыслимых) использовать escape/encodeURI(), в ответе вместе с сообщением об ошибке приходит то нормальное message, то кракозябры (!).
Вопрос, как правильно заэнкодить и отправить всё это дело?

vasya87
15.05.2010, 19:58
в sig подставляйте просто message, в запрос escapeMultiByte(message)

Gorrr
15.05.2010, 20:35
Спасибо. Но не работает. Может быть класс MD5 левый... Вы каким пользуетесь, из corelib?

И точно левый был. Из Corelib взял - всё ок)