如何解决Selenium Google 登录在自动化中被阻止 【自答:绕过谷歌限制】
从今天开始,用户无法在新的个人资料中使用 selenium登录到 Google 帐户。我发现,即使在尝试使用 stackauth 时,Google 也会阻止该进程(拒绝?)。 (更新到 v90 后体验到这一点)。
这是我之前使用 OAuth 发布的用于 Google 登录的 answer,直到最近才有效!
简而言之,您将通过 stackauth 直接登录。
- 绕过限制的唯一方法是禁用 Secure-App-Access 或添加以下给定参数。(我不喜欢这样做,因为我无法说服我的用户(100+) 谁使用我的应用程序来禁用它!)
options.add_argument('user-data-dir=C:/Users/{username}/path to data of browser/')
- 另一种唯一的登录方式是使用隐身方式将用户代理伪装成 DN,这在 here 中提到,并且效果很好。
- 我发现的主要缺点是在自动化运行时您无法打开另一个标签,否则该过程会中断。但这与该缺点完美契合。
- 但我发现的缺点是,一旦您登录,您将无法完成工作,因为您正在访问的网站会限制您并强制您更新浏览器才能访问该网站({{3 }} 就我而言)。 另一方面,理论上,可以使用用户数据打开自动化,但在新窗口中。与除 OAuth 以外的其他方法相比,我觉得它非常理想,因为它是最好的方法。
是否有其他最佳工作建议可以绕过 Google 的这些限制?
解决方法
最后,我成功绕过了 Selenium 中的 Google 安全限制,希望它也能帮到你。在这里分享整个代码。
简而言之:
- 您需要使用旧的/过时的用户代理并恢复。
详细说明:
- 使用 selenium-stealth 伪造用户代理。
- 在登录前将 user-agent 初始设置为
DN
。 - 然后,登录后,恢复正常。(不是真的,而是 chrome v>80)
就是这样。
无需保留用户数据,启用安全性较低的应用访问,什么都没有!
这是我目前工作的代码片段,它很长!(为了更好地理解而包含注释)。
# Import required packages,modules etc.. Selenium is a must!
def login(username,password): # Logs in the user
driver.get("https://stackoverflow.com/users/login")
WebDriverWait(driver,60).until(expected_conditions.presence_of_element_located(
(By.XPATH,'//*[@id="openid-buttons"]/button[1]'))).click()
try:
WebDriverWait(driver,60).until(expected_conditions.presence_of_element_located(
(By.ID,"Email"))).send_keys(username) # Enters username
except TimeoutException:
del username
driver.quit()
WebDriverWait(driver,60).until(expected_conditions.element_to_be_clickable(
(By.XPATH,"/html/body/div/div[2]/div[2]/div[1]/form/div/div/input"))).click() # Clicks NEXT
time.sleep(0.5)
try:
try:
WebDriverWait(driver,60).until(expected_conditions.presence_of_element_located(
(By.ID,"password"))).send_keys(password) # Enters decoded Password
except TimeoutException:
driver.quit()
WebDriverWait(driver,5).until(expected_conditions.element_to_be_clickable(
(By.ID,"submit"))).click() # Clicks on Sign-in
except TimeoutException or NoSuchElementException:
print('\nUsername/Password seems to be incorrect,please re-check\nand Re-Run the program.')
del username,password
driver.quit()
try:
WebDriverWait(driver,60).until(lambda webpage: "https://stackoverflow.com/" in webpage.current_url)
print('\nLogin Successful!\n')
except TimeoutException:
print('\nUsername/Password seems to be incorrect,password
driver.quit()
USERNAME = input("User Name : ")
PASSWORD = white_password(prompt="Password : ") # A custom function for secured password input,explained at end.
# Expected and required arguments added here.
options = Options()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches",["enable-automation"])
options.add_experimental_option('useAutomationExtension',False)
options.add_experimental_option('excludeSwitches',['enable-logging'])
# Assign drivers here.
stealth(driver,user_agent='DN',languages=["en-US","en"],vendor="Google Inc.",platform="Win32",webgl_vendor="Intel Inc.",renderer="Intel Iris OpenGL Engine",fix_hairline=True,) # Before Login,using stealth
login(USERNAME,PASSWORD) # Call login function/method
stealth(driver,user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/90.0.4430.72 Safari/537.36',) # After logging in,revert back user agent to normal.
# Redirecting to Google Meet Web-Page
time.sleep(2)
driver.execute_script("window.open('https://the website that you wanto to go.')")
driver.switch_to.window(driver.window_handles[1]) # Redirecting to required from stackoverflow after logging in
driver.switch_to.window(driver.window_handles[0]) # This switches to stackoverflow website
driver.close() # This closes the stackoverflow website
driver.switch_to.window(driver.window_handles[0]) # Focuses on present website
点击 here 了解 white_password。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。