Отправка результатов MyTestXPro методом POST на веб-сервер в Интернет

Материал из MyTestXPro Wiki Help
Перейти к навигации Перейти к поиску

Иногда отправлять результаты в модуль Журнал (MyTestServer) нет возможности или не целесообразно. В этом случае можно организовать автоматическую отправку результатов по электронной почте или на web-сервер. Первый способ (по эл. почте) более прост в использовании, но менее удобен. Отправка результатов на веб-сервер требуется наличия веб-сервера, где можно организовать прием, все нужные права доступа и знания по программированию для веб, например на PHP.

Логика приема и обработки результатов на веб-сервере может быть у каждого своя, в этом разделе приведем один из примеров от которого можно отталкиваться. В данном примере не будем использовать базы данных, а для простоты только файлы, вы же можете организовывать работу более сложным и гибким образом.

Но учитывайте, что ориентироваться только на текстовые поля не очень надежно, т.к. данные присылаются так же как и обычной веб-формой. Поэтому в важных случаях обращайте внимание на файл с защ. результатами, который тоже присылается.

Для того чтобы модуль тестирования мог отправлять результаты на веб-сервер необходимо в параметрах теста разрешить данную операцию – Параметры теста → Сохранение и вывод результатов → Отправлять результаты в веб.

Так же необходимо настроить модуль тестирования. В настройках нужно установить переключатель "Разрешить отправлять результаты в web" и указать адрес (URL) страницы, которой будут передаваться результаты. Так же можно задать параметры прокси-сервера (через правку файла настроек). В настройках модуля тестирования и настройках автономного теста данные опции (в этой версии) находятся на вкладке с настройками отправки данных по эл. почте.

И, естественно, у вас должен быть веб-сервер, где вы разместите страницу (скрипт) приема и обработки результатов.

Например, скрипт на PHP для приема и сохранения результатов может выглядеть так:

<?php
  ## MyTestXPro http://mytestx.pro
  ## скрипт для приёма и сохранения результатов тестирования от модуля тестирования или автономного теста MyTestXPro методом POST
  ## в настройках программы MyTestXPro (точнее в модуле тестирования) в "настройки POST" адрес указываем типа 
  ## http://ВАШ-САЙТ/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/SaveResult.php?key=8F480FED-621A-41E1-8CB7-E6D4CC9DB76B

  # можно проверить ключ (произвольная переменная (метод GET) в адресе скрипта)
  //if ($_GET['key'] != '8F480FED-621A-41E1-8CB7-E6D4CC9DB76B') return; 

  # проверка связи
  if($_POST['Test'] == 'Test'){ 
    echo 'OK';
    return;
  }
  
  # папка с результатами (не забудьте задать права доступа к этой папке, чтобы можно было в нее записывать файлы)
  $file_dir = $_SERVER['DOCUMENT_ROOT'].'/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/Results/';
  # текстовый файл с результатами (в папке с результатами)
  $file_name = $file_dir . 'data.txt';
  $file_name_csv = $file_dir . 'data.csv';
  # папка для файлов результатов *.mtxpr (можно задать как-то, например, $_SERVER['DOCUMENT_ROOT'].'/Results/') 
  $upload_path_files = $_SERVER['DOCUMENT_ROOT'].'/7D70493E-1D0B-4DCA-9E23-BE0046879A4B/Results/';    
  
  # секретный ключ должен быть такой как в программе (задается в настройках ini-файла, для защиты необходимо указать изменить)
  $SecretKey = '858374A9-EB92-4DAE-AF9C-C3D917C6E152'; 
  $md5SecretKey = md5($SecretKey);
  
  
  # получаем данные, отправленные методом POST  
  $Key0 = $_POST['Key0']; //случайная строка от программы для проверки Key1 и Key2
  $md5Key0 = md5($Key0);  
  $Key1 = $_POST['Key1']; //Key1 - проверка хеша файла теста = md5(md5(файла теста).md5(SecretKey).md5(Key0))
  $Key2 = $_POST['Key2']; //Key2 - проверка хеша UId теста = md5(md5(UId теста).md5(SecretKey).md5(Key0))
  $Key3 = $_POST['Key3']; //Key3 - проверка хеша = md5(UTF8(UID теста, имя, оценка, секрет, key0))
  
  # текст полей в кодировке UTF-8  
  $UId = $_POST['UId'];   
  $UserName = $_POST['UserName'];
  if ($UserName == '') return;  
  $UserGroup = $_POST['UserGroup'];  
  $Mark = $_POST['Mark'];
  $Result = $_POST['Result'];  
  $MaskOfResult = $_POST['MaskOfResult']; 
  
  $ip = $_SERVER['REMOTE_ADDR'];
  $today = date("d.m.Y H:i:s");  
  
  //$Version = $_POST['Version']; 

  # строка с данными разделенными ";", можно открыть в электронных таблицах или разобрать как-то самому
  //$CSV = $_POST['CSV'];  
  
  # для защиты нужно разкомментировать нужные строки
  //$_Key2 = md5(md5($UId).$md5SecretKey.$md5Key0);  
  //if ($Key2 != $_Key2) return;  
  
  //$_Key3 = md5($UId.$UserName.$Mark.$SecretKey.$Key0); 
  //if ($_Key3 != $Key3) return;   	
  
  # файл с результатами
  if(isset($_FILES['file']['name']) && !empty($_FILES['file']['name'])){
    # проверка, что нет ошибок при загрузке
    if($_FILES['file']['error'] != UPLOAD_ERR_OK) return; 
  
    # проверка расширения файла результатов
    $upload_fn = explode(".", $_FILES['file']['name']);
    if(empty($upload_fn[1]) || ($upload_fn[1] != 'mtxpr')) return;   
    
    # загружаемый файл превысил допустимое значение ... байт
    if($_FILES['file']['size'] > 1000000) return;    

    # проверка что файл результатов начинается с MyTestXResult
    $handle = fopen($_FILES['file']['tmp_name'], "r");
    $contents = fread($handle, 13);
    fclose($handle);  
    if ($contents != 'MyTestXResult') return;
    
    # имя файла под которым сохраним результат
    $upload_file_name = time() . '_' . $_FILES['file']['name']; 
    $upload_file_name = str_replace('/', '', $upload_file_name);
    $upload_file_name = str_replace('\\', '', $upload_file_name);
    $upload_new_file_name = $upload_path_files . $upload_file_name;
  
    # добавляем файл в каталог (сохраняем файл с результатами)
    if(!move_uploaded_file($_FILES['file']['tmp_name'], $upload_new_file_name)) $upload_new_file_name = '';  
  } 
  //$_Key1 =  md5(md5_file($upload_new_file_name).$md5SecretKey.$md5Key0);
  //if ($Key1 != $_Key1) return;  
  
  # теперь сохраним данные в текстовый файл (или можно сделать сохранение в БД)
  
  # имя файла результатов запишем с путем от корня сайта
  $upload_new_file_name = str_replace($_SERVER['DOCUMENT_ROOT'], '', $upload_new_file_name);
  $upload_size = $_FILES['file']['size'];
  
  $str = $today . "\t" . $ip . "\t" . $UserName . "\t" . $UserGroup . "\t" . $Mark . "\t" . $Result . "\t" . $MaskOfResult . "\t" . $upload_new_file_name . "\t" . $upload_size . "\r\n";   
  # если файл должен быть в кодировке Windows-1251, то строки с iconv нужно убрать или закомментировать  
  //$str = iconv("UTF-8", "Windows-1251", $str);
  
  # пишем результаты в текстовый файл
  $fd = fopen($file_name, 'a') or die('error');
  flock($fd,2);
  
  fputs($fd,$str);

  flock($fd,3);
  fclose($fd);  
  
  # если все хорошо, отправим обратно ОК
  echo 'OK'; 
?>

Вот пример его работы:

Post web.png


Образец файлов можно скачать по ссылке http://yadi.sk/d/DVQTFO5UK3Si6 В архиве папка. Поместите эту папку в корень вашего сайта. Возможно потребуется для вложенной папки для результатов задать права на запись.

Пример страницы с результатами, полученными методом POST: http://mytest.klyaksa.net/E86D3AB5-2F02-4E8F-8F50-349656C9272E/ShowResult.php

Пример пользовательских скриптов, использующих базы данных, вы можете найти на форуме программы.