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 Context 即 Browser 会话。
此浏览器或应用可能不安全
此错误可能由于以下不同因素而发生:
在"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。