В этом уроке вы узнаете, как хранить данные в XML базах данных на примере взаимодействия приложения со списком заблокированных пользователей.
1. Создаём Новый документ Flash File (ActionScript 3.0)
Добавляем на сцену:
- Две кнопки. Называем их block_button и unblock_button.
- Любой квадратный MovieClip(он будет фоном для сообщения). Называем его punishment_window.
Сохраняем *.fla файл.
2. Скачиваем библиотеку VkApiNode
http://rghost.ru/3775379
Папку vk из архива перемещаем в папку с сохраненным fla.
3. Создаем Новый as-файл
Пишем в него код:
Код: Выделить всё
/* Специально для flapps.ru */package{ import flash.display.MovieClip; import flash.text.*; import flash.events.*; import flash.net.*; import vk.*; public class AnyGame extends MovieClip { private var loader:URLLoader; private var loader2:URLLoader; private var loader3:URLLoader; private var punishment_message:TextField; private var wrapper:Object; private var api_id; private var viewer_id:Number; private var server_url; private var uid_is_blocked:int; public function AnyGame() { this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); } private function onAddedToStage(e:Event):void { wrapper=Object(parent.parent); server_url=wrapper.application.parameters.api_url; viewer_id=wrapper.application.parameters.viewer_id; //Добавляем поле для сообщения punishment_message = new TextField(); punishment_message.defaultTextFormat = new TextFormat("Arial", 14, 0x36638e, false); punishment_message.x = punishment_window.x-punishment_window.width/2; punishment_message.y = 0.97*punishment_window.y; punishment_message.width = punishment_window.width; punishment_message.height = punishment_window.height/2; addChild(punishment_message); //Добавляем кнопкам слушатели block_button.addEventListener(MouseEvent.CLICK, blockMe); unblock_button.addEventListener(MouseEvent.CLICK, unBlockMe); //Добавляем проверку на состояние аккаунта addEventListener(Event.ENTER_FRAME, messageText); gameVerification(); } //Загружаем состояние аккаунта private function gameVerification() { loader = new URLLoader(); var url_request:URLRequest=new URLRequest("http://localhost/verification.php"); //Адрес php скрипта var variables:URLVariables = new URLVariables(); url_request.method=URLRequestMethod.POST; variables['auth_key']=wrapper.application.parameters.auth_key; variables['viewer_id']=wrapper.application.parameters.viewer_id; url_request.data=variables; loader.load(url_request); loader.addEventListener(Event.COMPLETE, onDataLoaded); } //Когда результат получен, задаем переменной uid_is_blocked значение private function onDataLoaded(event:Event):void { var script_response:XML = new XML(loader.data); uid_is_blocked=script_response.ban[0].toString(); } //Слушаем состояния переменной uid_is_blocked каждый кадр private function messageText(event:Event) { if(uid_is_blocked == 1) punishment_message.htmlText = ' Ваш аккаунт заблокирован'; else punishment_message.htmlText = 'Ваш аккаунт не заблокирован'; } private function blockMe(event:MouseEvent):void { //Если пользователь заблокирован, возвращаемся if(uid_is_blocked==1) return; //А если нет, то обращаемся к скрипту loader2 = new URLLoader(); var url_request2:URLRequest=new URLRequest("http://localhost/blocking.php"); //Адрес php скрипта var variables2:URLVariables = new URLVariables(); url_request2.method=URLRequestMethod.POST; variables2['auth_key']=wrapper.application.parameters.auth_key; variables2['viewer_id']=wrapper.application.parameters.viewer_id; url_request2.data=variables2; loader2.load(url_request2); loader2.addEventListener(Event.COMPLETE, function():void { gameVerification(); }); } private function unBlockMe(event:MouseEvent):void { //Если пользователь не заблокирован, возвращаемся if(uid_is_blocked==0) return; //А если нет, то обращаемся к скрипту loader3 = new URLLoader(); var url_request3:URLRequest=new URLRequest("http://localhost/unblocking.php"); //Адрес php скрипта var variables3:URLVariables = new URLVariables(); url_request3.method=URLRequestMethod.POST; variables3['auth_key']=wrapper.application.parameters.auth_key; variables3['viewer_id']=wrapper.application.parameters.viewer_id; url_request3.data=variables3; loader3.load(url_request3); loader3.addEventListener(Event.COMPLETE, function():void { gameVerification(); }); } }}
Подключаем AnyGame.as к fla. Если не знаете как это сделать, то смотрим тут http://flapps.ru/forum/topic3.html (пункт 6).
Экспортируем приложение.
4. Создаем файл block_list.xml(это и есть наша база данных) и пишем в него код:
Код: Выделить всё
<?xml version="1.0" encoding="UTF-8"?><list><uids_head/></list>
Код: Выделить всё
<?php//Скрипт для импорта в остальные скрипты, его нужно настроить $app_id = 'api_id'; //ID приложения$secret = 'secret'; //Защищенный ключ приложения$file_path = 'http://localhost/'; //Путь к XML базе данных$file_name = 'block_list.xml'; //Название XML базы данных?>
6. Создаем файл blocking.php и пишем в него код:
Код: Выделить всё
<?php//Скрипт для занесения ID пользователя в XML базу данных include 'config.php'; $auth_key = $_POST['auth_key'];$viewer_id = (int)$_POST['viewer_id']; $valid_key = md5($app_id."_".$viewer_id."_".$secret);if ($auth_key == $valid_key){ //Загружаем XML базу данных $xml = new DomDocument(); $xml->preserveWhitespace = false; $xml->load($file_path.$file_name); $xpath = new DOMXPath($xml); //Устанавливаем место в списке для нового ID $new_uid_place = $xpath->query('/list/uids_head[position() = 1]')->item(0); //Для начала создадим сам элемент uid $new_uid = $xml->createElement('uid'); //Потом добавим ему атрибут id $uid_attr = $xml->createAttribute('id'); $new_uid->appendChild($uid_attr); //Затем присвоим атрибуту id значение равное ID пользователя, которого мы заблокировали $attr_text = $xml->createTextNode($viewer_id); $uid_attr->appendChild($attr_text); //Добавляем элемент uid в XML базу данных $new_uid_place->parentNode->insertBefore($new_uid, $new_uid_place->nextSibling); //Сохраняем header('Content-type: text/plain; charset=utf-8'); $xml->save($file_name); } else { //Для тех, кто решил перейти по ссылке со скриптом ;) echo "Hacking Attempt!"; exit;}?>
Код: Выделить всё
<?php//Скрипт для удаления ID пользователя из XML базы данных include 'config.php'; $auth_key = $_POST['auth_key'];$viewer_id = (int)$_POST['viewer_id']; $valid_key = md5($app_id."_".$viewer_id."_".$secret);if ($auth_key == $valid_key){ //Загружаем XML базу данных $dom = new DOMDocument(); $dom->preserveWhiteSpace = false; $dom->load($file_path.$file_name); $xpath = new DOMXPath($dom); //Узнаем, есть ли такой ID в списке $target = $xpath->query("/list/uid[@id=".$viewer_id."]")->item(0); //Если такого ID нету, то возвращаем "null" if($target == false) return; //Если такой ID есть, то удаляем его из списка $target->parentNode->removeChild($target); //Сохраняем header('Content-type: text/plain; charset=utf-8'); $dom->save('block_list.xml'); } else { //Для тех, кто решил перейти по ссылке со скриптом ;) echo "Hacking Attempt!"; exit;}?>
Код: Выделить всё
<?php//Скрипт проверки блокировки пользователя, возвращает "0", если ID не заблокирован и "1", если ID заблокирован include 'config.php'; $auth_key = $_POST['auth_key'];$viewer_id = (int)$_POST['viewer_id']; $valid_key = md5($app_id."_".$viewer_id."_".$secret);if ($auth_key == $valid_key){ //Создаем парсер $reader = new XMLReader(); //И открываем базу данных $reader->open($file_path.$file_name); //После чего возвращаем ответ echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; echo "<response>"; echo "<ban>"; //Задаем ответу значение по умолчанию равное "0", в том случае, если такого ID нету $ban = 0; while ($reader->read()) { //Если такой ID пользователя есть в списке заблокированных, то возвращаем ответ равный "1" if ($reader->nodeType != XMLREADER::END_ELEMENT && $reader->name == "uid" && $reader->nodeType == XMLReader::ELEMENT && $reader->getAttribute('id') == $viewer_id) $ban = 1; } echo $ban; echo "</ban>"; echo "</response>";} else { //Для тех, кто решил перейти по ссылке со скриптом ;) echo "Hacking Attempt!"; exit;}?>
Код: Выделить всё
<cross-domain-policy><allow-access-from domain="*.vkontakte.ru" /><allow-access-from domain="*.vk.com" /></cross-domain-policy>
Не забываем о том, что:
- Приложение должно быть включено.
- С использованием контейнера.
- Все php и xml файлы(кроме rossdomain.xml) должны быть в одной директории
- Файл AnyGame.as должен быть отредактирован под себя
- В корневой папке вашего сервера должен быть crossdomain.xml
11. Тестируем приложение, если вы все сделали правильно, то при ваше приложение будет выглядеть вот так:
Исходник(fla файл сохранен в CS5) : http://depositfiles.com/ru/files/fkmfbifq9
Автор: Nick Lisogor