Как работать с Google Authenticator с помощью Selenium - PullRequest
1 голос
/ 26 апреля 2019

Мне нужно загрузить огромное количество файлов Excel (по оценкам: 500–1000) с продавцаcentral.amazon.de. Загрузка вручную невозможна, поскольку для каждой загрузки требуется несколько щелчков мышью, пока не появится всплывающее окно.

Поскольку amazon не может предоставить мне простой xml со своей структурой, я решил автоматизировать это самостоятельно. Первым, что пришло на ум, были Selenium и Firefox.

Проблема:

Требуется вход в систему продавца central, а также двухфакторная аутентификация (2FA). Поэтому, если я войду один раз, я смогу открыть другую вкладку, войти в sellercentral.amazon.de и сразу же войти в систему. Я даже могу открыть другой экземпляр браузера и сразу войти в систему. Они могут использовать сессионные куки. Целевой URL для "scrape": https://sellercentral.amazon.de/listing/download?ref=ag_dnldinv_apvu_newapvu.

Но когда я открываю URL из моего python-скрипта с помощью selenium webdrive, запускается новый экземпляр браузера, в который я не захожу. Хотя есть экземпляры firefox, запущенные одновременно, в который я вошел в систему. Так что я думаю, что экземпляры, запущенные селеном, несколько отличаются.

Что я пробовал:

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

from selenium import webdriver
import time


browser = webdriver.Firefox()

# Wait for website to fire onload event
browser.get("https://sellercentral.amazon.de/listing/download?ref=ag_dnldinv_apvu_newapvu")

time.sleep(30000)

browser.get("https://sellercentral.amazon.de/listing/download?ref=ag_dnldinv_apvu_newapvu")

elements = browser.find_elements_by_tag_name("browse-node-component")


print(str(elements))

Что я ищу?

Нужно решение использовать двухфакторный токен аутентификации от Google authenticator.

Я хочу, чтобы селен открывался как вкладка в существующем экземпляре браузера Firefox, где я уже вошел в систему заранее. Поэтому не требуется вход в систему (должен быть), и можно выполнить «очистку» и загрузку. Если прямого пути нет, может, кто-нибудь придумает обходной путь?

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

Важные примечания: Firefox не дано! Я с радостью приму решение для любого браузера.

1 Ответ

0 голосов
/ 26 апреля 2019

Вот код, который будет читать токен google authenticator и использоваться при входе в систему. Использовал js, чтобы открыть новую вкладку. Установите пакет pyotp перед запуском тестового кода.

pip install pyotp

Тестовый код:

from pyotp import *
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.get("https://sellercentral.amazon.de/listing/download?ref=ag_dnldinv_apvu_newapvu")
wait = WebDriverWait(driver,10)
# enter the email
email = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@name='email']")))
email.send_keys("email goes here")

# enter password
driver.find_element_by_xpath("//input[@name='password']").send_keys("password goes here")

# click on signin button
driver.find_element_by_xpath("//input[@id='signInSubmit']").click()

#wait for the 2FA feild to display
authField = wait.until(EC.presence_of_element_located((By.xpath, "xpath goes here")))
# get the token from google authenticator
totp = TOTP("secret goes here")
token = totp.now()
print (token)
# enter the token in the UI
authField.send_keys(token)
# click on the button to complete 2FA
driver.find_element_by_xpath("xpath of the button goes here").click()
# now open new tab
driver.execute_script("""window.open("https://sellercentral.amazon.de/listing/download?ref=ag_dnldinv_apvu_newapvu")""")
# continue with your logic from here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...