CoderCastrov logo
CoderCastrov
Питон

Автоматизация скучных задач с помощью Python - Автоматическое сканирование присутствия

Автоматизация скучных задач с помощью Python - Автоматическое сканирование присутствия
просмотров
6 мин чтение
#Питон

В этой серии "Автоматизация скучных задач с помощью Python" я хотел бы сосредоточиться на проблеме присутствия, которую, возможно, также испытывают сотрудники в общем случае.

Введение

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

Нарушение присутствия (например, опоздание или ранний уход) приводит к удержанию зарплаты. Конечно, я возражаю против этого, особенно учитывая, что я все еще являюсь стажером :’)

Часто во время рабочего дня я забываю, отметился ли я или нет. Это сомнение становится все более неудобным со временем.

К счастью, в моем рабочем месте есть веб-мониторинг, где я могу просматривать сводку своего присутствия за текущий месяц, чтобы узнать данные о присутствии в определенную дату. Я считаю, что этот сервис веб-мониторинга более чем достаточен, учитывая его ясный интерфейс и процесс.

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

Поскольку данные о присутствии представлены в виде ежемесячного отчета, мне трудно (читай: лень) сканировать каждую запись вручную, чтобы получить данные о присутствии на нужную дату.

К счастью, имея небольшой опыт в программировании, я хочу попробовать автоматизировать это сканирование присутствия с помощью Python! :)

Пример случая

Ниже приведен ход действий, если Автор хочет собрать данные о посещаемости.

Во-первых, Автор открывает веб-мониторинг, скажем, адрес http://10.10.10.10. Автору будет предоставлена форма для входа, как показано ниже:

Gambar 1: Форма для входа в систему мониторинга посещаемости

Во-вторых, после успешного входа Автор может перейти на вкладку "Посещаемость" и увидеть сводку своей посещаемости за последний месяц, как показано ниже:

Gambar 2: Страница с обзором посещаемости за месяц. В данных указано, что 16 апреля 2018 года Автор зарегистрировал посещение в 07:09 по местному времени и еще не зарегистрировал уход.

Можно заметить, что для получения данных о посещаемости за сегодня Автор должен знать текущую дату и просканировать данные по одному, начиная сверху и двигаясь вниз, пока не найдет нужную информацию. Автор хочет подчеркнуть, что, конечно же, система мониторинга не содержит ошибок, так как она была создана для сбора данных о посещаемости за месяц. Просто лень Автора заставляет его хотеть получить данные о посещаемости только за сегодняшний день как можно быстрее и проще :)

Планирование

Задолго до начала кодирования, автор всегда учатся следить за техническим процессом.

Используя инструменты разработчика в Google Chrome, автор пытается собрать различную важную информацию, необходимую для автоматизации этого процесса.


Во-первых, при входе в систему, автор получает следующую информацию:

Затем мы узнаем, что для выполнения процесса входа в систему необходимо отправить POST запрос по адресу 10.10.10.10/index.php/login с данными о нашем имени пользователя и пароле. Если вход выполнен успешно (это можно увидеть по коду состояния 200 или в данном случае 302), мы получим файл cookie (PHPSESSID). Эти файлы cookie являются важными данными, так как они понадобятся для доступа к данным о присутствии.


Во-вторых, при переходе на вкладку "Присутствие", мы получаем следующий результат:

Рисунок 4: Журнал сетевой активности процесса получения данных о присутствии

Затем мы узнаем, что для просмотра данных о присутствии необходимо отправить GET запрос по адресу 10.10.10.10/index.php/absensi/lihat_absensi_user с включенным файлом cookie (PHPSESSID), который мы получили при входе в систему, в заголовке. Если запрос выполнен успешно (это можно увидеть по коду состояния 200), мы получим HTML-код, формирующий страницу с данными о присутствии (см. Рисунок 2).


В-третьих, то же самое происходит при выходе из системы:

Рисунок 5: Журнал сетевой активности процесса выхода из системы

Для выхода из системы необходимо отправить GET запрос по адресу 10.10.10.10/index.php/logout с включенным файлом cookie (PHPSESSID), который мы получили при входе в систему. Если запрос выполнен успешно (код состояния 200 или в данном случае 302), мы получим HTML-код, формирующий страницу входа в систему снова (см. Рисунок 1).


Моделирование

До этого мы узнали, какую информацию нужно иметь, чтобы воспроизвести процесс мониторинга присутствия. Затем автор использовал Postman, чтобы повторить эти три запроса, чтобы было легче использовать их в качестве справочного руководства при написании кода.

Вот краткий результат повторения с помощью Postman:

Gambar 6: POST request ke**10.10.10.10/index.php/login **dan mendapatkan Cookies berupa PHPSESSID Gambar 7: GET request ke**10.10.10.10/index.php/absensi/lihat_absensi_user **dengan menyertakan Cookies yang didapatkan saat login Gambar 8: GET request ke**10.10.10.10/index.php/logout **dengan menyertakan Cookies yang didapatkan saat login

Используя эти три запроса, которые мы создали с помощью Postman, на самом деле мы смогли избавиться от нескольких скучных шагов (открытие страницы входа, ввод имени пользователя/пароля, нажатие кнопки входа, нажатие кнопки "Вкладка Присутствие" и выход) и свести их к трем очень простым "кликам". :)


Следующая проблема возникает, когда автор понимает, что полученная нами сводка данных на самом деле имеет формат HTML, что делает чтение еще более утомительным. Кроме того, изначальная проблема заключается в том, что полученные данные - это сводка за весь месяц, хотя автор хочет получить только сводку за сегодня.

Вывод, который можно сделать из вышеуказанной проблемы, состоит в том, что автору необходимо использовать модуль для парсинга, чтобы извлечь важную информацию из данных в формате HTML.


Нет дополнительной информации, которую автор может изучить дальше. Теперь пришло время для самого интересного дела :)

Нгодинг

Некоторые используемые технологии:

Автор начинает с копирования различной информации, которая была собрана с помощью Postman, в файл конфигурации на языке Python, скажем, Config.py.

Затем автор создает класс с названием Scrapper.

Этот класс является основным классом для выполнения этого процесса, с функцией для отправки запроса на сервер и передачи ответа сервера в виде HTML в подкласс, который специализируется на парсинге HTML. Пока что этот подкласс автор называет MonthlyData.

Затем автор создает отдельный файл для вызова основного кода выше.

Проверка

Проведено тестирование, запустив этот скрипт во встроенной консоли PyCharm. Получены следующие результаты:

Gambar 9: Contoh keluaran apabila Penulis belum absen pagi Gambar 10: Contoh keluaran apabila Penulis sudah absen pagi

Завершение

Чтобы сделать это еще круче, Автор создал ярлык на рабочем столе для запуска этого скрипта:

Gambar 11: Dibuat shortcut untuk menjalankan CekAbsen.py

Если вы нажмете на него, появится следующее:

Gambar 12: Keluaran console

К сожалению, встроенная консоль Windows не поддерживает печать цветных слов, поэтому отображается только белый цвет. Но это не имеет значения, потому что суть программы уже выполнена.

Ура! Мы смогли сократить серию скучных действий, которые нужно сделать, чтобы увидеть отчет об отсутствии сегодняшнего дня (открыть страницу входа, ввести имя пользователя/пароль, нажать кнопку входа, нажать кнопку "Вкладка Абсенси", сканировать данные об отсутствии, сделать вывод, были ли мы отсутствующими или нет, выйти из системы) до 2-х простых нажатий ярлыка!

Теперь, каждый раз, когда Автор проверяет отсутствие с помощью этого скрипта, он фактически сокращает время примерно на 1-2 минуты. Это драгоценное время можно потратить на чашку горячего чая :)

Заключение

Это первая статья автора на Medium. Конечно, автор понимает, что в ней много недостатков в языке, программировании и других аспектах. Автор открыт для критики и предложений от читателей.

Автор обещает поделиться другими своими опытами.

Спасибо и надеюсь, что это будет полезно.