Наваял примитивный скрипт 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 и клиент:
Создаем базу:
sqlite> CREATE TABLE queue(id INTEGER PRIMARY KEY, number INTEGER);
Добавляем запуск скрипта в cron:
Буду рад, если кому-то пригодится.