Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
|
Заморочка только с формированием самого запроса
Как-то писал для себя, давно уже. Но скорее всего ничего в API серьезно не поменялось. Пользуйтесь, кому надо. Первый для контакта, сначала вызываем initialize() и передаем туда свой APIConection. Ну а дальше уже по названию статических методов думаю будет все и так ясно
Код AS3:
package {
import api.com.adobe.images.PNGEncoder;
import flash.display.Bitmap;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestHeader;
import flash.net.URLRequestMethod;
import flash.utils.ByteArray;
import flash.utils.getTimer;
import vk.api.MD5;
import vk.api.serialization.json.Json;
import vk.APIConnection;
/**
* ...
* @author Konstantin
*/
public class VKPhotoSaver {
private static var _vk: APIConnection = null;
private static var _callback: Function = null;
private static var _albumID: String = "";
private static var _vkUploadServer: String = null;
private static var _image: Bitmap = null;
private static var _albumDescription: String = null;
private static var _albumTitle: String = null;
private static var _onUploadedFunction: Function = null;
private static var _message: String = "";
public static function initialize(vk:APIConnection):void {
if (_vk != null) return;
_vk = vk;
}
public static function saveToAlbum(image:Bitmap, callback:Function,
albumTitle:String = "",
albumDescription:String = ""):void {
if (_vk == null) {
throw "vk is null, call initialize() method first";
}
if (_image) {
return;
}
_image = image;
_callback = callback;
_albumDescription = albumDescription;
_albumTitle = albumTitle;
_onUploadedFunction = onVkPhotoUploaded;
if (_callback == null || _image == null || _albumDescription == null) {
throw new ArgumentError("one of the arguments is null");
}
_vk.api("photos.getAlbums", { }, onAlbums, onVkError );
}
public static function saveToWall(image:Bitmap, callback:Function, message:String = "тестовое сообщение"):void {
if (_vk == null) {
throw "vk is null, call initialize() method first";
}
if (_image) return;
_image = image;
_callback = callback;
_message = message;
_onUploadedFunction = onVkWallPhotoUploaded;
if (_callback == null || _image == null) {
throw new ArgumentError("one of the arguments is null {saveToWall()}");
}
requestVkWallUploadServer();
}
static private function requestVkWallUploadServer():void { // получение сервера загрузки сообщения на стену
_vk.api("photos.getWallUploadServer", {}, onVkUploadServer, onVkError);
}
private static function onAlbums(params:Object):void {
if (params is Array) {
var arr:Array = params as Array;
} else {
arr = [params];
}
var albumFound:Boolean = false;
for (var i:String in arr) {
if (arr[i].title == _albumTitle) {
_albumID = arr[i].aid;
albumFound = true;
break;
}
}
if (albumFound == false) {
_vk.api("photos.createAlbum",
{ title: _albumTitle, description: _albumDescription,
comment_privacy: 0, privacy: 0 },
onAlbumCreated, onVkError);
} else {
requestVkUploadServer();
}
}
private static function requestVkUploadServer():void {
_vk.api("photos.getUploadServer", { aid: _albumID }, onVkUploadServer, onVkError);
}
private static function onAlbumCreated(params:Object):void {
_albumID = params.aid;
requestVkUploadServer();
}
private static function onVkUploadServer(params:Object):void {
_vkUploadServer = params.upload_url;
uploadVkPhoto();
}
private static function uploadVkPhoto():void {
var imageStream:ByteArray = PNGEncoder.encode(_image.bitmapData);
var stream:ByteArray = new ByteArray();
var boundary:String = "----------Ij5ae0ae0KM7GI3KM7";
var imageName:String = MD5.encrypt(getTimer() + "") + ".png";
stream.writeUTFBytes("--" + boundary + '\r\nContent-Disposition: form-data; name="file1"; filename="' + imageName + '"\r\nContent-Type: image/png\r\n\r\n');
stream.writeBytes(imageStream);
stream.writeUTFBytes("\r\n--" + boundary + '--\r\n');
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "multipart/form-data; boundary=" + boundary);
var urlRequest:URLRequest = new URLRequest(_vkUploadServer);
urlRequest.requestHeaders.push(header);
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = stream;
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
urlLoader.addEventListener( Event.COMPLETE, _onUploadedFunction );
urlLoader.addEventListener( IOErrorEvent.IO_ERROR, photoUploadError );
try {
urlLoader.load( urlRequest );
} catch (e:Error) {
trace(e.getStackTrace());
}
}
private static function onVkPhotoUploaded(e:Event):void {
e.target.addEventListener( Event.COMPLETE, _onUploadedFunction );
e.target.addEventListener( IOErrorEvent.IO_ERROR, photoUploadError );
var responce: Object = Json.decode(unescape(String(e.target.data)));
var server: String = responce.server;
var hash: String = responce.hash;
var photosList: String = responce.photos_list;
var aid: String = responce.aid;
_vk.api("photos.save", { photos_list: photosList, aid: aid, hash: hash, server: server },
onVkPhotoSaved, onVkError );
}
private static function onVkWallPhotoUploaded(e:Event):void {
e.target.addEventListener( Event.COMPLETE, _onUploadedFunction );
e.target.addEventListener( IOErrorEvent.IO_ERROR, photoUploadError );
var responce: Object = Json.decode(unescape(String(e.target.data)));
var server: String = responce.server;
var hash: String = responce.hash;
var photo: String = responce.photo;
_vk.api("photos.saveWallPhoto", { photo: photo, hash: hash, server: server },
onWallPhotoSaved, onVkError );
}
private static function onWallPhotoSaved(params:Object):void { // {"response":[{"pid":304710821,"id":"photo5495786_304710821","aid":-14,"owner_id":5495786,"src":"http:\/\/cs310520.vk.me\/v310520786\/e86\/OmTNZyBed-k.jpg","src_big":"http:\/\/cs310520.vk.me\/v310520786\/e87\/hj5i19qujd0.jpg","src_small":"http:\/\/cs310520.vk.me\/v310520786\/e85\/AydkwTofv-c.jpg","width":338,"height":302,"text":"","created":1371100727}]}
var imageID:String = params[0].id;
//trace("THIS IS IMAGE ID", imageID, "VKPhotoUploader");
_vk.api("wall.post", { message: _message, attachments: imageID },
function(o:Object):void {}, function(p:Object):void { } );
}
private static function onVkPhotoSaved(params:Object):void {
dispose();
}
private static function photoUploadError(e:IOErrorEvent):void {
e.target.addEventListener( Event.COMPLETE, onVkPhotoUploaded );
e.target.addEventListener( IOErrorEvent.IO_ERROR, photoUploadError );
dispose();
}
private static function onVkError(param:Object):void {
trace(Json.encode(param));
dispose();
}
private static function dispose():void {
if (_callback != null) {
_callback.call();
_callback = null;
}
if (_image) {
_image.bitmapData.dispose();
_image = null;
}
_albumTitle = null;
_albumDescription = null;
_onUploadedFunction = null;
_message = "";
}
}
}
И для одноклассников
Код AS3:
package {
import api.com.odnoklassniki.Odnoklassniki;
import flash.display.Bitmap;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestHeader;
import flash.net.URLRequestMethod;
import flash.utils.ByteArray;
import flash.utils.getTimer;
import api.com.adobe.images.PNGEncoder;
import api.com.odnoklassniki.Odnoklassniki;
import api.com.odnoklassniki.sdk.photos.Photos;
import api.com.odnoklassniki.sdk.stream.Stream;
import vk.api.MD5;
import vk.api.serialization.json.Json;
/**
* ...
* @author Konstantin
*/
public class OKPhoto {
private var _callback: Function = null;
private var _albumID: String = "";
private var _erCallback: Function = null;
private var _vkUploadServer: String = null;
private var _image: Bitmap = null;
private var _albumDescription: String = "";
private var _albumTitle: String = "";
private var _onUploadedFunction: Function = null;
private var _message: String = "";
private var _confirmMessage: String = ""; // сообщение на окне подтверждения
private var _okUploadServer: String;
private var _photoID: String;
private var _token: String;
private var _toStream: Boolean = false;
private var _imageSRC: String; // url картинки для поста в ленту
public function OKPhoto(toStream:Boolean = false ) {
_toStream = toStream;
}
public static function publishToStream(image:Bitmap, callback:Function, erCallback:Function, message:String, confirmMessage:String, albumName:String):void {
var okPhoto: OKPhoto = new OKPhoto(true);
okPhoto.message = message;
okPhoto.confirmMessage = confirmMessage;
okPhoto.saveToAlbum(image, callback, erCallback, albumName, "Альбом приложения " + albumName);
}
public static function saveAlbumPhoto(image:Bitmap, callback:Function, erCallback:Function, albumTitle:String = "", albumDescription:String = ""):void {
var okPhoto:OKPhoto = new OKPhoto();
okPhoto.saveToAlbum(image, callback, erCallback, albumTitle, albumDescription);
}
public function saveToAlbum(image:Bitmap, callback:Function, erCallback:Function, albumTitle:String = "", albumDescription:String = ""):void {
_callback = callback;
_erCallback = erCallback;
_albumTitle = albumTitle;
_albumDescription = albumDescription;
if (_image) {
if (_image.bitmapData) {
_image.bitmapData.dispose();
}
_image = null;
}
_image = image;
_onUploadedFunction = onAlbumPhotoUploaded;
if (_callback == null || _image == null || _albumDescription == null) {
throw new ArgumentError("one of the arguments is null");
}
Photos.getAlbums(onAlbumsList);
}
private function onAlbumsList(params:Object):void {
var albums: Array = params.albums as Array;
var albumFound: Boolean = false;
for (var i:String in albums) {
var aid: String = albums[i].aid;
var title: String = albums[i].title;
if (title == _albumTitle) {
albumFound = true;
_albumID = aid;
break;
}
}
if (albumFound == false) {
Photos.createAlbum(_albumTitle, "public", onAlbumCreated, _albumDescription);
} else {
getUploadServer();
}
}
private function getUploadServer():void {
Odnoklassniki.callRestApi("photosV2.getUploadUrl", onUploadServer, {aid : _albumID });
}
private function onUploadServer(params:Object):void {
_okUploadServer = params.upload_url;
uploadPhoto();
}
private function uploadPhoto():void {
if (!_image || !_image.bitmapData) return;
var imageStream:ByteArray = PNGEncoder.encode(_image.bitmapData);
var stream:ByteArray = new ByteArray();
var boundary:String = "---------------------------11020459624021";
var imageName:String = MD5.encrypt(getTimer() + "") + ".png";
stream.writeUTFBytes("--" + boundary + '\r\nContent-Disposition: form-data; name="file1"; filename="' + imageName + '"\r\nContent-Type: image/png\r\n\r\n');
stream.writeBytes(imageStream);
stream.writeUTFBytes("\r\n--" + boundary + '--\r\n');
var header:URLRequestHeader = new URLRequestHeader ("Content-type", "multipart/form-data; boundary=" + boundary);
var urlRequest:URLRequest = new URLRequest(_okUploadServer);
urlRequest.requestHeaders.push(header);
urlRequest.method = URLRequestMethod.POST;
urlRequest.data = stream;
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.TEXT;
urlLoader.addEventListener( Event.COMPLETE, _onUploadedFunction );
urlLoader.addEventListener( IOErrorEvent.IO_ERROR, photoUploadError );
try {
urlLoader.load( urlRequest );
} catch (e:Error) {
trace(e.getStackTrace());
}
_image.bitmapData.dispose();
_image = null;
}
private function onAlbumPhotoUploaded(e:Event):void {
e.target.addEventListener( Event.COMPLETE, _onUploadedFunction );
e.target.addEventListener( IOErrorEvent.IO_ERROR, photoUploadError );
//var data:String = Json.encode(e.target.data);
var params: Object = Json.decode(String(e.target.data));
var photos: Object = params.photos;
for (var i:String in photos) {
_photoID = i;
_token = photos[i].token;
Odnoklassniki.callRestApi("photosV2.commit", onPhotoCommit, { photo_id: _photoID, token: _token, comment: "Название приложения" } );
break;
}
}
private function onPhotoCommit(params:Object):void {
if (!_toStream) {
if (_callback != null) {
_callback.call();
}
dispose();
} else {
var photos:Array = params.photos as Array;
_photoID = photos[0].assigned_photo_id;
Odnoklassniki.callRestApi("photos.getPhotoInfo", onPhotoInfo, { photo_id: _photoID } );
}
}
private function onPhotoInfo(params:Object):void {
_imageSRC = params.photo.pic640x480;
Stream.publish(_confirmMessage, _message,
onStreamPublish, "",
{ caption: _message, media: [{ type: "image", src: _imageSRC }]});
}
private function onStreamPublish(params:Object):void {
dispose();
}
private function photoUploadError(e:IOErrorEvent):void {
e.target.addEventListener( Event.COMPLETE, _onUploadedFunction );
e.target.addEventListener( IOErrorEvent.IO_ERROR, photoUploadError );
if (_erCallback != null) {
_erCallback.call();
}
dispose();
}
private function onAlbumCreated(params:Object):void {
if (!(params is String) && params.error_data) {
if (params.error_data == "photo_content") {
Odnoklassniki.showPermissions("PHOTO_CONTENT");
}
} else if (params is String) {
_albumID = String(params);
getUploadServer();
}
//trace("ALBUM CREATED", Json.encode(params));
}
public function get message():String {
return _message;
}
public function set message(value:String):void {
_message = value;
}
public function get confirmMessage():String {
return _confirmMessage;
}
public function set confirmMessage(value:String):void {
_confirmMessage = value;
}
private function dispose():void {
if (_image) {
_image.bitmapData.dispose();
_image = null;
}
_onUploadedFunction = null;
_callback = null;
_erCallback = null;
}
}
}
Все работает через стаитческие методы. Никаких экземпляров создавать не надо.
Ну там на зависимости обращаем внимания. Там кое где есть импорт разных либ, так что их тоже надо иметь. Но, думаю это не проблема
п.с. Какие-то вопросы мне задавать бессмысленно, писал это года 3 - 4 назад, уже вообще не помню как и что работает точно
|