[Сценарий] Парсер ЭлЖур ученика

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Ответить
Аватара пользователя
Djeday999
Сообщения: 45
Зарегистрирован: Сб май 29, 2021 3:04 pm
Откуда: Екатеринбург
Благодарил (а): 6 раз
Поблагодарили: 9 раз

[Сценарий] Парсер ЭлЖур ученика

Сообщение Djeday999 » Пт сен 23, 2022 2:25 pm

Получаем оценки, которые заработал наш ученик.

У ЭлЖура есть API. Решил сначала через ТП все пробить что да как, а они говорят: Вам надо идти в школу, просить чтоб директор написал нам официальный запрос на получение ключа разработчика, затем уж мы его выдадим и там пойдет работа. Но мы ж любим все упростить не вставая с дивана. Порывшись в инете нашел Телеграмм-бота, который разработали ребята и выложили код (правда в питоне) на гите https://github.com/samplec0de/eljur-bot, где и присутствовал наш необходимый ключик, да целых два даже. Наковырял необходимую документацию по API http://eljur.ru/api/.
Оказалось даже все проще, чем я думал. Посылаем запросик и в ответ получим необходимый токен для дальнейшей авторизации без логина и пароля. Вроде как токен дается на 3 месяца, но это не точно.
Получим токен:

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

$username = 'Логин';
$password = 'Пароль';
$devkey = '9235e26e80ac2c509c48fe62db23642c'; // ключ разработчика
$vendor = 'school'; // домен Вашей школы
$student = '9999'; // Идентификатор, который можно найти в ЛК, нажав на кнопку с вопросиком

echo '<!DOCTYPE html><html lang="ru"><head><meta charset="utf-8"/></head><body><br>';

// Авторизуемся
$header = [
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
    'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
    'Content-Type: application/json'
];

$post_data = [
    'devkey'      => $devkey,
    'vendor'      => $vendor,
    'login'       => $username,
    'password'    => $password,
    'out_format'  => 'json'
];

$post_data = json_encode($post_data);

$page = getData('https://$vendor.eljur.ru/api/auth', $header, $post_data);

$json = json_decode($page);

// Токен
if (empty($json->response->result->token)) {
    die('ОШИБКА: Не найден токен!');
}
$token = $json->response->result->token;

echo "<strong>Токен:</strong> $token<br><br>\r\n";

// Функция CURL-запроса
function getData($url, $header = false, $post_data = false)
{
    global $dir;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/elgur_cookie.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/elgur_cookie.txt');
    if ($header) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    }
    if ($post_data) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    }
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 300);
    curl_setopt(
        $ch,
        CURLOPT_USERAGENT,
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0'
    );
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    $ret = curl_exec($ch);
    usleep(300000);
    
    return $ret;
}
Ну и останется получать сами оценки.
Накидал быстро код корявый (прошу не бить сильно), но рабочий и закинул в сценарий. Вот бы кто взялся бы сделал качественный модуль...

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

$days1 = gg('ThisComputer.DateNow'); // День сегодня
$days2 = implode('.', array_reverse(explode('.', $days1))); // Переворачиваем день месяц год наоборот до 23.09.2022
$days = str_replace('.','',$days2); // убрали точку из даты
$students = '9999';
$devkey = '9235e26e80ac2c509c48fe62db23642c';
$vendor = 'school';
$token = 'e58efc7f70d873fvbjrgo5lu9gh3gd98y93gpxl03r4liy7igf3p306579a690bc___26385';
$name = gg('Nastya.fullName'); // Имя мученика

$getg = file_get_contents("https://$vendor.eljur.ru/api/getassessments?auth_token=$token&devkey=$devkey&vendor=$vendor&student=$students&days=$days"); //получаем данные методом get
$arr = json_decode($getg, true); //декодируем

//Собираем показания с json файла. Уроков вроде больше семи не бывает и создал 7 позиций. Некоторые комментарии к оценкам отмечены как lesson_comment, другие как comment и из-за этого пришлось делать две позиции
$ocenka1 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["1"]["assessments"]["0"]["value"]; 
$comment1 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["1"]["assessments"]["0"]["lesson_comment"];
$lcomment1 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["1"]["assessments"]["0"]["comment"];
$name1 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["1"]["name"];

$ocenka2 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["2"]["assessments"]["0"]["value"]; 
$comment2 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["2"]["assessments"]["0"]["lesson_comment"];
$lcomment2 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["1"]["assessments"]["0"]["comment"];
$name2 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["2"]["name"]; 

$ocenka3 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["3"]["assessments"]["0"]["value"]; 
$comment3 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["3"]["assessments"]["0"]["lesson_comment"];
$lcomment3 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["1"]["assessments"]["0"]["comment"];
$name3 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["3"]["name"]; 

$ocenka4 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["4"]["assessments"]["0"]["value"]; 
$comment4 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["4"]["assessments"]["0"]["lesson_comment"];
$lcomment4 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["1"]["assessments"]["0"]["comment"];
$name4 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["4"]["name"]; 

$ocenka5 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["5"]["assessments"]["0"]["value"]; 
$comment5 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["5"]["assessments"]["0"]["lesson_comment"];
$lcomment5 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["1"]["assessments"]["0"]["comment"];
$name5 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["5"]["name"]; 

$ocenka6 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["6"]["assessments"]["0"]["value"]; 
$comment6 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["6"]["assessments"]["0"]["lesson_comment"];
$lcomment6 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["1"]["assessments"]["0"]["comment"];
$name6 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["6"]["name"]; 

$ocenka7 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["7"]["assessments"]["0"]["value"]; 
$comment7 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["7"]["assessments"]["0"]["lesson_comment"];
$lcomment7 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["1"]["assessments"]["0"]["comment"];
$name7 = $arr["response"]["result"]["students"]["$students"]["days"]["$days"]["items"]["7"]["name"]; 

//Если стоит "н", то значит урок пропущен
if ($ocenka1 == 'н') {
    $ocenka1 = 'пропустила урок';
}

if ($ocenka2 == 'н') {
    $ocenka2 = 'пропустила урок';
}

if ($ocenka3 == 'н') {
    $ocenka3 = 'пропустила урок';
}

if ($ocenka4 == 'н') {
    $ocenka4 = 'пропустила урок';
}

if ($ocenka5 == 'н') {
    $ocenka5 = 'пропустила урок';
}

if ($ocenka6 == 'н') {
    $ocenka6 = 'пропустила урок';
}

if ($ocenka7 == 'н') {
    $ocenka7 = 'пропустила урок';
}

//Если оценок нет, то скажем, что оценок не было
if (($name1 == '') && ($ocenka1 == '') && ($comment1 == '') && ($lcomment1 == '') && ($name2 == '') && ($ocenka2 == '') && ($comment2 == '') && ($lcomment2 == '') && ($name3 == '') && ($ocenka3 == '') && ($comment3 == '') && ($lcomment3 == '') && ($name4 == '') && ($ocenka4 == '') && ($comment4 == '') && ($lcomment4 == '') && ($name5 == '') && ($ocenka5 == '') && ($comment5 == '') && ($lcomment5 == '') && ($name6 == '') && ($ocenka6 == '') && ($comment6 == '') && ($lcomment6 == '') && ($name7 == '') && ($ocenka7 == '') && ($comment7 == '') && ($lcomment7 == '')) {
    $vstup = ''.$name.' сегодня оценок не получала';
}
else {
    $vstup = 'Сегодня '.$name.' в школе получила следующие оценки:';
}

//Соберем say
        $bodytext=$vstup;
        $bodytext.=$name1."  ";
        $bodytext.=$ocenka1."  ";
        $bodytext.=$comment1."  ";
        $bodytext.=$lcomment1."  ";
        $bodytext.=$name2."  ";
        $bodytext.=$ocenka2."  ";
        $bodytext.=$comment2."  ";
        $bodytext.=$lcomment2."  ";
        $bodytext.=$name3."  ";
        $bodytext.=$ocenka3."  ";
        $bodytext.=$comment3."  ";
        $bodytext.=$lcomment3."  ";
        $bodytext.=$name4."  ";
        $bodytext.=$ocenka4."  ";
        $bodytext.=$comment4."  ";
        $bodytext.=$lcomment4."  ";
        $bodytext.=$name5."  ";
        $bodytext.=$ocenka5."  ";
        $bodytext.=$comment5."  ";
        $bodytext.=$lcomment5."  ";
        $bodytext.=$name6."  ";
        $bodytext.=$ocenka6."  ";
        $bodytext.=$comment6."  ";
        $bodytext.=$lcomment6."  ";
        $bodytext.=$name7."  ";
        $bodytext.=$ocenka7."  ";
        $bodytext.=$comment7."  ";
        $bodytext.=$lcomment7."  ";
        say($bodytext,6);   


echo "<strong>$bodytext</strong><br><br>\r\n";
Ясен пень, что код получился большой. Можно в нем все заменить и упростить (уменьшить), но он рабочий.
Домашнее задание на любой день тоже можно получать, но это в будущем. Чуток попозже.
Всем пятак!
За это сообщение автора Djeday999 поблагодарили (всего 2):
Sergey.Chek (Пт сен 23, 2022 2:30 pm) • xor (Пт сен 23, 2022 11:50 pm)
Рейтинг: 2.33%
Аватара пользователя
Djeday999
Сообщения: 45
Зарегистрирован: Сб май 29, 2021 3:04 pm
Откуда: Екатеринбург
Благодарил (а): 6 раз
Поблагодарили: 9 раз

Re: [Сценарий] Парсер ЭлЖур ученика

Сообщение Djeday999 » Чт июл 20, 2023 6:55 am

Благодаря неравнодушным людям допилили код. У меня получилось 4 цикла, но требуют избавляться от большого количества (как я пока не знаю). Добавил гендер.

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


$days = date('Ymd');
$students = '9999';
$devkey = '9235e26e80ac2c509c48fe62db23642c';
$vendor = 'school';
$token = 'e58efc7f70d873fvbjr5lu9gh3gd98y93gpxl03r4liy7igf3p30657990bc___26385';
$name = gg('User.fullName'); // Имя мученика
$gender=gg('User.gender');
$ending1=($gender<>'ж') ? '' : 'а';

$json = file_get_contents("https://$vendor.eljur.ru/api/getassessments?auth_token=$token&devkey=$devkey&vendor=$vendor&student=$students&days=$days"); //получаем данные методом get


$data = json_decode($json, true);
foreach ($data['response']['result']['students'] as $student) {
    if (!isset($student['days']) || empty($student['days'])) {
        $res = ''.$name.' сегодня оценок не получал$ending1';
        echo $res;
        continue;
    }
    foreach ($student['days'] as $day) {    
        $res = "Сегодня $name получил$ending1 оценки: ";
        foreach ($day['items'] as $item) {

            foreach ($item['assessments'] as $assessment) {
            
            // Заменим названия предметов для удобочитаемости
                    if ($item['name'] == "Литературное чтение") {
                        $item['name'] = "Литература";
                    }
                    if ($item['name'] == "Русский язык ") {
                        $item['name'] = "Русский";
                    }
// Если стоит "н" за урок - значит урок пропущен (прогул)
                    if ($assessment['value'] == "н") {
                        $assessment['value'] = "Пропустил$ending1 урок";
                    }
            
                $res .=  "{$item['name']}: {$assessment['value']}  {$assessment['lesson_comment']} ";
            }
        }
    }

    echo $res;
}

fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: [Сценарий] Парсер ЭлЖур ученика

Сообщение fandaymon » Чт июл 20, 2023 8:36 pm

Djeday999 писал(а):
Чт июл 20, 2023 6:55 am
Благодаря неравнодушным людям допилили код. У меня получилось 4 цикла, но требуют избавляться от большого количества (как я пока не знаю). Добавил гендер.

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


$days = date('Ymd');
$students = '9999';
$devkey = '9235e26e80ac2c509c48fe62db23642c';
$vendor = 'school';
$token = 'e58efc7f70d873fvbjr5lu9gh3gd98y93gpxl03r4liy7igf3p30657990bc___26385';
$name = gg('User.fullName'); // Имя мученика
$gender=gg('User.gender');
$ending1=($gender<>'ж') ? '' : 'а';

$json = file_get_contents("https://$vendor.eljur.ru/api/getassessments?auth_token=$token&devkey=$devkey&vendor=$vendor&student=$students&days=$days"); //получаем данные методом get


$data = json_decode($json, true);
foreach ($data['response']['result']['students'] as $student) {
    if (!isset($student['days']) || empty($student['days'])) {
        $res = ''.$name.' сегодня оценок не получал$ending1';
        echo $res;
        continue;
    }
    foreach ($student['days'] as $day) {    
        $res = "Сегодня $name получил$ending1 оценки: ";
        foreach ($day['items'] as $item) {

            foreach ($item['assessments'] as $assessment) {
            
            // Заменим названия предметов для удобочитаемости
                    if ($item['name'] == "Литературное чтение") {
                        $item['name'] = "Литература";
                    }
                    if ($item['name'] == "Русский язык ") {
                        $item['name'] = "Русский";
                    }
// Если стоит "н" за урок - значит урок пропущен (прогул)
                    if ($assessment['value'] == "н") {
                        $assessment['value'] = "Пропустил$ending1 урок";
                    }
            
                $res .=  "{$item['name']}: {$assessment['value']}  {$assessment['lesson_comment']} ";
            }
        }
    }

    echo $res;
}


Если студент один и день один, то можно же просто $student = $data['response']['result']['students'][0]; без циклов и аналогично с днём
Ответить