Автоматизация входа в Google с помощью python и selenium показывает «»Этот браузер или приложение могут быть небезопасными»»

#python #selenium #selenium-webdriver #automation #selenium-chromedriver

#python #селен #selenium-webdriver #автоматизация #selenium-chromedriver

Вопрос:

Я пробовал войти в систему с помощью Gmail или любых служб Google, но отображается следующее сообщение «Этот браузер или приложение могут быть небезопасными»:

изображение ошибки

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

  1. как я могу это решить?
  2. Как я могу открыть selenium в обычном браузере Chrome, а не в том, который управляется автоматическим программным обеспечением? Это мой код
     from selenium.webdriver import Chrome
    from selenium.webdriver.chrome.options import Options


    browser = webdriver.Chrome()
    browser.get('https://accounts.google.com/servicelogin')
    search_form = browser.find_element_by_id("identifierId")
    search_form.send_keys('mygmail')
    nextButton = browser.find_elements_by_xpath('//*[@id ="identifierNext"]') 
    search_form.send_keys('password')
    nextButton[0].click() 
 

Комментарии:

1. # 2 невозможно. Для управления браузером Selenium требуется chromedriver.

Ответ №1:

Прежде всего, не используйте Chrome и chromedriver. Вам необходимо использовать Firefox. (если не установлен) Загрузите и установите Firefox. Войдите в Google с помощью обычного Firefox.

Вам нужно показать сайту Google, что вы не робот. Вы можете использовать такой код:

 from selenium import webdriver
import geckodriver_autoinstaller
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

geckodriver_autoinstaller.install()

profile = webdriver.FirefoxProfile(
    '/Users/<user name>/Library/Application Support/Firefox/Profiles/xxxxx.default-release')

profile.set_preference("dom.webdriver.enabled", False)
profile.set_preference('useAutomationExtension', False)
profile.update_preferences()
desired = DesiredCapabilities.FIREFOX

driver = webdriver.Firefox(firefox_profile=profile,
                           desired_capabilities=desired)
 

Это может помочь вам найти местоположение вашего профиля.

Но почему Firefox?

На самом деле есть только одна причина, chromedriver был закодирован Google. Они могут легко понять, бот это или нет. Но когда мы добавляем пользовательские данные в Firefox, они не могут понять, есть ли бот или нет.

Вы можете обмануть Google таким образом. Это сработало и для меня. Я очень старался это сделать. Надеюсь, это будет разрешено и у вас.

Комментарии:

1. Подумайте о том, почему Chrome с Chromedriver не работает и почему метод Firefox работает.

2. @MLarionov Очевидно, что это очень просто. Chrome был закодирован Google. Они могут легко понять, бот это или нет. Но Firefox отличается. Это выглядит как настоящий браузер, когда мы используем пользовательские данные.

3. ( 1) Я только что добавил driver = webdriver.Firefox(firefox_profile=path) , и это сработало! Я мог бы найти путь к своему профилю, как описано здесь .

4. Он работает на Mac в 2021 году!

5. Больше не работает, 2022

Ответ №2:

Это работает для меня. Я нашел решение на GitHub.

    from selenium import webdriver
   from selenium_stealth import stealth

   options = webdriver.ChromeOptions()
   options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36")
   options.add_experimental_option("excludeSwitches", ["enable-automation"])
   options.add_experimental_option('useAutomationExtension', False)
   options.add_argument('--disable-blink-features=AutomationControlled')
   driver = webdriver.Chrome(options=options)
   stealth(driver,
        languages=["en-US", "en"],
        vendor="Google Inc.",
        platform="Win32",
        webgl_vendor="Intel Inc.",
        renderer="Intel Iris OpenGL Engine",
        fix_hairline=True,
        )
   driver.get("https://www.google.com")
 

Комментарии:

1. не работает на macbook с тайским ip

2. Извините, я не проверял это в Mac OS. Попробуйте изменить такие параметры, как UA, поставщик, платформа и т.д.

3. Работал на моем macbook с индийским ip

4. Работает для меня даже без всех опций.добавить строки. Ура для github.com/diprajpatra/selenium-stealth

Ответ №3:

Вы можете легко обойти обнаружение ботов Google с помощью undetected_chromedriver :

 pip install undetected-chromedriver
pip install selenium
 

Кредиты: https://github.com/xtekky/google-login-bypass/blob/main/login.py

 import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class Main:
  def __init_(self) -> None:
    self.url    = 'https://accounts.google.com/ServiceLogin'
    self.driver = driver = uc.Chrome(use_subprocess=True)
    self.time   = 10
    
  def login(self, email, password):
    WebDriverWait(self.driver, 20).until(EC.visibility_of_element_located((By.NAME, 'identifier'))).send_keys(f'{email}n)
    WebDriverWait(self.driver, 20).until(EC.visibility_of_element_located((By.NAME, 'password'))).send_keys(f'{password}n)
                                                                                
    self.code()
                                                                                  
  def code(self):
    # [ ---------- paste your code here ---------- ]
    time.sleep(self.time)                                                                                  
                                                                                  
if __name__ == "__main__":
  #  ---------- EDIT ----------
  email = 'email' # replace email
  password = 'password' # replace password
  #  ---------- EDIT ----------                                                                                                                                                         
 
  driver = Main()
  driver.login(email, password) 
 

Ответ №4:

Из терминала pip установите undetected-chromedriver затем выполните следующие действия, как показано ниже.
ПРИМЕЧАНИЕ: сделайте отступ в своем коде, если name == main, как я это сделал, только тогда программа будет работать

 import undetected_chromedriver as uc
from time import sleep
from selenium.webdriver.common.by import By


if __name__ == '__main__':
    
    driver = uc.Chrome()
    driver.get('https://accounts.google.com/')

    # add email
    driver.find_element(By.XPATH, '//*[@id="identifierId"]').send_keys(YOUR EMAIL)
    driver.find_element(By.XPATH, '//*[@id="identifierNext"]/div/button/span').click()
    sleep(3)
    driver.find_element(By.XPATH, '//*[@id="password"]/div[1]/div/div[1]/input').send_keys(YOUR PASSWORD)
    driver.find_element(By.XPATH, '//*[@id="passwordNext"]/div/button/span').click()
    sleep(10)


 

Комментарии:

1. Только это сработало после 2 дней усилий без какого-либо другого решения. Спасибо @Salim-muneer-lala.

Ответ №5:

Вы можете использовать undetected-chromedriver из github

 import undetected_chromedriver as uc
from selenium import webdriver

options = uc.ChromeOptions()
options.add_argument("--ignore-certificate-error")
options.add_argument("--ignore-ssl-errors")
# e.g. Chrome path in Mac =/Users/x/Library/xx/Chrome/Default/
options.add_argument( "--user-data-dir=<Your chrome profile>")
driver = uc.Chrome(options=options)
url='https://accounts.google.com/servicelogin'
driver.get(url)
 

Ваш первый импорт должен быть незамеченным драйвером Chrome.

Комментарии:

1. Это не работает для меня на macOS. Это вызывает ошибку времени выполнения.

2. @Alex Пожалуйста, предоставьте немного больше информации, это поможет. Теперь он также используется моей командой.

Ответ №6:

Во-первых, я бы попросил вас использовать модуль undetected_chromedriver

Я обнаружил некоторые проблемы с исходным репозиторием, поэтому я разветвил репозиторий, который поддерживает user_data_dir, а также позволяет вам также указывать пользовательский путь к chromedriver.

Удалите старый модуль и установите его с помощью git clone, а затем перейдите в папку и запустите python setup.py установить

Ссылка на раздвоенный репозиторий: https://github.com/anilabhadatta/undetected-chromedriver

Импортируйте последний модуль undetected_chromdriver:

импортируйте undetected_chromedriver.v2 как ucdriver

Для использования функции user_data_dir напишите:

options.user_data_dir = "path_to _user-data-dir"

вместо того, чтобы использовать это

options.add_argument(f"user_data_dir={path_to _user-data-dir}")

имя profile_directory совпадает с тем, как мы пишем в selenium

options.add_argument(f"--profile-directory=Default")

Для использования пользовательского пути Chrome,

options.binary_location = chrome_path

Для использования пользовательского пути chromedriver,

driver = ucdriver.Chrome(executable_path=f'{path_to_chromedriver}', options=options)

Недавно Google внес некоторые изменения, для которых часть аутентификации не работала.

Я протестировал это в Python 3.9.0, есть сообщения о том, что он может работать некорректно в 3.10.0

И это проверено как в Windows, так и в Linux.

Окончательный код:

 def load_chrome_driver(headless):
    chrome_loc = "/home/ubuntu/Downloads/chromium-browser/"
    chrome_path = chrome_loc   "chrome"
    chromedriver_path = chrome_loc   "chromedriver"
    user_data_dir = "/home/ubuntu/.config/chromium/custom_user"
    options = webdriver.ChromeOptions()
    if headless:
        options.add_argument('headless')
    options.add_argument('--profile-directory=Default')
    options.add_argument("--start-maximized")
    options.add_argument('--disable-gpu')
    options.add_argument('--no-sandbox')
    options.add_argument("--disable-dev-shm-usage")
    options.add_argument('--log-level=3')
    options.binary_location = chrome_path
    options.user_data_dir = user_data_dir
    driver = ucdriver.Chrome(
        executable_path=chromedriver_path, options=options)
    driver.set_window_size(1920, 1080)
    driver.set_window_position(0, 0)
    return driver
 

Ответ №7:

Google обнаруживает, что вы используете бота. Прежде всего, вы должны добавить этот фрагмент конфигурации (преобразовать его в python, поскольку я написал его на Java):

     options.addArguments("--no-sandbox");
            options.addArguments("--disable-dev-shm-usage");
            options.addArguments("--disable-blink-features");
            options.setExperimentalOption("excludeSwitches", Arrays.asList("enable-automation"));
            options.addArguments("--disable-blink-features=AutomationControlled");
            options.addArguments("--disable-infobars");

        options.addArguments("--remote-debugging-port=9222");

options.setCapability(CapabilityType.UNEXPECTED_ALERT_BEHAVIOUR, UnexpectedAlertBehaviour.IGNORE);

driver.executeScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
 

Последняя инструкция является ключевой, когда вы запускаете Selenium, для параметра navigator var в Chrome устанавливается значение «true», что означает, что браузер управляется ботом, установка для него значения JS в значение undefined делает его «обычным браузером» с точки зрения Google.
Еще одна важная вещь, которую вы должны сделать, это изменить шестнадцатеричное значение двоичного файла chromedriver, я могу отправить вам свой уже измененный файл (среда ubuntu), если вы доверяете мне obv.

Комментарии:

1. Привет, Эдоардо, можешь ли ты отправить мне модифицированный двоичный файл chromedriver?

2. Это не работает для меня на macOS. Я все еще захожу Couldn’t sign you in в браузер.

Ответ №8:

Если вы предпочитаете Chrome, а не Firefox, способ обойти автоматическое обнаружение Google — это использовать undetected_chromedriver библиотеку. Вы можете установить пакет с помощью pip install undetected-chromedriver . После запуска вашего объекта driver вы можете просто использовать selenium для последующей работы с драйвером.

 # initiate the driver with undetetcted_chromedriver
import undetected_chromedriver.v2 as uc
driver = uc.Chrome()

# operate the driver as you would with selenium
driver.get('https://my-url.com') 

# Example use of selenium imports to be used with the driver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By

try:
    driver.find_element(By.XPATH, '//*[@id="my-id"]').click()
except NoSuchElementException:
    print("No Such Element Exception")
 

Примечание: вход в Google является всплывающим окном, поэтому не забудьте поменять дескрипторы окна на всплывающее окно для входа в систему, а затем вернуться к главному окну.

Комментарии:

1. Это не работает для меня на macOS. Это вызывает ошибку времени выполнения.