|
|
|||||
Постинг скрина на стену ВКонтакте
всем привет.
Есть приложение вконтакте. В приложении есть кнопочка "скрин", по нажатию которой должен происходить снимок экрана и постинг скрина на стену выбранному пользователю. с основной частью разобрался: все ништяк, принажатии "скрин" происходит снимок экрана, создается альбом (если его ещё нет с таким названием) и туда добавляется новая фотка. Но вопрос, как этот скрин разместить на стене? Ничего не выходит, открывает просто приложение, где все нелепо дергается, так как action script не идет. Вопрос в том, где сохранить и как передать айди нужной фотки приложению, открываемому со стены, чтобы оно открывало именно ту фотку, которую надо. |
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Цитата:
Id фото для getById будет poster_id + "_" + post_id. |
|
|||||
в очередной раз большое спасибо to udaaff! Хоть и изломал голову, но таки решил проблему. ) Приведу код, вдруг кому поможет. Предупреждаю сразу - пишу пока что по ламерски в первом фрэйме. Хоть и осознаю, что .as файлами писать гораздо правильней, лаконичней удобней потом модифицировать программу, но меня почему-то пока что такой способ пугает.. хотя надо...
В данном коде, имхо, полностью раскрыта тема Снятия сэкрана Битовой маски, создания альбома вконтакте и отправки этой битовой маски в качестве фотографии в этот альбом, после чего постинг получившейся фотографии на стену выбранного друга. все дело происходит при нажатии на кнопку scrin vkr - это переменная, в которой лежит класс VkontakteRequest Добавлено через 2 минуты scrin.butScreen.addEventListener(MouseEvent.CLICK, prtScr) scrin.butScreen.useHandCursor = true; scrin.butScreen.buttonMode = true; function prtScr(e:Event):void { var ssil:String;//ссылка на фото var Alboms:XML; //сканирование альбомов var boolAlbom:Boolean = false; //добавлен ли альбом c определенным названием var IDAlbom:String; //айдишник альбома var AlbTitle:String = "My Albom" //назване альбома автоматов var UploadURL:String; //адрес сервера на который грузить фотки; vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onGetUserSettingsResponse); vkr.sendGetUserSettings(); function onGetUserSettingsResponse(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onGetUserSettingsResponse); trace('Boolean(e.xml.settings & 512) = '+Boolean(e.xml.settings & 512)) if((Boolean(e.xml.settings & 512)==false)||(Boolean(e.xml.settings & 4)==false)) //проверяем: если у юзера в настройках не стоят галочки "доступ к фотографиям" и "постинг на стену" { wrapper.addEventListener("onSettingsChanged", onSettingsChange); wrapper.external.showSettingsBox(516); //то вызываем окошечко с предложением это сделать function onSettingsChange(e: Object): void { wrapper.removeEventListener("onSettingsChanged", onSettingsChange); _getAlboms(); } } else { //если все ништяк и галки стоят - проверяем альбомы _getAlboms(); } } function _getAlboms():void { vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onGetAlbumResponse); vkr.addEventListener(VkontakteEvent.VK_ERROR, onGetAlbumError); vkr.sendGetAlbum(); function onGetAlbumResponse(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onGetAlbumResponse); Alboms = e.xml; trace('\n'+'Список альбомов (Alboms) = '+Alboms) _findCreatedAlbom(); //получаем список альбомов юзера, заносим в переменную и вызываем функц. поиск альбома } function onGetAlbumError(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_ERROR, onGetAlbumError); trace('\n'+'Ошибочка вышла') } } function _findCreatedAlbom():void //функция сканирует альбомы на предмет того, создавал ли пользователь уже такой { for(var i:Number=0; i<Alboms..album.length(); i++) //перебираем альбомы { if(Alboms.album[i].title == AlbTitle) { trace('\n'+"В конце же концов!! Хватит создавать альбомы один за другим!") IDAlbom = Alboms.album[i].aid boolAlbom = true; _GetUploadServer(IDAlbom); //если название альбома совпадает с именем нашего альбома ("My Albom"), значит он //уже создан, о чем мы сообщаем в переменную boolAlbom и запускаем функц //для получения ссылки для загрузки нашего скрина в данный альбом } } if(boolAlbom==false) { _createAlb(); //если же boolAlbom так и осталась false, значит альбома с таким названием ещё нет, //что мы тут же исправляем, запуская функцию _createAlb() } } function _createAlb():void { trace("\n"+"создаем альбом"); vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onCreateAlbumResponse); vkr.addEventListener(VkontakteEvent.VK_ERROR, onCreateAlbumError); vkr.sendCreateAlbum(AlbTitle); } function onCreateAlbumResponse(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onCreateAlbumResponse); trace("ответ, который пришел(?) = "+e.xml) trace('а так же переменная, которая мне чрезвычайно нужна = '+e.xml.album.aid) IDAlbom = e.xml.album.aid _GetUploadServer(IDAlbom); } function onCreateAlbumError(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_ERROR, onCreateAlbumError); trace("ответ, который пришел(?) = "+e.message) } function _GetUploadServer(IDA):void { trace("\n"+"получаем адрес для загрузки"); vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onGetUploadServerResponse); vkr.addEventListener(VkontakteEvent.VK_ERROR, onGetUploadServerError); vkr.sendGetUploadServer(IDA); } function onGetUploadServerResponse(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onGetUploadServerResponse); UploadURL = e.xml.upload_url; trace('\n'+'UploadURL ===> '+UploadURL) //ура, получили ссылку на загрузку фоток, сохраняем её в переменную и запускаем функц //выбор друга, при помощ которой пользователь сможет выбрать друга, на стену которого //он хочет загрузить скрин. _viborDruga(); } function onGetUploadServerError(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_ERROR, onGetUploadServerError); trace('Errora') } var Wally = wrapper.application.parameters["viewer_id"]; //это на будущее, заносим в переменную Wally viewer_id. //в ней будет хранится id пользователя, на стену которого будет поститься скрин //теперь будет длинная функция Выбор друга. //тут используется некий RaytingerArr //это массив, полученный в результате вызова метода getProfiles(id:String) в другой части программы //чтобы было понятно, что в нем лежит, приведу кусок кода оттуда: /* function onGetProfilesResponse2(e: VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onGetProfilesResponse2); for(var I:Number=0; I<e.xml..user.length(); I++) { RaytingerArr.push([e.xml.user[i].first_name, e.xml.user[i].photo_medium, e.xml.user[i].last_name, e.xml.user[i].uid]) } */ |
|
|||||
function _viborDruga():void { var forScroll2 = new ForScroll(); //добавляю символ из библиотеки, который состоит из 7-ми элементов //1 - фоновое окошечко - cath. Область захвата среднего колеса //2 - кнопочка ExiT - прсто крестик, как в винде //3 - мувик scrollMaster - внутри него лежит маска, под которой мувик toScroll, который будет под этой маской скроллроваться и куда //будет аттачиться список друзей //4, 5, 6, 7 - кнопочки управления списком raitingerPlay, raitingerPlay1, raitingerPeremot, raitingerPeremot1 //вобщем как сумел объяснил, времени не сильно много вдаваться в подробности. //8 - SCR - ползунок, отображающий положений текста. По хорошему его бы тоже задействовать, чтобы можно было управлять, //но я пока поленился... var podSCR = new PodSCR(); // это просто элемент дизайна, вам не важен addChild(forScroll2); addChild(podSCR) var Sp2 = 17; var Speeder2 = 0; addEventListener(Event.ENTER_FRAME, weeel2) function weeel2(e:Event):void { if(forScroll2.scrollMaster.toScroll.y>0.1) { var minus2 = forScroll2.scrollMaster.toScroll.y-34 forScroll2.scrollMaster.toScroll.y = minus2 } if(forScroll2.scrollMaster.toScroll.y<0.1-(textHeight*RaytingerArr.length-(textHeight*15))) { var plus2 = forScroll2.scrollMaster.toScroll.y+34 forScroll2.scrollMaster.toScroll.y=plus2 } if(forScroll2.scrollMaster.toScroll.y<0.1) { if(_PlayUpScroll==true) { Speeder2++ if(Speeder2>10) { Sp2 = 17*3 trace("timeout UP") } forScroll2.scrollMaster.toScroll.y+=Sp2; } } if(forScroll2.scrollMaster.toScroll.y>0.1-(textHeight*RaytingerArr.length-(textHeight*15))) { if (_PlayDownScroll==true) { Speeder2++ if(Speeder2>10) { Sp2 = 17*3 trace("timeout DOWN") } forScroll2.scrollMaster.toScroll.y-=Sp2; } } forScroll2.scrollMaster.SCR.y = (173*(forScroll2.scrollMaster.toScroll.y/(255-forScroll2.scrollMaster.toScroll.height)))+51.4 if((mouseX>225)&&(mouseX<600)&&(mouseY>187)&&(mouseY<487)) { MouseWheel.capture(); //захватываем колесо мыши, чтобы было удобно юзеру прокручивать) //Класс MouseWheel можно скачать, гуглите } else { MouseWheel.release(); //отпускаем колесо мыши } } addEventListener(MouseEvent.MOUSE_WHEEL, scrolling2); function scrolling2(event:MouseEvent):void { forScroll2.scrollMaster.SCR.y = (173*(forScroll2.scrollMaster.toScroll.y/(255-forScroll2.scrollMaster.toScroll.height)))+51.4 if(event.delta >0) //если колесико вверх { if(forScroll2.scrollMaster.toScroll.y<0.1) { forScroll2.scrollMaster.toScroll.y+=textHeight } } if(event.delta <0) //если колесико вниз { if(forScroll2.scrollMaster.toScroll.y>0.1-(textHeight*RaytingerArr.length-(textHeight*15))) { forScroll2.scrollMaster.toScroll.y-=textHeight } } } ///////////////////////// ///////////////////////// var FScrollArr2:Array = new Array; for(var i:Number=0; i<RaytingerArr.length; i++) { var fff2 = new FFF(); //это просто мувик-контейнер FScrollArr2.push(new TextField()); forScroll2.scrollMaster.toScroll.addChild(fff2); fff2.addChild(FScrollArr2[i]); FScrollArr2[i].width = 302; FScrollArr2[i].height = textHeight; FScrollArr2[i].x fff2.x=0; fff2.y=i*textHeight; fff2.mouseChildren = false; FScrollArr2[i].defaultTextFormat = fmtTObBB; FScrollArr2[i].background = true; FScrollArr2[i].border = true; FScrollArr2[i].backgroundColor = 0x007D00; FScrollArr2[i].text = RaytingerArr[i][0]+" "+RaytingerArr[i][2]; //имя-фамилия друга под номером i в массиве FScrollArr2[i].selectable = false; fff2.addEventListener(MouseEvent.MOUSE_OVER, scrollButsaOver2) fff2.addEventListener(MouseEvent.MOUSE_OUT, scrollButsaOut2) fff2.addEventListener(MouseEvent.CLICK, scrollButsaClik2) fff2.IDtext = RaytingerArr[i][3] fff2.ind = i } function scrollButsaClik2(e:Event):void { Wally= String(e.target.IDtext); //при нажатии на одного из друзей заносим его id в переменную Wally removeChild(podSCR); removeChild(forScroll2); _upLoadPhoto(UploadURL); //запускаем загрузку фотки в альбом removeEventListener(Event.ENTER_FRAME, weeel2); } function scrollButsaOver2(e:Event):void { FScrollArr2[e.target.ind].backgroundColor = 0x013500; FScrollArr2[e.target.ind].setTextFormat(fmtTRATATA) } function scrollButsaOut2(e:Event):void { FScrollArr2[e.target.ind].backgroundColor = 0x007D00; FScrollArr2[e.target.ind].setTextFormat(fmtTObBB) } /////////////////////////////////////// //////////БУТСЫ фо скролла///////////// ////////////////////////////////////// forScroll2.raitingerPlay1.addEventListener(MouseEvent.CLICK, onPlayUpScroll2) forScroll2.raitingerPlay1.addEventListener(MouseEvent.MOUSE_DOWN, onDOWN_PlayUpScroll2) forScroll2.raitingerPlay2.addEventListener(MouseEvent.CLICK, onPlayDownScroll2) forScroll2.raitingerPlay2.addEventListener(MouseEvent.MOUSE_DOWN, onDOWN_PlayDownScroll2) forScroll2.raitingerPeremot1.addEventListener(MouseEvent.CLICK, onPeremotUpScroll2) forScroll2.raitingerPeremot2.addEventListener(MouseEvent.CLICK, onPeremotDownScroll2) forScroll2.raitingerPlay1.buttonMode = true; forScroll2.raitingerPlay1.useHandCursor = true; forScroll2.raitingerPlay2.buttonMode = true; forScroll2.raitingerPlay2.useHandCursor = true; forScroll2.raitingerPeremot1.buttonMode = true; forScroll2.raitingerPeremot1.useHandCursor = true; forScroll2.raitingerPeremot2.buttonMode = true; forScroll2.raitingerPeremot2.useHandCursor = true; function onDOWN_PlayUpScroll2(e:Event):void { _PlayUpScroll=true; Sp2 = 17; forScroll2.addEventListener(MouseEvent.MOUSE_UP, onUP_PlayUpScroll2) } function onUP_PlayUpScroll2(e:Event):void { forScroll2.removeEventListener(MouseEvent.MOUSE_UP, onUP_PlayUpScroll2) _PlayUpScroll=false; Sp2 = 17; Speeder2=0 } function onDOWN_PlayDownScroll2(e:Event):void { _PlayDownScroll=true; Sp2 = 17; forScroll2.addEventListener(MouseEvent.MOUSE_UP, onUP_PlayDownScroll2) } function onUP_PlayDownScroll2(e:Event):void { forScroll2.removeEventListener(MouseEvent.MOUSE_UP, onUP_PlayDownScroll2) _PlayDownScroll=false; Sp2 = 17; Speeder2=0 } function onPlayUpScroll2(e:Event):void { trace('forScroll2.scrollMaster.toScroll.y = '+forScroll2.scrollMaster.toScroll.y) if(forScroll2.scrollMaster.toScroll.y<(0.1)) { //forScroll.scrollMaster.toScroll.y+=textHeight } } function onPlayDownScroll2(e:Event):void { trace('forScroll2.scrollMaster.toScroll.y = '+forScroll2.scrollMaster.toScroll.y) if(forScroll2.scrollMaster.toScroll.y>0.1-(textHeight*RaytingerArr.length-(textHeight*15))) { //forScroll.scrollMaster.toScroll.y-=textHeight } } function onPeremotUpScroll2(e:Event):void { forScroll2.scrollMaster.toScroll.y=0.1 } function onPeremotDownScroll2(e:Event):void { forScroll2.scrollMaster.toScroll.y=0.1-(textHeight*RaytingerArr.length-(textHeight*15)) } forScroll2.ExiT.addEventListener(MouseEvent.CLICK, onExiTScroll2) forScroll2.ExiT.buttonMode = true; forScroll2.ExiT.useHandCursor = true; function onExiTScroll2(e:Event):void { removeChild(podSCR); removeChild(forScroll2); removeEventListener(Event.ENTER_FRAME, weeel2) _upLoadPhoto(UploadURL); //запускаем загрузку фотки. Если пользователь не выбрал друга, //значит Wally осталось равно viewer_id и скрин загрузится на стену пользователя. } forScroll2.ExiT.addEventListener(MouseEvent.MOUSE_OVER, onExiTScrollOver2) forScroll2.ExiT.addEventListener(MouseEvent.MOUSE_OUT, onExiTScrollOut2) function onExiTScrollOver2(e:Event):void { forScroll2.ExiT.gotoAndPlay(2) } function onExiTScrollOut2(e:Event):void { forScroll2.ExiT.gotoAndPlay(4) } }//_viborDruga end |
|
|||||
var Wate = new wate(); var sendScr = new SendScr(); function _upLoadPhoto(urlak:String):void { wrapper.external.scrollWindow(500, 500); //скроллируем окно к кнопке sendScr (этот как бы подтверждение отправки) addChild(sendScr); sendScr.x=0; sendScr.y=610; sendScr.addEventListener(MouseEvent.CLICK, sendScrHandler) sendScr.useHandCursor = true; sendScr.buttonMode = true; function sendScrHandler(e:Event):void { addChild(Wate); Wate.x = 0; Wate.y = 608.0; var bmd:BitmapData=new BitmapData(800, 600, false); //--создаем bitmapdata bmd.draw(stage); //--рисуем в битмапе интересующий мувиклип var byteArrayScr : ByteArray = new JPGEncoder(85).encode(bmd); //здесь хотелось бы отметить, что для вышесказанного требуется (и для кое-чего внизу): //import fl.transitions.Tween; //import fl.transitions.easing.*; //import com.adobe.serialization.json.JSON; //import flash.utils.getQualifiedClassName; //import com.adobe.images.JPGEncoder; //import MultipartURLLoader; // var loader:Loader = new Loader(); loader.loadBytes(byteArrayScr); //addChild(loader); var mll:MultipartURLLoader = new MultipartURLLoader(); mll.addEventListener(Event.COMPLETE, onUploadCompleteThroughAlarm); mll.addFile(byteArrayScr, "file.jpg", "file1", 'image/jpg'); mll.load(UploadURL); function onUploadCompleteThroughAlarm(event:Event):void { event.currentTarget.removeEventListener(event.type, arguments.callee); savePhotos(parseServerAck(event.currentTarget.loader.data as String)); trace('********************onUploadCompleteThroughAlarm ==========> ') } function parseServerAck(serverAck:String):* { var result:* = new Object; for each(var pair:String in serverAck.split(/\s*[{},]\s*/)) { var tmp:Array = pair.split(/\s*[:"]\s*/); if ( (tmp[1] == "server") || (tmp[1] == "photos_list") || (tmp[1] == "aid") || (tmp[1] == "hash")) { result[tmp[1]] = tmp[4]; } } return result; } function savePhotos(serverAck:*):void { var variables:URLVariables = new URLVariables; for(var key:String in serverAck) { variables[key] = serverAck[key]; } _savePhoto(variables.aid, variables.server, variables.photos_list, variables.hash) } } function _savePhoto(AiD:String, ServeR:String, Photos_lisT:String, HasH:String):void { vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onSavePhotoResponse); vkr.addEventListener(VkontakteEvent.VK_ERROR, onSavePhotoError); vkr.sendSavePhoto(AiD, ServeR, Photos_lisT, HasH) } function onSavePhotoResponse(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onSavePhotoResponse); trace('........... по идее фотка загрузилась в наш новый альбом... '+'\n'+'e.xml = '+e.xml) ssil = e.xml.photo.src_big; var toWallId = e.xml.photo.pid; var asdf = String(wrapper.application.parameters["viewer_id"]+'_'+e.xml.photo.pid); removeChild(Wate); _SavePost(asdf, toWallId) // а вот это мы уже будем постить фотку из альбома на стену } function onSavePhotoError(e:VkontakteEvent):void { vkr.removeEventListener(VkontakteEvent.VK_ERROR, onSavePhotoError); trace('Большая и страшная Еррора = '+e.message) } } function _SavePost(Photo_id, ToWallId):void { vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onSavePost); trace('Photo_id = '+Photo_id); trace('toWallId = '+ToWallId); vkr.sendSavePost(Wally, Photo_id, ToWallId) function onSavePost(e:VkontakteEvent):void { trace("onSavePost ===> "+e.xml) removeChild(sendScr); wrapper.external.saveWallPost(e.xml.post_hash); gotoAndPlay(1); } } } Вот такая штука... Но даже и этого недостаточно. В начале приложения надо обозначить, что если оно открывается со стены, то нужно образить определенную фотку из определенного альбома определенного юзверя... У меня это реализовано так: var wrapper: Object; this.addEventListener( Event.ADDED_TO_STAGE, onAddedToStage ); //стандартный листенер вконтактовского прелоадера wrapper function onAddedToStage(e: Event): void { var temnovato =new Temno(); addChild(temnovato) wrapper = Object(parent.parent); vkr = new VkontakteRequest(wrapper.application.parameters["viewer_id"], wrapper.application.parameters["api_url"]); trace("wrapper.application.parameters['referrer'] ============>"+wrapper.application.parameters['referrer']) trace("wrapper.application.parameters['post_id'] ============>"+wrapper.application.parameters['post_id']) trace("wrapper.application.parameters['post_id'] ============>"+wrapper.application.parameters['poster_id']) if(wrapper.application.parameters['referrer']=="wall_view_inline") //если со стены { vkr.addEventListener(VkontakteEvent.VK_RESPONSE, onGetByIdResponse); vkr.sendGetById(wrapper.application.parameters['poster_id']+'_'+wrapper.application.parameters['post_id']); function onGetByIdResponse(e: VkontakteEvent): void { vkr.removeEventListener(VkontakteEvent.VK_RESPONSE, onGetByIdResponse); trace('e.xml.photo[0].src_big = '+e.xml.photo[0].src_big) var scrloader = new Loader(); var scrloaderContext2:LoaderContext = new LoaderContext(); scrloaderContext2.checkPolicyFile = true; var scrPRErequest:URLRequest = new URLRequest(e.xml.photo[0].src_big); scrloader.load(scrPRErequest, scrloaderContext2); scrloader.contentLoaderInfo.addEventListener(Event.COMPLETE,SCRcomImage); function SCRcomImage(e:Event):void { removeChild(temnovato); addChild(scrloader); scrloader.width = 800; scrloader.height = 600; } } } else { removeChild(temnovato); } wrapper.external.setTitle('Moе приложение'); wrapper.external.scrollWindow(100, 500); wrapper.addEventListener("onApplicationAdded", onApplicationAdded); wrapper.external.showInstallBox(); } Но вот осталась все-таки одна проблемка... С кодировками. Почему-то, если нузываю альбом по русски то получается incorrect signature, потому что отсылается почему-то абракадабра полная.. хотя по идее все должно быть тип-топ, ведь по умолчанию всегда UTF-8, и контакт должен понимать эту кодировку.. Эта проблема не только тут, точно так же и с пояснениями к альбому - если по русски, что-то там с кодировками. Я пробовал escape().. в этом случае в запросе уже показывается не абракадабра, но все равно incorrect signature... ( Что-тоя видимо не так где-то делаю... Последний раз редактировалось ZergMaster; 08.04.2010 в 15:13. |
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
ZergMaster, encodeURI
/**************************************************************************/ /* Создание альбома у пользователя */ /**************************************************************************/ public function createAlbum(requestData){ var signatureForMD5:String = wrapper.application.parameters.viewer_id + "api_id=" + wrapper.application.parameters.api_id + "method=photos.createAlbum" + "test_mode="+testMode + "title=" + requestData.albumName + "v=2.0" + GlobalParameters.appCode; var signatureMD5:String = convertorMD5.encrypt(signatureForMD5); var requestString:String = wrapper.application.parameters.api_url + "?api_id=" + wrapper.application.parameters.api_id + "&method=photos.createAlbum" + "&sig=" + signatureMD5 + "&test_mode="+testMode + "&title=" + encodeURI(requestData.albumName) + "&v=2.0" ; connectToURL(requestString,"createAlbum"); } |
|
|||||
все равно - Incorrect signature
может я что-то не понял.. я просто написал Последний раз редактировалось ZergMaster; 08.04.2010 в 18:45. |
|
|||||
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Запрос составлять нужно с помощью URLVariables и таких проблем не будет.
|
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
ZergMaster, я специально кусок кода привел - encodeURI только в запросе к серверу
В том тексте, что идет в МД5, encodeURI нет. Там просто русское название. Последний раз редактировалось mikhailk; 08.04.2010 в 19:17. |
Часовой пояс GMT +4, время: 14:38. |
|
« Предыдущая тема | Следующая тема » |
|
|