Форум 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=151278)

knaka 25.02.2011 15:21

Опубликовать запись на стену нескольким друзьям
 
Добрый день. Есть вопрос как реализовать отправку записи на стену нескольким друзьям.
На данный момент сделал следующее:
Код AS3:

        import com.adobe.serialization.json.JSON;
        import com.adobe.images.JPGEncoder;
        import MultipartURLLoader.*;
 
        import flash.events.Event;
        import flash.utils.ByteArray;
        import flash.display.BitmapData;
        import flash.display.DisplayObject;
        import flash.display.Bitmap;
        import flash.display.PixelSnapping;
        import flash.geom.Matrix;
 
        public class SaveCard
        {
 
                private var main;
                private var VK;
                private var user;
                private var card;
                private var msg;
                private var mll:MultipartURLLoader;
 
                private var uploadResponse;
 
                public function SaveCard(main, user, card, msg)
                {
                        this.msg = msg;
                        this.user = user;
                        this.main = main;
                        this.card = card;
                        this.VK = main.VK;
                        VK.api('photos.getWallUploadServer',{uid:user},responseFromServer,main.onError);
                }
 
                private function responseFromServer(data)
                {
                        mll = new MultipartURLLoader  ;
                        mll.addEventListener(Event.COMPLETE, onUploadCompleteThroughAlarm);
                        mll.addFile(saveCroppedImage(card),"file.jpg","file1",'image/jpg');
                        mll.load(data.upload_url);
                        uploadResponse = data;
                        main.debug.appendText("Upload server answer"+data.toString());
                }
 
                private function onUploadCompleteThroughAlarm(e:Event)
                {
                        var answer:String = mll.loader.data;
                        main.debug.appendText("on upload answer: "+answer);
                        var data:Object = JSON.decode(answer);
                        VK.api('wall.savePost', {wall_id: user, post_id:"post1", server:data.server, photo:data.photo, hash:data.hash,  message: msg });
                }
        }

все случается удачно но в самом конце появляется:
Цитата:

SecurityError: Error #2000: Отсутствует активный контекст безопасности.
в своих прошлых проектах я с этим боролся так:
Код AS3:

Security.loadPolicyFile("http://mysite.com/crossdomain.xml");
var loaderContext:LoaderContext = new LoaderContext();
loaderContext.checkPolicyFile = true;
var loader:Loader = new Loader();
loader.load(request, loaderContext);

но в данном случае я непонимаю ни где взять вконтактовский кроссдоменик, ни куда передавать loaderContext? Ну и главный вопрос. Если я таки смогу победить ошибку с безопасностью то смогу ли используя этот класс рассылать посту выбранным ранее друзьям?

Azo 25.02.2011 22:11

Цитата:

где взять вконтактовский кроссдоменик
если приложение вконтакте, и картинки грузятся правильным путём - не нужен кросдомен.

иначе можно обойти это ТАК

knaka 25.02.2011 23:01

спасибо.
но кажется мне это не подходит.
обьясню ситуацию:
в приложении создается некий MovieClip()
наполняется картинками из библиотеки (никаких внешних загрузок)
дальше из мувиклипа делается ByteArray и с ним (байтэрэем) происходит 2 действия. первое это рисуется новый но скадрированый обьект для подтверждения пользователем. и воторое (по клику) этот ByteArray передается в выше описаный класс.
точнее сюда:
Код AS3:

mll.addFile(saveCroppedImage(card),"file.jpg","file1",'image/jpg');

я пробовал использовать различные вариации класса MultipartData но это ничего не меняет. событие случается как надо и всегда получаю ответ типа такого:
Цитата:

{"server": "10184", "photo": "a8994f98f2:x", "hash": "33e8d3136b3fb38def5aaafadd5b9274"}
а вот ошибка получается только при вызове следующей строки:
Код AS3:

VK.api('wall.savePost', {wall_id: user, post_id:"post1", server:data.server, photo:data.photo, hash:data.hash,  message: msg });

предполагаю что я как-то не правильно совершаю wall.savePost
вопрос что не так или как это сделать чтобы работало?

Bgg 25.02.2011 23:13

Я через посредник отправляю запрос.
Код AS3:

private var apiConnection:APIConnection;
...
apiConnection.api("wall.savePost", {wall_id:...}, completeSaveWallPost, errorRequest);

Какая ошибка-то?

knaka 28.02.2011 15:57

ошибка:
Цитата:

SecurityError: Error #2000: Отсутствует активный контекст безопасности.
Добавлено через 1 час 29 минут
немного изменил код и стало лучше но проблема не исчезла:
Код AS3:

                public function PostCard(main, user, byteArray, msg)
                {
                        this.msg = msg;
                        this.user = user;
                        this.main = main;
                        this.byteArray = byteArray;
                        this.VK = main.VK;
                        VK.api('photos.getWallUploadServer',{uid:user},responseFromServer,main.onError);
                }
 
                private function responseFromServer(data)
                {
                        mll = new MultipartURLLoader  ;
                        mll.addEventListener(Event.COMPLETE, onUploadCompleteThroughAlarm);
                        mll.addFile(byteArray, "file.jpg", "file1", 'image/jpg');
                        mll.load(data.upload_url);
                }
 
                private function onUploadCompleteThroughAlarm(e:Event)
                {
                        var answer:String = mll.loader.data;
                        var data:Object = JSON.decode(answer);
                        VK.api('photos.saveWallPhoto', {uid: user, server:data.server, photo:data.photo, hash:data.hash}, onSaveWallPhoto, main.onError);
                }
                private function onSaveWallPhoto(response)
                {
                        var answer:String = response
                        var data:Object = JSON.decode(answer);
                        VK.api('wall.post', { message: msg, owner_id: user, attachment: data.id }, function(response:Object) { trace(response.post_id)}, main.onError);
                }

в аутпуте во флеше локально все ответы приходят. функция onSaveWallPhoto получает Object но вот дальше ошибки. если я пытаюсь как написано выше его JSON.deocde то получаю вконтакте все туже
Цитата:

SecurityError: Error #2000: Отсутствует активный контекст безопасности.
а локально в аутпуте
Цитата:

JSONParseError: Unexpected o encountered
at com.adobe.serialization.json::JSONTokenizer/parseError()
at com.adobe.serialization.json::JSONTokenizer/getNextToken()
at com.adobe.serialization.json::JSONDecoder/nextToken()
at com.adobe.serialization.json::JSONDecoder/parseArray()
at com.adobe.serialization.json::JSONDecoder/parseValue()
at com.adobe.serialization.json::JSONDecoder()
at com.adobe.serialization.json::JSON$/decode()
at Scripts::PostCard/onSaveWallPhoto()
at Function/<anonymous>()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.net::URLLoader/onComplete()
если трейсить response то вижу Object но response.id почемуто undefined
хотя ответ в аутпуте такой
Цитата:

{"response":[{"id":"photo55273336_228418330","pid":228418330,"aid":-7,"owner_id":55273336,"src":"http:\/\/cs11417.vkontakte.ru\/u55273336\/-7\/m_4513256f.jpg","src_big":"http:\/\/cs11417.vkontakte.ru\/u55273336\/-7\/x_aa56d719.jpg","src_small":"http:\/\/cs11417.vkontakte.ru\/u55273336\/-7\/s_acc095d3.jpg","created":1298899538}]}
может ли быть такое что функция вызывается до того как приходит ответ от сервера?

Добавлено через 1 час 50 минут
попробовал вот так:
Код AS3:

private function onUploadCompleteThroughAlarm(e:Event)
                {
                        var answer:String = mll.loader.data;
                        var data:Object = JSON.decode(answer);
                        main.debug.appendText("on upload answer: "+data.server+"\n");
                        VK.api('wall.savePost', {wall_id: user, post_id:"post1", server:data.server, photo:data.photo, hash:data.hash,  message: msg }, onSaveWallPhoto, main.onError);
                        //VK.api('photos.saveWallPhoto', {uid: user, server:data.server, photo:data.photo, hash:data.hash}, onSaveWallPhoto, main.onError);
                }
                private function onSaveWallPhoto(response)
                {
                        trace(response)
}

пишет:
Цитата:

Fail wall.post error_msg: Invalid hash
Добавлено через 5 часов 51 минуту
Все получилось ура!
Публикует запись) осталось сделать раасылку нескольким друзьям. думаю что реализую это поочереди. Впрочем кажется мне может помоч в этом execute

Добавлено через 6 часов 8 минут
вдруг каму то пригодится
мне нужно было сделать класс который публиковал бы на стену изображение из ByteArray (в моем случае срисовывался мувиклип).
для реализации мне понадобились:
- APIConnection.zip
- MultipartURLLoader
- as3corelib

Код AS3:

package Scripts
{
        import com.adobe.serialization.json.JSON;
        import com.adobe.images.JPGEncoder;
        import MultipartURLLoader.*;
 
        import flash.events.Event;
        import flash.utils.ByteArray;
        import flash.display.BitmapData;
        import flash.display.DisplayObject;
        import flash.display.Bitmap;
        import flash.display.PixelSnapping;
        import flash.geom.Matrix;
 
        public class PostCard
        {
 
                private var main; // ссылка на основной класс в катором создан APIConnection
                private var VK;
                private var user; //uid пользователя на стене которого размещаем запись
                private var byteArray:ByteArray; // ByteArray изображения которое хотим прикрепить к посту
                private var msg:String; // текст сообщения поста
                private var mll:MultipartURLLoader;
 
                public function PostCard(main, user, byteArray:ByteArray, msg:String)
                {
                        this.msg = msg;
                        this.user = user;
                        this.main = main;
                        this.byteArray = byteArray;
                        this.VK = main.VK;
                        VK.api('photos.getWallUploadServer',{uid:user},responseFromServer,main.onError);
                }
 
                private function responseFromServer(data)
                {
                        mll = new MultipartURLLoader();
                        mll.addEventListener(Event.COMPLETE, onUploadCompleteThroughAlarm);
                        mll.addFile(byteArray, "file.jpg", "file1", 'image/jpg');
                        mll.load(data.upload_url);
                }
 
                private function onUploadCompleteThroughAlarm(e:Event)
                {
                        var answer:String = mll.loader.data;
                        var data:Object = JSON.decode(answer);
                        VK.api('photos.saveWallPhoto', {uid: user, server:data.server, photo:data.photo, hash:data.hash }, onSaveWallPhoto, main.onError);
                }
 
                private function onSaveWallPhoto(data)
                {
                        VK.api('wall.post', { owner_id: user, attachment: data[0].id, message: msg}, function(e) { trace("onSaveWallPhoto id: "+e.post_id+"\n") }, main.onError);
                }
        }
}


Drac0Sha 23.09.2011 17:18

простите, а как выглядело ваше обращение в main к этому классу Scripts.as


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

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