Selenium 谷歌登录阻塞

56
我在使用Google登录时遇到了问题。我想登录我的账户,但是Google说不允许自动化驱动程序登录。
我正在寻找解决方案。是否可以获取普通Firefox/Chrome的cookie并加载到ChromeDriver/GeckoDriver中?我认为这可能是一个解决办法。但我不确定是否可行。。
正在寻找解决方案...

enter image description here

快速解决方案是使用=>
var options = new ChromeOptions();
options.addArguments(@"user-data-dir=c:\Users\{username}\AppData\Local\Google\Chrome\User Data\");

@OrangeDog 请尝试另一个账户。该账户已通过验证且为老账户。 - Ahmet Aziz Beşli
我在一个测试gmail帐户上遇到了这个问题,但在另一个帐户上却没有。安全设置完全相同(允许不安全的应用程序访问,未开启两步验证)。这是我们应用程序中一个使用谷歌登录按钮的自动化测试。使用隐身模式手动登录有效,但使用Selenium无效,而且只对一个测试帐户无效。非常奇怪。 - MattS
@MattS 这真的很奇怪。我曾经遇到过同样的问题。我一直无法解决它,所以我想尝试使用不同的账户,也许他们对自动化测试有黑名单或类似的东西.. 无论如何,他们能够理解我们使用的驱动程序类型。我认为旧的已验证的带电话号码之类的账户更可靠。这就是为什么我们可以使用这些账户登录网站.. - Ahmet Aziz Beşli
13个回答

21
我遇到了同样的问题,并找到了解决办法。我正在使用:
  1. Windows 10 Pro

  2. Chrome 版本 83.0.4103.97 (官方版本) (64 位)

  3. selenium ChromeDriver 版本 83.0.4103.39

一些简单的 C# 代码,用于打开谷歌页面。
var options = new ChromeOptions();
options.addArguments(@"user-data-dir=c:\Users\{username}\AppData\Local\Google\Chrome\User Data\");
IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver();
driver = new ChromeDriver(Directory.GetCurrentDirectory(), options);
driver.Url = "https://accounts.google.com/";
Console.ReadKey();

这里的核心问题是,当您使用Selenium驱动程序时无法登录,但可以使用已登录到Google帐户的配置文件。
您需要找到Chrome存储配置文件的位置,并将其与"user-data-dir"选项一起添加。
附注:请用您真实的帐户名替换{username}。
在Linux上,用户配置文件位于"~/.config/google-chrome"。

2
有没有一种方法可以在macOS上实现这个? - deleted
2
我有所有这些选项:
  • chrome_options.add_argument("--disable-web-security")
  • chrome_options.add_argument("--allow-running-insecure-content")
  • chrome_options.add_argument( "--user-data-dir=/Users/matt/Library/Application Support/Google/Chrome" )
  • chrome_options.add_argument('--profile-directory=Default')
但对我来说仍然不起作用。它仍然显示浏览器不安全。我使用的是Mac OS和Chrome 93版本。
- Matt Groth
1
@MattGroth 在Mac上遇到了同样的问题,你有什么进展吗? - Atul Gopinathan
1
@Atul,很遗憾我已经放弃了。看起来谷歌正在尽其所能防止我们在自动化浏览器上登录。我猜现在这太过于安全敏感了。 - Matt Groth

8

这个错误消息...

This browser or app may not be secure

这意味着WebDriver实例无法对Browsing ContextBrowser会话进行身份验证。

此浏览器或应用程序可能不安全

此错误可能由以下不同因素引起:


解决方案

在这些情况下,相应的解决方案如下:

您可以在由于“此浏览器或应用程序可能不安全”,无法使用Selenium自动化登录谷歌的详细讨论中找到更多信息。


深入了解

然而,为了保护您的帐户,Web浏览器可能不允许您从某些浏览器登录。Google可能会阻止从以下浏览器进行登录:

  • 不支持JavaScript或已关闭JavaScript的浏览器。
  • 添加了AutomationExtension、不安全或不受支持的扩展程序的浏览器。
  • 使用自动化测试框架的浏览器。
  • 嵌入到不同应用程序中的浏览器。

解决方案

在这些情况下,有多种解决方案:

  • 使用支持JavaScript的浏览器:

  • Chrome

  • Safari

  • Firefox

  • Opera

  • Internet Explorer

  • Edge

  • Web浏览器中启用JavaScript:如果您正在使用支持的浏览器仍然无法登录,则可能需要启用JavaScript。

  • 如果您仍然无法登录,则可能是因为您已经打开了AutomationExtension / unsecure / unsupported扩展程序,并且您可能需要按照以下步骤关闭:

    public class browserAppDemo 
    {
        public static void main(String[] args) throws Exception 
        {
            System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
            ChromeOptions options = new ChromeOptions();
            options.addArguments("start-maximized");
            options.setExperimentalOption("useAutomationExtension", false);
            options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
            WebDriver driver =  new ChromeDriver(options); 
            driver.get("https://accounts.google.com/signin")
            new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@id='identifierId']"))).sendKeys("gashu");
            driver.findElement(By.id("identifierNext")).click();
            new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath("//input[@name='password']"))).sendKeys("gashu");
            driver.findElement(By.id("passwordNext")).click();
            System.out.println(driver.getTitle());
        }
    }

其他注意事项

最后,请注意,一些旧版本的浏览器可能不被支持,请确保:


3
我曾经看到其他地方的人在允许不太安全的应用程序后,问题并没有得到解决。我自己尝试了一下,但它并没有起作用。即使我在自己的Google账户上允许它,也无法传输到窗口Selenium打开的页面。如果有人需要访问Gmail帐户或使用Google服务,但现在使用Selenium可能不容易/不可能,你有任何其他的浏览器自动化方法建议吗? - Mike Sandstrom
如何在您的代码中导入“Collections”? - Noppu
哦!我发现即使关闭了双重认证,如果你有一个“关联”的安卓设备(因为例如最近用该账户在安卓上测试过什么东西),Google 也不会让你进入,而且总是要求你打开安卓并打开“应用”获取验证代码。只需转到你的帐户并取消所有与安卓的链接!然后再试一次,一切都会重新正常工作! - anibal

6

无需重定向、使用火狐驱动程序或更改任何Google帐户设置的解决方案:

如果您想访问特定的Google帐户,请在其中创建一个chrome配置文件,然后在使用selenium时加载该chrome配置文件:

options = webdriver.ChromeOptions()
options.add_argument("--user-data-dir=C:/Users/{userName}/AppData/Local/Google/Chrome/User Data/Profile {#}/")
driver = webdriver.Chrome("C:/bin/chromedriver.exe", chrome_options=options)

Windows:
上述文件路径中的配置文件{#}会有所不同,建议在User Data文件夹内检查要使用哪个配置文件。例如,如果您当前只有一个Chrome帐户,则在User Data中没有“Profile”目录(默认为“Default”目录),但如果您创建第二个Chrome帐户,则在User Data中会有一个“Profile 1”目录。

请注意,您应该创建一个新的Google Chrome配置文件来与Selenium一起使用,因为尝试使用已经在使用中的Chrome配置文件(在另一个Chrome窗口中打开)会导致错误。

Mac:
此解决方案可能适用于Mac,但要找到Chrome帐户文件夹/文件路径,请按照@bfhaha留下的评论中的说明操作。


2
你如何在Mac Book上实现这个? - deleted
3
这个答案对我无效。但我知道在哪里可以找到配置文件。请访问 chrome://version/,找到 Profile Path,它会告诉你配置文件的位置。 在我的MacOS中,它是 /Users/bfhaha/Library/Application Support/Google/Chrome/Default。请注意,在Finder中您看不到Library文件夹,默认情况下是隐藏的。因此,只需使用[前往]和[前往文件夹]来浏览该文件夹即可。 - bfhaha
有人在OSX上成功过吗? - Kevin Wheeler

4

一个适合我的解决方案: https://dev59.com/XFIH5IYBdhLWcg3weOUq#60328992https://www.youtube.com/watch?v=HkgDRRWrZKg

简短概述:使用重定向通过Google帐户登录Stackoverflow

from selenium import webdriver
from time import sleep

class Google:

    def __init__(self, username, password):

        self.driver = webdriver.Chrome('./chromedriver')
        self.driver.get('https://stackoverflow.com/users/signup?ssrc=head&returnurl=%2fusers%2fstory%2fcurrent%27')
        sleep(3)
        self.driver.find_element_by_xpath('//*[@id="openid-buttons"]/button[1]').click()
        self.driver.find_element_by_xpath('//input[@type="email"]').send_keys(username)
        self.driver.find_element_by_xpath('//*[@id="identifierNext"]').click()
        sleep(3)
        self.driver.find_element_by_xpath('//input[@type="password"]').send_keys(password)
        self.driver.find_element_by_xpath('//*[@id="passwordNext"]').click()
        sleep(2)
        self.driver.get('https://youtube.com')
        sleep(5)

username = ''
password = ''
Google(username, password)

5
这个解决方案做出来的饼干不是很好,例如对于 YouTube 来说很糟糕... - Konstantin
对我来说运行良好。不用于YouTube。 - AturSams
9
谷歌已经修复了这个问题,这已不再是一个选项。 - Vu Nguyen

3

@Mike-Fakesome 在这个https://gist.github.com/ikegami-yukino/51b247080976cb41fe93 的帖子中提出的解决方案是有效的。

import undetected_chromedriver.v2 as uc
import random,time,os,sys
from selenium.webdriver.common.keys import Keys

GMAIL = '<GMAIL_HERE>'
PASSWORD = '<PASSWORD_HERE>'

chrome_options = uc.ChromeOptions()

chrome_options.add_argument("--disable-extensions")

chrome_options.add_argument("--disable-popup-blocking")

chrome_options.add_argument("--profile-directory=Default")

chrome_options.add_argument("--ignore-certificate-errors")

chrome_options.add_argument("--disable-plugins-discovery")

chrome_options.add_argument("--incognito")

chrome_options.add_argument("user_agent=DN")

driver = uc.Chrome(options=chrome_options)

driver.delete_all_cookies()

driver.get("https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount?redirect_uri=https%3A%2F%2Fdevelopers.google.com%2Foauthplayground&prompt=consent&response_type=code&client_id=407408718192.apps.googleusercontent.com&scope=email&access_type=offline&flowName=GeneralOAuthFlow")

driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div/div[1]/div/div[1]/input").send_keys(GMAIL)
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div/div[1]/div/div[1]/input").send_keys(Keys.RETURN)

time.sleep(10)

现在您也可以使用import undetected_chromedriver as uc来替代import undetected_chromedriver.v2 as uc


3

这个问题可能仍然处于未解决状态

以下是一个工作的示例(截至2021年4月28日):在以下线程中: https://dev59.com/VVEG5IYBdhLWcg3wbNTX#66308429

使用Firefox作为驱动程序。 我测试了他的示例,它确实可行!


谢谢提供的链接,我在同一帖子中使用了selenium_stealth答案,它与Chrome完美配合! - Wouter

3

上周我使用以下步骤解决了这个问题:

前两个步骤不在您的项目代码中。

  1. 为Chrome浏览器创建一个新的用户目录。 you can name this folder whatever you like and place it anywhere 您可以自己命名文件夹并将其放置在任何地方。

  2. 使用刚创建的目录以调试模式运行Chrome浏览器。

cd C:\Program Files\Google\Chrome\Application

chrome.exe --remote-debuggin-port=9222 --user-data-dir="C:\localhost"

you can use any free port

您可以使用任何空闲端口,但我遵循了此文章: https://chromedevtools.github.io/devtools-protocol/

浏览器窗口会打开。 手动登录Google/Facebook等网站,使用刚打开的窗口。 关闭浏览器。

在您的项目中:

  1. 将您刚创建的chrome-user-directory复制到“resources”包中。

enter image description here

  1. 设置Chrome驱动程序的调试选项。
     /**
     * This method is added due to Google security policies changed.
     * Now it's impossible to login in Google account via Selenium at first time.
     * We use a user data directory for Chrome where we previously logged in.
     */
    private WebDriver setWebDriver() {
        ChromeOptions options = new ChromeOptions();        
        options.addArguments("--user-data-dir=" + System.getProperty("user.dir") + "/src/main/resources/localhost");
        options.addArguments("--remote-debugging-port=9222");
        return new ChromeDriver(options);
    }
  1. 享受吧。

附言:如果您有不需要将Chrome用户目录复制到项目中的其他解决方案,请分享。)


我需要使用不同的Gmail账户。我该怎么做? - Taki Elias
@TakiElias,你可以在setWebDriver中动态更改--user-data-dir(当然,需要打开新窗口)。 - Jaroslav Štreit
在我的情况下,我无法从终端运行Chrome - 在通过VNC的服务器上,我遇到了错误:无法打开X显示。我找出了我的显示器:ps axu | grep-3 "X" 然后"export DISPLAY=:1",voila,Chrome就在我的VNC窗口中启动了。 - Jaroslav Štreit

3

在经过数小时的试验和错误后,我尝试了一些东西,并获得了成功。

args: ['--disable-web-security', '--user-data-dir', '--allow-running-insecure-content' ]添加到我的配置中解决了这个问题。

后来我意识到这并没有帮助我,因为我尝试使用另一个电子邮件地址,但它不起作用。经过一些观察,我找到了其他解决方法,而且已经被尝试和测试过了。

使用自动化:

前往https://stackoverflow.com/users/login页面 选择Google策略登录 输入Google用户名和密码 登录至Stackoverflow 进入https://gmail.com (或者任何您想要访问的Google应用程序)

坚持这样做整整一天(约24小时),然后直接自动化登录到gmail(或者任何您想要访问的Google应用程序)... 我至少有两个人成功地做到了这一点。 PS- 您可能需要继续使用stackoverflow登录,直到您至少得到验证码请求,因为我们都经历过这个阶段。


8
经过测试,我没有运气,并且无法登录。对于每个参数,chrome_options.add_argument() 但仍存在相同的安全问题。 - uxke

2
我找到了一个解决方案,@theycallmepix和@Yinka Albi是正确的,但是(我认为)由于谷歌对仅通过程序登录的帐户进行了黑名单处理,所以后来他们无法正常登录。因此,只需使用不同的帐户并转到Stackauth或StackoverFlow。然后手动使用Google登录(首先链接您的帐户),然后手动在google.com上登录,然后它应该可以自动化工作。
P.S.如果这不起作用,请评论。

1
使用下面给出的片段方法登录到您的Google帐户。
语言:Python3
通过StackAuth重定向(原因在结尾解释)
[编辑:您需要导入所需的软件包。确保您执行的自动化在前台运行,我的意思是,在登录完全之前,它不会最小化。一旦登录成功,您就可以重定向到所需的网站。]
def login(username, password):       # Logs in the user
    driver.get('https://accounts.google.com/o/oauth2/auth/identifier?client_id=717762328687-iludtf96g1hinl76e4lc1b9a82g457nn.apps.googleusercontent'
               '.com&scope=profile%20email&redirect_uri=https%3A%2F%2Fstackauth.com%2Fauth%2Foauth2%2Fgoogle&state=%7B%22sid%22%3A1%2C%22st%22%3A%2'
               '259%3A3%3Abbc%2C16%3A561fd7d2e94237c0%2C10%3A1599663155%2C16%3Af18105f2b08c3ae6%2C2f06af367387a967072e3124597eeb4e36c2eff92d3eef697'
               '1d95ddb5dea5225%22%2C%22cdl%22%3Anull%2C%22cid%22%3A%22717762328687-iludtf96g1hinl76e4lc1b9a82g457nn.apps.googleusercontent.com%22%'
               '2C%22k%22%3A%22Google%22%2C%22ses%22%3A%2226bafb488fcc494f92c896ee923849b6%22%7D&response_type=code&flowName=GeneralOAuthFlow')

    driver.find_element_by_name("identifier").send_keys(username)
    WebDriverWait(driver, 10).until(expected_conditions.element_to_be_clickable((By.XPATH, "//*[@id='identifierNext']/div/button/div[2]"))).click()
    driver.implicitly_wait(4)

    try:
        driver.find_element_by_name("password").send_keys(password)
        WebDriverWait(driver, 2).until(expected_conditions.element_to_be_clickable((By.XPATH, "//*[@id='passwordNext']/div/button/div[2]"))).click()
    except TimeoutException:
        print('\nUsername/Password seems to be incorrect, please re-check\nand Re-Run the program.')
        del username, password
        exit()
    except NoSuchElementException:
        print('\nUsername/Password seems to be incorrect, please re-check\nand Re-Run the program.')
        del username, password
        exit()
    try:
        WebDriverWait(driver, 5).until(lambda webpage: "https://stackoverflow.com/" in webpage.current_url)
        print('\nLogin Successful!\n')
    except TimeoutException:
        print('\nUsername/Password seems to be incorrect, please re-check\nand Re-Run the program.')
        exit()

以上代码接受两个参数 - gmailID和密码。如果密码或用户名错误,您将会收到通知。
为什么要使用stackauth? -> Stackauth使用OAuth 2.0授权访问Google APIs(在这里,Google帐户登录需要Google API才能工作),以安全地登录用户到他/她的Google帐户。
点击这里阅读有关OAuth的更多信息。
编辑:
我刚刚回答了自己昨天发布的问题,认为这可能会对你有所帮助。 截至2021年,它可以成功绕过所有登录时曾经发生的所有谷歌限制。 如果不起作用,请随时回复。 我的回答链接在这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接