CoderCastrov logo
CoderCastrov
Питон

Парсинг приложений и автоматическая отправка данных по почте: путешествие изучения Python

Парсинг приложений и автоматическая отправка данных по почте: путешествие изучения Python
просмотров
6 мин чтение
#Питон

Как приложение 'Ommetje' научило меня автоматизировать определенные задачи

Представьте, что вы хотите начать 2022 год с отличного старта, поэтому решаете точно придерживаться своих здоровых намерений в этом году. Вы устанавливаете трекер активности на свой телефон, и каждую неделю вы хотите получать обновление на почту с обзором прогресса, который вы сделали. Или представьте другую ситуацию, когда в вашей стране есть удивительный профессор нейропсихологии, который разработал приложение, стимулирующее людей ходить чаще, и вы хотите отслеживать свою активность при ходьбе. Это может показаться искусственно созданной ситуацией, но в Нидерландах у нас действительно есть такой профессор по имени Эрик Шердер, и он определенно заслуживает поиска в Google! Он замечательно работает, вдохновляя людей вести более активный образ жизни, и вместе с Голландским мозговым фондом он разработал приложение 'Ommetje'. Используя это приложение, люди могут набирать очки за прогулку продолжительностью не менее 20 минут (называемую омметье на голландском) и соревноваться друг с другом в разных командах. Вместе с коллегами мы участвуем в таком соревновании на работе, где наш капитан команды должен еженедельно сообщать наши результаты организации. Извлечение результатов, их суммирование для получения общего результата команды, отправка информации по электронной почте... разные части, которые возможно можно объединить в автоматизированный процесс! Итак, именно здесь началось мое путешествие изучения. Давайте исследуем!


Хорошо, сначала небольшое предупреждение: перед тем, как я начал этот проект, у меня не было опыта автоматизации задач с использованием Python или любого другого языка программирования. Поэтому не ожидайте высокоуровневого экспертного пошагового руководства! Но в любом случае, я надеюсь предоставить вам некоторые полезные советы и хитрости, рассказав о своем путешествии изучения. Что я считал очень полезным, так это сначала сформулировать проблему и разделить ее на подпроблемы:

В следующих разделах мы будем исследовать эти шаги по очереди.

1. Извлечение результатов из приложения Ommetjes

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

Для нашего проекта нас особенно интересуют никнейм и соответствующий счет XP, которые мы хотим извлечь из приложения. Для этого нам необходимо перехватить трафик данных между нашим приложением и Интернетом, для чего отлично подходит инструмент mitmproxy. Gaurav Sharma написал потрясающий учебник (для Android и iOS) о том, как это сделать, но я кратко опишу здесь шаги для пользователей Apple:

О, да, мы теперь почти готовы перехватывать нужные нам данные! Да, почти... Но подождите, потому что нам нужно выполнить еще несколько небольших шагов! Мы вводим mitmproxy в терминале и открываем приложение на нашем телефоне. Если все прошло хорошо на предыдущих шагах, то мы сейчас увидим весь трафик, который перехватывает прокси:

Последняя строка (GET https://ommetje.nu/api/users/highscore) - это то, куда мы хотим попасть, потому что именно там хранятся наши данные. Теперь просто нажмите на нее и под Response мы увидим никнеймы и счета, именно то, что мы ищем!

Чтобы преобразовать информацию в формат, с которым может работать Python, мы преобразуем ее в запрос Python:

Все шаги успешно выполнены? Отличная работа! Большая часть работы уже выполнена, и мы готовы приступить к самым интересным вещам, так что держитесь!^^

Хорошо, давайте начнем этот раздел с хороших новостей: самая утомительная часть процесса уже была выполнена, поэтому мы можем перейти к фактическому программированию на Python. Первое, что мы хотим сделать, это импортировать необходимые библиотеки, извлечь текст из объекта запроса, преобразовать его в объект BeautifulSoup() и загрузить данные в формате json. Есть и другие возможные форматы, но я нашел этот самым простым для работы, учитывая его структуру, похожую на словарь. Вот соответствующий код на Python:

import json
from bs4 import BeautifulSoup

# Извлечение текста из объекта запроса
text = request.text

# Преобразование текста в объект BeautifulSoup
soup = BeautifulSoup(text, 'html.parser')

# Загрузка данных в формате json
data = json.loads(soup.text)

Теперь, когда у нас есть данные в формате json, мы сначала определяем количество участников, затем создаем списки, в которых хранятся никнеймы и баллы XP, и, наконец, форматируем все это в красивую таблицу. Завершаем мы вычислением общего счета команды.

Единственное, что остается, это создать текстовое сообщение, которое мы можем отправить по электронной почте. Есть несколько способов сделать это - мой, вероятно, не самый эстетически приятный, но когда вы используете HTML, убедитесь, что конечное сообщение начинается с <body> и заканчивается </body>. Вы также можете использовать <br>, чтобы перейти на новую строку.

И фактически, это все, что нужно для шага 2 нашего процесса автоматизации!

3. Отправка текстового сообщения по почте

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

Теперь ты можешь выпить свой кофе. ☕️

4. Запланировать процесс

Хорошо, если ты добрался до этой последней части, то ты определенно заслужил этот кофе, поэтому надеюсь, что он был вкусным! Он даже может оказаться очень полезным, потому что нам действительно понадобится заряд кофеина, чтобы пройти через последнюю часть этого руководства: фактический шаг автоматизации. Это не должно быть слишком сложно при использовании crontab, но у меня возникли некоторые проблемы с безопасностью, поэтому я решил выбрать альтернативный путь. Так что ты можешь либо остановиться здесь и следовать, например, этому руководству от Gavin Wiener, либо продолжить чтение для краткого изложения реализации Yaniss Illoul. Выбор за тобой, но может быть интересно знать, что - хотя я опишу шаги для пользователей Mac - последний также подходит для пользователей Windows. С этим сказанным, давай посмотрим, как мы можем добиться выполнения задачи по расписанию. Первый шаг - преобразовать наш скрипт Python в исполняемый файл (.exe), что можно сделать довольно легко с помощью нескольких строк кода в терминале:

#!/bin/sh
Python [вставь путь к файлу Python]

Вот как это должно выглядеть:

  1. Когда ты сохранил файл и вернулся в терминал, просто введи chmod 755 [вставь путь к только что созданному файлу] и нажми [Enter].

Теперь у нас есть исполняемый файл, но, к сожалению, требуется еще несколько дополнительных шагов, прежде чем мы сможем его выполнить по расписанию. Основная задача здесь - преобразовать наш .exe в приложение, для чего мы используем Automator:

  1. Сохраните файл ([Cmd] + [s]) и ваше приложение создано! Теперь, когда у нас есть приложение, остается только запустить его по расписанию, для чего мы можем использовать приложение Календарь. Итак, открой приложение Календарь на своем Mac и создай новый элемент iCloud-календаря (для ясности может быть полезно создать отдельный календарь. Перейди в Файл → Новый календарь → [вставь название календаря])

  2. Установите дату и время, когда вы хотите выполнить файл, и повторите элемент календаря с желаемой частотой. Например, я хотел отправлять электронное письмо каждую пятницу в 15:00 в течение двух месяцев. Здесь ничего особенного, но фишка в установке оповещения: **Оповещение → Пользовательское → Открыть файл → **[выберите созданное приложение]. Результат:

Вот и все! Твой Mac теперь будет выполнять скрипт Python в заданную дату и время по выбранному расписанию! Я понимаю, что в полном процессе было довольно много шагов, но я надеюсь, что некоторый из моих опытов - которые я нашел очень познавательными - могут оказаться полезными и для тебя. Возможно, это даже поможет тебе придерживаться твоих здоровых намерений на 2022 год, что было бы приятным бонусом, но если это не произойдет, не вини себя, потому что менее 10% людей удается привыкнуть к своим новым привычкам. Счастливого 2022 года!


Ресурсы:

[1] https://medium.com/testvagrant/intercept-ios-android-network-calls-using-mitmproxy-4d3c94831f62[2] https://www.youtube.com/watch?v=LbPKgknr8m8[3] https://martechwithme.com/convert-python-script-app-windows-mac/#formac[4] https://martechwithme.com/schedule-python-scripts-windows-mac/#formac