Selenium Google 登录块

Posted

技术标签:

【中文标题】Selenium Google 登录块【英文标题】:Selenium Google Login Block 【发布时间】:2020-05-23 19:31:31 【问题描述】:

我在使用 Google 登录时遇到问题。我想登录我的帐户,但 Google 说不允许自动化驱动程序登录。

我正在寻找解决方案。是否可以获取普通 Firefox/Chrome 的 cookie 并将其加载到 ChromeDriver/GeckoDriver 中?我认为这可能是一个解决方案。但我不确定这是否可能..

寻找解决方案...

另外,我想添加一个快速解决方案。我解决了这个问题 使用我的一个旧的验证帐户。这可以是一个快速的解决方案 你。

【问题讨论】:

@OrangeDog 尝试另一个帐户。经过验证和旧.. 奇怪的是,我为一个测试 gmail 帐户而不是另一个。完全相同的安全设置(不安全的应用程序访问已打开,没有 2FA)。这是用谷歌按钮登录我们的应用程序,我有自动化测试。以隐身模式手动登录有效,但使用 Selenium 无效。仅适用于一个测试帐户。很奇怪。 @MattS 这太奇怪了。一旦我遇到同样的问题。我有一段时间无法修复它,我想我可以尝试使用不同的帐户,也许他们有一个黑名单或类似的自动化测试。无论如何他们能够理解我们使用什么类型的驱动程序。我认为旧的经过验证的帐户(带有电话号码左右)更可靠。这就是为什么我们可以与他们一起使用登录站点.. 【参考方案1】:

我遇到了同样的问题并找到了解决方案。我正在使用

1) Windows 10 专业版

2) Chrome 版83.0.4103.97 (Official Build) (64-bit)

3) 硒 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"

【讨论】:

macos 有没有办法做到这一点 我有所有这些选项: - 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。 @MattGroth 在 Mac 上遇到同样的问题,你有什么好运气吗? @Atul 很遗憾,我已经放弃了。看起来谷歌正在尽其所能阻止我们登录自动浏览器。我想这只是一个太多的安全问题。【参考方案2】:

此错误消息...

...暗示 WebDriver 实例无法验证 Browsing ContextBrowser 会话。


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

此错误可能由于以下不同因素而发生:

在"This browser or app may not be secure" error when trying to sign in with Google on desktop apps@Raphael Schaad 的文章中提到,如果用户可以使用其他 Google 帐户登录同一个应用程序,那么问题一定出在特定帐户上。在大多数情况下,可能的原因是,此特定用户帐户配置了 双因素身份验证

在文章Less secure apps & your Google Account 中提到,如果应用或网站不符合google-chrome 的security standards,Google 可能会阻止任何试图通过它登录您的帐户的人。不太安全的应用可以让黑客更容易进入您的帐户,因此阻止从这些应用登录有助于确保您的帐户安全。


解决方案

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

为此 Google 帐户禁用 双因素身份验证 并执行您的 @Test。 Allow less secure apps

您可以在Unable to sign into google with selenium automation because of "This browser or app may not be secure."找到详细讨论


深入研究

但是,为了帮助保护您的帐户,网络浏览器可能不允许您从某些浏览器登录。 Google 可能会停止从以下浏览器登录:

不支持 javascript 或关闭了 Javascript。 添加了 AutomationExtension 或不安全或不受支持的扩展。 使用自动化测试框架。 嵌入到不同的应用程序中。

解决方案

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

使用支持JavaScript的浏览器:

Safari

火狐

歌剧

Internet Explorer

边缘

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());
      
  

您可以在以下位置找到一些相关讨论:

Gmail login using selenium webdriver in java

Selenium test scripts to login into google account through new ajax login form


其他注意事项

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

JDK 升级到当前级别JDK 8u241。 Selenium 升级到当前级别 Version 3.141.59。 ChromeDriver 已更新到当前的ChromeDriver v80.0 级别。 Chrome 已更新至当前 Chrome 版本 80.0 级别。 (根据ChromeDriver v80.0 release notes)

【讨论】:

我见过其他地方,当人们允许不太安全的应用程序时,它并不能解决问题。我自己试过了,没有用。即使我在自己的谷歌帐户上允许它,它也不会转移到硒打开的窗口。如果有人需要访问 gmail 帐户或使用 google 服务,您对浏览器自动化方法有任何其他建议......现在使用 selenium 并不容易/可能 如何在你的代码中导入“集合”??【参考方案3】:

一个适合我的解决方案:https://***.com/a/60328992/12939291 或 https://www.youtube.com/watch?v=HkgDRRWrZKg

简短:使用 Google 帐户通过重定向登录 ***

from selenium import webdriver
from time import sleep

class Google:

    def __init__(self, username, password):

        self.driver = webdriver.Chrome('./chromedriver')
        self.driver.get('https://***.com/users/signup?s-s-rc=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 = ''
passwort = ''
Google(username, password)

【讨论】:

此解决方案提供的 cookie 不太正确,例如对于 youtube,这很糟糕...... 对我来说很好。不用于 YouTube。 Google 修复了这个问题,不再是选项。【参考方案4】:

经过几个小时的反复试验,我刚刚尝试了一些对我有用的方法。

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

后来我意识到这对我没有帮助,因为我尝试使用不同的电子邮件但它不起作用。经过一番观察,我想出了一些别的办法,这已经过试验和测试了。

使用自动化

转到https://***.com/users/login 选择使用 Google 策略登录 输入谷歌用户名和密码 登录到 *** 转至https://gmail.com(或您想访问的任何 Google 应用)

在持续执行此操作一整天(大约 24 小时)后,尝试直接自动登录到 gmail(或您想要访问的任何 Google 应用程序).​​..我至少有另外两个人这样做成功。 PS - 您可能希望继续使用 *** 登录,直到您至少收到验证码请求,因为我们都经历了那个阶段。

【讨论】:

在测试我没有运气并且无法登录之后。每个 arg 的 chrome_options.add_argument() 但仍然存在相同的安全问题【参考方案5】:

这可能仍然打开/未回答

这是以下线程中的一个工作 (28.04.2021) 示例: https://***.com/a/66308429/15784196

使用 Firefox 作为驱动程序。我测试了他的例子,它确实有效!

【讨论】:

【参考方案6】:

我找到了一个解决方案,@theycallmepix 和 @Yinka Albi 是正确的,但因为(我认为)谷歌将第一次以编程方式登录的帐户列入黑名单,所以后来他们无法正常登录。 所以基本上只需使用不同的帐户并转到 Stackauth 或 ***。然后使用 Google 手动登录(首先链接您的帐户)然后手动登录 google.com,然后它应该可以正常工作

附:如果这不起作用,请发表评论

【讨论】:

【参考方案7】:

使用下面给出的 sn-p method 登录您的 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://***.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()

上面的代码有 2 个参数 - gmailID 和密码。如果密码或用户名错误,将会通知您。

为什么选择 stackauth? -> Stackauth 使用 OAuth 2.0 授权访问 Google API(此处,Google 帐户登录需要 Google API 才能工作)以安全地登录用户到他/她的 Google 帐户。

Click here 了解有关 OAuth 的更多信息。

编辑:

我刚刚回答了我昨天发布的我自己的问题,认为它可能会对您有所帮助。 截至目前,2021年,它可以成功绕过过去登录时出现的所有google限制。 如果它不起作用,请随时恢复。 我的答案的链接是here

【讨论】:

【参考方案8】:

无需重定向、使用 firefox 驱动程序或更改任何 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: 上面文件路径中的配置文件 # 会有所不同,因此我建议在用户数据文件夹中检查您要使用的配置文件。例如,如果您当前只有 1 个 chrome 帐户,则用户数据中将没有配置文件目录(诉诸“默认”目录),但如果您创建第二个 chrome 帐户,用户数据中将有一个“配置文件 1”目录。

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

苹果机: 此解决方案可能适用于 mac,也可能不适用于 mac,但要查找 chrome 帐户文件夹/文件路径,请按照@bfhaha留下的评论中的说明进行操作

【讨论】:

Mac Book 如何做到这一点? @cadd_coder 这个答案对我不起作用。但我知道配置文件在哪里。访问chrome://version/ 有一个Profile Path。它告诉你配置文件在哪里。在我的 MacOS 中,它是/Users/bfhaha/Library/Application Support/Google/Chrome/Default。请注意,您无法在 Finder 中看到 Library 文件夹。默认情况下它是隐藏的。所以只需使用 [Go] 和 [Go to Folder] 来浏览文件夹。【参考方案9】:
    在浏览器中添加 cookie 编辑器。

    2. 将您的帐户 cookie 信息添加到您的浏览器。

您的帐户将自动打开。

Google fixed this method :( :(

【讨论】:

怎么做? 谷歌修复了这个方法【参考方案10】:

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

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

    为 Chrome 浏览器创建一个新的用户目录。 您可以随意命名此文件夹并将其放置在任何位置。

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

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

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

您可以使用任何免费端口,但我遵循了这篇文章: https://chromedevtools.github.io/devtools-protocol/

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

在您的项目中:

    将刚刚创建的 chrome-user-directory 复制到“资源”包中。

    为 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);
    
    享受吧。

PS:如果你有其他解决方案没有将chrome用户目录复制到项目中,请分享)

【讨论】:

我需要使用不同的 Gmail 帐户。我该怎么做?【参考方案11】:

一个缓慢但很好的解决方案是延迟每次按键。为什么?因为谷歌使用一种验证码来分析你的打字速度和更多的东西。因此,如果您想输入example@example.com 之类的邮件或密码,您必须这样做:

for i in "example@example.com\n": #\n because the submit doesn't work in input fields in google sign in, so \n is equivalent of pressing enter
    element.send_keys(i)
    time.sleep(0.4) #don't forget to import time or something else with which you could delay your code!
time.sleep(1) #also this sleep because when the button will redirect url, it'd not reload the site and selenium will not wait so one more sleep

PS:如果不醒,请尝试更改 sleep 的值或任何其他延迟函数

【讨论】:

【参考方案12】:

@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

【讨论】:

以上是关于Selenium Google 登录块的主要内容,如果未能解决你的问题,请参考以下文章

python+selenium-12306实战解决登录滑块问题

如何使用 selenium 在某些网站中使用 kakao、google、naver id 自动登录

由于“此浏览器或应用程序可能不安全”,无法使用 selenium 自动化登录 Google。

使用 python 和 selenium 进行自动化 Google 登录显示“”此浏览器或应用程序可能不安全“”

selenium登录博客园

selenium环境配置