Использование XML БД на примере блокировки пользователя

Только готовые уроки по использованию ВКонтакте API. Flash + PHP + API. НЕ IFrame!
Ответить
Nick Lisogor
FL Team
FL Team
Сообщения: 119
Зарегистрирован: 12 дек 2010, 14:08

Использование XML БД на примере блокировки пользователя

Сообщение Nick Lisogor »

Использование XML БД на примере блокировки пользователя

В этом уроке вы узнаете, как хранить данные в 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();            });        }    }}
Сохраняем файл в папку с fla , редактируем его и называем его AnyGame.as .
Подключаем 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>
5. Создаем файл config.php и пишем в него код:

Код: Выделить всё

 <?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;}?>
7. Создаем файл unblocking.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 базу данных  $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;}?> 
8. Создаем файл verification.php и пишем в него код:

Код: Выделить всё

<?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;}?> 
9. Проверяем, есть ли в корневой папке вашего сервера crossdomain.xml, если же его нет, создаем его там и пишем в него вот этот код:

Код: Выделить всё

<cross-domain-policy><allow-access-from domain="*.vkontakte.ru" /><allow-access-from domain="*.vk.com" /></cross-domain-policy>
10. Загружаем приложение в контакт

Не забываем о том, что:
- Приложение должно быть включено.
- С использованием контейнера.
- Все php и xml файлы(кроме rossdomain.xml) должны быть в одной директории
- Файл AnyGame.as должен быть отредактирован под себя
- В корневой папке вашего сервера должен быть crossdomain.xml

11. Тестируем приложение, если вы все сделали правильно, то при ваше приложение будет выглядеть вот так:

Изображение

Исходник(fla файл сохранен в CS5) : http://depositfiles.com/ru/files/fkmfbifq9


Автор: Nick Lisogor
Dav023
Сообщения: 73
Зарегистрирован: 12 июл 2010, 01:35

Re: Использование XML БД на примере блокировки пользователя

Сообщение Dav023 »

Ох...а если я буду знать где располагается твоя XML база то я ее могу открыть через браузер и что угодно с ним сделать???
Noise Gate
Сообщения: 691
Зарегистрирован: 28 апр 2010, 12:34

Re: Использование XML БД на примере блокировки пользователя

Сообщение Noise Gate »

Весьма познавательно, но изврат)))
В базе удобнее, имхо.

Dav023
можно будет просмотреть, но не отредактировать
Nick Lisogor
FL Team
FL Team
Сообщения: 119
Зарегистрирован: 12 дек 2010, 14:08

Re: Использование XML БД на примере блокировки пользователя

Сообщение Nick Lisogor »

Dav023 писал(а):Ох...а если я буду знать где располагается твоя XML база то я ее могу открыть через браузер и что угодно с ним сделать???
БД можно переименовать.
Noise Gate писал(а):Весьма познавательно, но изврат)))
В базе удобнее, имхо.
Этот урок сделан для того, чтобы показать основные методы хранения временных/постоянных данных в XML и их обработки, он очень удобен для принятия XML данных со стороны Flash. Насчет хранения данных - не спорю)
swing1991
Сообщения: 42
Зарегистрирован: 08 ноя 2010, 20:31

Re: Использование XML БД на примере блокировки пользователя

Сообщение swing1991 »

Sasha писал(а):а сurl нужен???
Ты видел где-то в коде CURL ?
Nick Lisogor
FL Team
FL Team
Сообщения: 119
Зарегистрирован: 12 дек 2010, 14:08

Re: Использование XML БД на примере блокировки пользователя

Сообщение Nick Lisogor »

Sasha писал(а):а сurl нужен???
Почитай о том, что такое CURL и поймешь, для чего он нужен, а для чего нет.
Ответить