Передача показаний по счётчикам

Объявления о поиске исполнителя для оказание услуг и/или создания продукта

Модератор: immortal

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

Передача показаний по счётчикам

Сообщение Djeday999 » Сб мар 19, 2022 6:32 pm

Здравствуйте!
На github Интеграция ЭнергосбыТ.Плюс для Home Assistant нашел возможность реализации получения данных об оплате по счетчикам ЖКХ и передачи показаний для оплаты. Кто сможет создать такое же в MajorDoMo?
Я пока с энергсбытом дошел по передаче показаний до такого запроса: https://lkk-ekb.esplus.ru/handlers/api/ ... 7601464839, где Y - номер лицевого счета, Х - не понял пока, Z - номер ПУ, далее новые показания, а вот в самом конце параметр sign, который меняется при изменении передаваемых показаний методом MD5 скорее всего, но не могу расшифровать из каких данных его формируют. Предполагаю только, что возможно пользуются https://github.com/blueimp/jQuery-MD5, т. к. находил это в исходнике.
Изображение
Сейчас сам пока реализовал только сбор о задолженности, показаниях по счетчикам через GET запрос в ЛК https://frisbi24.ru. У них есть API, но нет документации. Пришлось через Postman найти запрос вида https://frisbi24.ru/api/account/YYYYYYYYYY/ХХХХ, где Y - номер лицевого счета услуги (электроэнергия, мусор, газ,...) и Х - это код, присвоенный определенной услуге (к примеру 1034 - это энергосбыт).
Думаю через полуразобранный API frisbi24 будет проще передавать показания счетчиков.
Пожалуйста помогите. Корыстность приветствуется, т. к. будет затрачено Ваше время.
Аватара пользователя
Djeday999
Сообщения: 45
Зарегистрирован: Сб май 29, 2021 3:04 pm
Откуда: Екатеринбург
Благодарил (а): 6 раз
Поблагодарили: 9 раз

Re: Передача показаний по счётчикам

Сообщение Djeday999 » Сб апр 16, 2022 7:30 pm

Ну что ж. Раз тут никто не откликнулся пришлось на другом ресурсе просить. Создали мне парсинг с ЛК Энергосбыт. Сейчас получаю все необходимую инфу: задолженность, переданные последние показания, последняя оплата и возможность передачи показаний. Выкладываю код. Может кому пригодится.

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

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

// Авторизуемся
$header = [
    'Accept: application/json',
    'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
    'Authorization: null null',
    'Content-Type: application/json;charset=utf-8',
    'Referer: https://lkm.esplus.ru/auth/'
];

$post_data = [
    'login'       => $username,
    'password'    => $password,
    'branch_code' => $locat,
    'device_type' => $web,
    'login_type'  => $login
];

$post_data = json_encode($post_data);

$page = getData('https://lkm.esplus.ru/api/v1/auth/login', $header, $post_data);

$json = json_decode($page);

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

// ЛК
$header = [
    'Accept: application/json',
    'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
    'Authorization: Bearer ' . $es_token,
    'Referer: https://lkm.esplus.ru/'
];

$page = getData('https://lkm.esplus.ru/api/v1/object/list', $header);

$json = json_decode($page);

// Баланс
if (!isset($json->content->objects[0]->accounts[0]->balance)) {
    die('ОШИБКА: Не найдены данные ЛК!');
}
$es_balance = $json->content->objects[0]->accounts[0]->balance;

$es_account_id = $json->content->objects[0]->accounts[0]->id;

$from = date('m.Y', strtotime('-6 month'));
$to = date('m.Y');

echo "<strong>Баланс:</strong> $es_balance<br><br>\r\n";

// История платежей
echo "<strong>История платежей</strong><br>\r\n";

$page = getData(
    "https://lkm.esplus.ru/api/v1/statistics/payments?account_id=$es_account_id&period_from=$from&period_to=$to&limit=5&offset=0&branch_code=ekb&user_type=individual",
    $header
);

$json = json_decode($page);

if (!isset($json->content->payments)) {
    die('ОШИБКА: Не найдена история платежей!');
}

$table = '<table>';
foreach ($json->content->payments as $payment) {
    if (empty($data_pay)) {
        $last_pay = $payment->amount;
    }
    $table .= '<tr><td>' . $payment->created_at . '</td><td>' . ($payment->accepted === true ? 'Принят' : 'Не принят') . '</td><td>' . $payment->amount . '</td></tr>';
}
$table .= '</table><br>';

echo $table;

// История показаний
echo "<strong>История показаний</strong><br>\r\n";

$page = getData(
    "https://lkm.esplus.ru/api/v1/statistics/meters?account_id=$es_account_id&period_from=$from&period_to=$to&limit=5&offset=0",
    $header
);

$json = json_decode($page);

if (!isset($json->content->services)) {
    die('ОШИБКА: Не найдена история показаний!');
}

$es_t1 = $es_t2 = '';
$table = '<table>';
foreach ($json->content->services as $data) {
    if (empty($es_t1)) {
        $es_t1 = $data->data->t1;
        $es_t2 = $data->data->t2;
    }
    $table .= '<tr><td>' . $data->date . '</td><td>День (Т1): ' . $data->data->t1 . '<br>Ночь (T2): ' . $data->data->t2 . '</td></tr>';
}
$table .= '</table><br>';

echo $table;

echo '</body></html>';

// Функция 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);
    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:97.0) Gecko/20100101 Firefox/97.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;
}
Сейчас работа ведется по личным кабинетам: Мотив, МегаФон (сотовая связь), Газэкс.
За это сообщение автора Djeday999 поблагодарили (всего 2):
xor (Вт апр 19, 2022 2:25 am) • Sergey.Chek (Вт авг 23, 2022 10:50 am)
Рейтинг: 2.33%
Ответить