Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   Передача сообщения для публикации на стену (http://www.flasher.ru/forum/showthread.php?t=142452)

catcat 21.07.2010 18:16

Передача сообщения для публикации на стену
 
Как можно передать сообщение, содержащее русские символы и пробелы в параметр запроса? Есть для этого во Flash какие-нибудь функции или какие сторонние библиотеки?

mikhailk 21.07.2010 22:14

encodeURI

catcat 23.07.2010 15:42

Допустим у меня есть переменная userText = "абракадабра". Если пользоваться encodeURI, то на стене появляется запись со знаками процента и т.д., т.е. явно не то, что нужно, а если без нее, то что-то типа абракадабра. Может я не так как-то encodeURI использую? Я кодирую userText в подписи и в URLVariables.

mikhailk 23.07.2010 15:48

Вот кусок рабочего кода

Код AS3:

                /**************************************************************************/
                /*    Публикация записи на стену                                          */
                /**************************************************************************/
                public function writeMessageToWall(requestData){
                        var signatureForMD5:String = wrapper.application.parameters.viewer_id
                                                        + "api_id=" + wrapper.application.parameters.api_id
                                                        + "hash=" + requestData.hash
                                                        + "message=" + requestData.messageText
                                                        + "method=wall.savePost"
                                                        + "photo=" + requestData.photo
                                                        + "photo_id=" + requestData.photoID
                                                        + "server=" + requestData.server
                                                        + "test_mode=" + testMode
                                                        + "v=2.0"
                                                        + "wall_id=" + requestData.userID
                                                        + GlobalParameters.appCode;
                        var signatureMD5:String = convertorMD5.encrypt(signatureForMD5);
                        var requestString:String = wrapper.application.parameters.api_url
                                                        + "?api_id=" + wrapper.application.parameters.api_id
                                                        + "&hash=" + requestData.hash
                                                        + "&message=" + encodeURI(requestData.messageText)
                                                        + "&method=wall.savePost"
                                                        + "&photo=" + requestData.photo
                                                        + "&photo_id=" + requestData.photoID
                                                        + "&server=" + requestData.server
                                                        + "&sig=" + signatureMD5
                                                        + "&test_mode="+testMode
                                                        + "&v=2.0"
                                                        + "&wall_id=" + requestData.userID
                                                        ;
                        connectToURL(requestString,"writeMessageToWall");
                }


catcat 23.07.2010 16:00

У вас в сигнатуре requestData.messageText не кодируется, а в параметрах запроса кодируется. У меня в таком случае запрос не выполняется даже. Мне нужно и там и там кодировать. Я, правда, использую URLVariables:
Код AS3:

var sig = MD5.hash(viewer_id+"api_id="+api_id+"hash="+hash+"message="+msg+"method=wall.savePostphoto="+photo+"post_id="+post_id+"server="+server+"v="+v+"wall_id="+String(wall_id)+secret);
 
                        var variables:URLVariables = new URLVariables();
                        variables.api_id = api_id;
                        variables.v = v;
                        variables.wall_id = wall_id;
                        variables.server  = server;
                        variables.photo  = photo;
                        variables.post_id = post_id;
                        variables.hash    = hash;
                        variables.message = msg;
                        variables.method = "wall.savePost";
                        variables.sig = sig;
 
                        sendAndLoadData(variables, onComplete);

Не знаю даже в чем проблема :(

etc 23.07.2010 16:01

Нет, ну почему никто не догадывался сделать функцию сортировки полей по алфавиту и автоматическому вычислению сигнатуры?

catcat 23.07.2010 16:06

Цитата:

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

etc 23.07.2010 16:14

Не знаю, я передаю как есть и всё работает. Т. е. я ничего специально не делал для того, чтобы это работало.

Bgg 23.07.2010 16:22

Цитата:

Сообщение от etc (Сообщение 924433)
Нет, ну почему никто не догадывался сделать функцию сортировки полей по алфавиту и автоматическому вычислению сигнатуры?

Мне в свое время было лень. Казалось что руками быстрее перечислить параметры запроса.

catcat 23.07.2010 16:24

Самое интересное -- в окне подтверждения публикации русский текст правильно отображается, а на самой стене совсем не то :(

etc 23.07.2010 16:24

Гм, это странно, написать одну единственную функцию и не париться всяко быстрее.

udaaff 23.07.2010 16:26

Цитата:

Казалось что руками быстрее перечислить параметры запроса.
Там функция та несчастная в несколько строк получается.
Код AS3:

//
//  Copyright 2009 Vitali Sosnovski
//
//  NOTICE: You may distribute this class freely,
//  provided it is not modified in any way (including
//  removing this header or changing the package path).
//
//  Please contact udaaff[at]gmail.com prior to distributing
//  modified versions of this class.
//
////////////////////////////////////////////////////////////////////////////////
 
 
package by.typing.vkontakte.net
{
 
        import com.adobe.crypto.MD5;
 
        import flash.net.URLVariables;
 
        /**
        * Класс предназначен для задания параметров, передаваемых в запросе, а также
        * для генерации сигнатуры на основании этих параметров.
        */

        public dynamic class VkontakteVariables extends URLVariables
        {
 
                //--------------------------------------------------------------------------
                //
                //  Constructor
                //
                //--------------------------------------------------------------------------
 
                /**
                * Создает объект <code>VkontakteVariables</code>.
                *
                */
           
                public function VkontakteVariables()
                {
                        super();
                }
 
 
                //--------------------------------------------------------------------------
                //
                //  Methods
                //
                //--------------------------------------------------------------------------
 
                /**
                * Генерирует сигнатуру на основании заданных переменных. Необходимо вызывать
                * после задания всех необходимых параметров.
                * 
                * @param viewer_id            Id пользователя.
                * @param privateKey    Приватный ключ со страницы редактирования.
                *
                */
           
                public function buildSignature(viewer_id:String, privateKey:String):void
                {
                        // необходимо удалить, иначе неправильно вычислится hash при повторном
                        // вызове
                        delete this['sig'];
 
                        var array:Array = [];
                        for (var field:String in this)
                        {
                                array.push({ name: field, value: this[field] });
                        }
                        array.sortOn("name");
 
                        var sig:String = viewer_id;
                        for each (var o:Object in array)
                        {
                                sig += o.name + "=" + o.value;
                        }
                        sig += privateKey;
 
                        this['sig'] = MD5.hash(sig);
                }
 
        }
 
}


catcat 23.07.2010 16:30

Люди, да что вы все с этими параметрами запроса? :D
Так как проблему с русскими символами решить-то?

udaaff 23.07.2010 16:32

Нет никакой проблемы.

catcat 23.07.2010 16:35

Цитата:

Нет никакой проблемы.
??? а почему тогда символы не отображаются правильно?

Добавлено через 4 минуты
Вот реальный пример сообщения:
сообщение:
Цитата:

я не знаю в чем тут дело
на стене:
Цитата:

я не знаю в чем тут дело
Что это вообще за символы?

mikhailk 23.07.2010 16:42

Цитата:

Сообщение от etc (Сообщение 924433)
Нет, ну почему никто не догадывался сделать функцию сортировки полей по алфавиту и автоматическому вычислению сигнатуры?

У меня есть и такая и такая реализации.
Когда у тебя используются 4 метода API VK, никакого выигрыша нет.
Ни по объему кода, ни по производительности.
К тому же, эта часть приложения пишется один раз и потом вообще не открывается.

Получается, имхо, программирование ради программирования.
К тому же, с уменьшением наглядности.

etc 23.07.2010 17:17

Цитата:

Сообщение от mikhailk (Сообщение 924451)
У меня есть и такая и такая реализации.
Когда у тебя используются 4 метода API VK, никакого выигрыша нет.
Ни по объему кода, ни по производительности.
К тому же, эта часть приложения пишется один раз и потом вообще не открывается.

Получается, имхо, программирование ради программирования.
К тому же, с уменьшением наглядности.

А я думал, реюзинг кода в почете. Ан нет :quiet:

mikhailk 23.07.2010 17:39

в почете
но не с API ВК. :D
Иногда я вообще не представляю, что за шишки они курили, когда писали некоторые вещи.

Я специально оставил у себя эту часть именно в таком виде.
Чтобы было наглядно и понятно.

Bgg 23.07.2010 17:43

udaaff, да знаю я :)

Astraport 02.11.2010 12:20

Подобная проблема, только по-русски (в message= )даже не хочет публиковать на стену.

Вылезает вконтактовская ошибка "Запись не может быть добавлена на стену по неизвестной причине."

Пробовал encodeURI - не помогает.
По английски все отлично публикуется на стене.

chabapok 02.11.2010 12:35

возьмите демонстрационное приложение по публикации на стене и посмотрите как там сделано, и не парьте себе могз.

Astraport 02.11.2010 12:55

У меня например нет демонстрационного приложения публикующего сообщение на стену. Если дадите ссылку, буду благодарен.
Тем более что нужна реализация для swf без контейнера.

Удалось только используя escape, но так оно закодированное постится.

GBee 02.11.2010 13:15

Цитата:

Вылезает вконтактовская ошибка "Запись не может быть добавлена на стену по неизвестной причине."
Вы там случаем хеш не портите? Обычно такое бывает. А у вас в юникоде все файлики?

Astraport 02.11.2010 13:44

Цитата:

Вы там случаем хеш не портите?
Порчу. Ой, порчу:)

Примерно как-то так запрос отправляю, а в ответ ошибка. До получения хэша даже не доходит.

Код AS3:

var signatureForMD5:String = viewer_id + "api_id=" + api_id + "message=" + mess + "method=wall.savePost" + "photo_id=" + photos + "v=2.0"+ "wall_id=" + viewer_id+ api_secret;
var signatureMD5:String = MD5.encrypt(signatureForMD5);
var requestString:URLRequest = new URLRequest("http://api.vkontakte.ru/api.php"+ "?api_id=" + api_id+ "&message=" + mess + "&method=wall.savePost"+ "&photo_id=" + photos+ "&sig=" + signatureMD5+ "&v=2.0"+ "&wall_id=" + viewer_id);
var header:URLRequestHeader = new URLRequestHeader("Content-Type", "text/html");
requestString.requestHeaders.push(header);
header = new URLRequestHeader("charset", "utf-8");
requestString.requestHeaders.push(header);
loader =new URLLoader();
loader.addEventListener(Event.COMPLETE, onComplete);
loader.load(requestString);

Я так понимаю, что request с русскими буквами не удастся выполнить?

Тут товарищ в соседней ветке проболтался что вместо вышеописанного способа как-то использует посредника и успешно шлет ему api("wall.savePost", ObjectWithParams);.
Но колоться как и какие параметры передать объекту не хочет:)


Часовой пояс GMT +4, время: 00:30.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.