Как автоматически получить доступ к содержимому защищенного паролем сайта с использованием кода из текстового сообщения?

Как можно автоматизировать процесс ввода кода из смс при авторизации на сайте https://www.tinkoff.ru/bonuses/ и сохранить куки для дальнейших действий в Python? Проблема заключается в том, что предыдущий способ с сохранением куки и их подгрузкой не срабатывает из-за сброса сессии Тинькофф каждые 12 часов.
  • 31 января 2024 г. 9:19
Ответы на вопрос 2
Автоматизация процесса авторизации на сайтах с двухфакторной аутентификацией, где код подтверждения приходит через SMS, представляет собой серьёзную проблему в контексте безопасности, и многие веб-сервисы противодействуют таким попыткам.

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

1. Автоматизировать процесс ввода логина и пароля.
2. Ожидать SMS с кодом подтверждения.
3. Ввести код подтверждения в форму на сайте.
4. Сохранить cookies для будущих сессий.

Для первых двух шагов можно использовать комбинацию API провайдера SMS и Webdriver/Selenium для автоматизации веб-действий. Для сохранения куки можно использовать стандартные средства Selenium.

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

Ниже приведён общий пример скрипта на Python, который вы могут использовать как отправную точку:

```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# Запуск браузера
driver = webdriver.Chrome()
driver.get('https://www.tinkoff.ru/bonuses/')

# Ввод логина и пароля (замените на ваши данные)
login_field = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="login"]'))
)
login_field.send_keys('YOUR_LOGIN')
password_field = driver.find_element_by_xpath('//*[@id="password"]')
password_field.send_keys('YOUR_PASSWORD')

# Отправить данные формы
login_button = driver.find_element_by_xpath('//*[@id="submitButton"]')
login_button.click()

# Теперь происходит ожидание SMS и получение кода через API сервиса SMS

# Например, просто ждем некоторое время (не реальное использование)
time.sleep(30)  # Время ожидания SMS

# Тут должен быть код для получения SMS через API
sms_code = '123456'  # Предположим, мы получили код

# Ввод полученного кода на странице
sms_input_field = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, '//*[@id="smsCode"]'))
)
sms_input_field.send_keys(sms_code)

# Подтверждение SMS кода
confirm_button = driver.find_element_by_xpath('//*[@id="confirmButton"]')
confirm_button.click()

# Сохранение cookies для последующего использования
cookies = driver.get_cookies()
# Сохранить cookies в файл или БД ...

# Закрываем браузер
driver.quit()

# Теперь вы можете использовать сохраненные cookies для установления сессии в будущем
```

Перед использованием кода вы должны заменить XPATH адреса элементов на актуальные, которые соответствуют формам ввода на странице сайта.

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

Желательно - это "не обязательно".
Тинькофф сбрасывает любые сессии каждые 12 часов

Вполне ожидаемо для сервиса, работающего с деньгами.
Проблемы возникают на моменте ввода кода из смс, как его можно перенаправить серверу?

- Получать смс на временный номер, используя специализированные сервисы с api.
- Поставить на телефон приложение, которое будет перехватывать определенные смс и слать их указанным образом по указанному адресу, например SMS forwarder или SMS Backup & Restore .
- Написать свое приложение (если не доверяете чужим), которое сделает все тоже самое, что пункт выше, но здесь будет использоваться не python, а kordova/react-native/flutter/kotlin.
Похожие вопросы