magnify
Home arrow Posts tagged "детский сад"
formats

Автоматическая проверка номера в очереди в МДОУ г. Петрозаводска.

Опубликовано: 19.09.2013 Автор: в ,

Наваял примитивный скрипт checkMDOU.php для автоматического отслеживания номера в МДОУ г. Петрозаводска, благо теперь есть доступ к электронной очереди (Система «Дошкольник»). Шлет электронное письмо, если номер изменился. Подразумевается все-таки, что номер в очереди только убывает…8) Выкладываю для общей пользы (не забудьте поменять LOGIN, PASSWORD, PATH, EMAIL):

/**
* Проверка авторизации на сайте
*/


function isAuth($data){
   return preg_match('/<a href="\/site\/logout"/Usi',$data);
}

/**
* Отсылка электронного письма
*/

function sendmail($email, $subject, $message) {
    // To send HTML mail, the Content-type header must be set
    $headers  = 'MIME-Version: 1.0'."\r\n";
    $headers .= 'Content-type: text/html; charset=UTF-8'."\r\n";
    // Additional headers
    $headers .= 'To: '.$email."\r\n";
    $headers .= 'From: '.$email."\r\n";

    mail($email, $subject, $message, $headers);
}

// Данные для авторизации на сайте
$ch = curl_init();
$url = 'https://mdou.petrozavodsk-mo.ru/site/login';

// !!!ВПИШИТЕ!!!
$login = 'LOGIN';
$password = 'PASSWORD';
$pathdb = 'PATH';

// email куда слать письмо
// !!!ИЗМЕНИТЕ!!!
$email = 'EMAIL';

// Тема письма
$subject = "ИЗМЕНЕНИЕ ОЧЕРЕДИ В МДОУ";

curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookie.txt'); // сохранять куки в файл
curl_setopt($ch, CURLOPT_COOKIEFILE,  dirname(__FILE__).'/cookie.txt');
curl_setopt($ch, CURLOPT_POST, 1); // использовать данные в post
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
    'LoginForm[username]'=>$login,
    'LoginForm[password]'=>$password,
    'x'=>10,
    'y'=>11
));

// Пытаемся авторизоваться
// Если успешно, то достаем номер в очереди посредством XPath
if (isAuth($data = curl_exec($ch))) {
    $document = new DOMDocument();
    @$document->loadHTML($data);
    $selector = new DOMXPath($document);
    $nodes = $selector->query('//div[@id="content"]/span[@class="num"]');
    if ($nodes->length !== 1) {
   $cur_num=-1;
    } else {
   $cur_num = $nodes->item(0)->nodeValue;
    }
    curl_close($ch);
} else {
    // В противном случае отсылаем почту о невозможности авторизации на сайте
    $message = '
    <html>
    <head><title>Невозможно проверить номер</title></head>
    <body>
    <p>Внимание! Невозможно проверить номер очереди в МДОУ г.Петрозаводска</p>
    <p><b>Проверьте сайт.</b></p>
    </body>
    </html>
    '
;

    $subject = "Невозможно проверить номер в МДОУ";
    sendmail($email, $subject, $message);
    curl_close($ch);
    exit;
}

// Проверяем наличие номера в локальной простенькой базейке
$db = new SQLite3($pathdb.'/mdou.db');

$id = $db->querySingle('SELECT id FROM queue WHERE number='.$cur_num);

// Если не нашли, то отсылаем сообщение об изменении номера в очереди
if (($id === NULL || $id === FALSE) && $cur_num !== -1) {
    $db->exec("INSERT INTO queue VALUES (null,".$cur_num.")");

    $message = '
    <html>
    <head><title>Изменение порядка очереди в МДОУ</title></head>
    <body>
    <p>Внимание! Изменился Ваш номер порядка в очереди в МДОУ г.Петрозаводска </p>
    <p>Новый номер: <b>'
.$cur_num.'</b></p>
    </body>
    </html>
    '
;

    sendmail($email, $subject, $message);

    $db->close();
    unset($db);
    // Пишем в лог про новый номер
    echo date(DATE_RFC2822).": Новый номер в очереди ($cur_num)\n";
} else {
    // Иначе пишем в лог, что изменений нет
    echo date(DATE_RFC2822).": Изменений нет ($cur_num)\n";
}

Cтавим расширение PHP для работы с SQLite и клиент:

apt-get install php5-sqlite sqlite3

Создаем базу:

$ sqlite3 mdou.db
sqlite> CREATE TABLE queue(id INTEGER PRIMARY KEY, number INTEGER);

Добавляем запуск скрипта в cron:

0 * * * * php /PATH/TO/SCRIPT/checkMDOU.php >>/PATH/TO/LOG/out.log 2>&1

Буду рад, если кому-то пригодится.

 
Просмотров: 747 | Комментариев нет  comments