python中用分别用selenium、requests库实现Windows认证登录
最近在搞单位的项目,实现python自动化,结果在第一步就把我给拒之门外,查资料问大佬,问我们开发人员,从周一折腾到周五才搞定了
接下给大家分享一下
项目背景:我们系统是基于Windows平台实现的,登录方式为Windows身份认证
一、web端登录方式,selenium模块实现
1、原来想用selenium实现,web端可不可以用WinSpy先定位在使用pywin32实现呢,尝试一下发现,WinSpy这个工具根本定位不到我的登录窗口,整个黑色的定位框无法定位登录弹窗,网上说的Autoit这种方式估计和这个类似,都是操作Windows窗口,咱也不会,没研究明白,如图:
2、中间还想过使用requests库请求,获取cookie(就是下面的第二中方法)的方式来实现,requests库发起请求,返回请求头中的Set-Cookie,利用Set-Cookie中的sessionid以及其他的必填参数来实现Windows身份认证,selenium中的webdriver发起请求时,将sessionid等一系列的参数带上,使用这种方法来实现Windows认证,可是还是不行,直接报错,说是无效的cookie域,具体报错信息如下:
3、web这种方式更是奇葩,耗费了我一个半周的时间,咨询了我们的小简大佬、奔奔大佬依然还是没有搞定,这不是搞我心态嘛,自信心全部被摧毁,一遍一遍的翻阅着百度、必应等搜索网站,期间我的同学L姐一直陪伴着我,帮助我解决问题,包括执行的步骤,截图、录像都用上了,最后的最后终于是搞定了,接下来给大家说一下,以后有同学遇到Windows身份认证了,可以使用这种方式进行登录认证。
其实很简单的原理,也看到过有帖子再说这种方法,就是将用户名和密码写到url中,可是当时我没有成功,关键在于特殊字符。
语法为:http://username:password@url
实现代码如下,举个栗子:
from selenium import webdriver driver = webdriver.Chrome() url = r"http://d%5cyuaxxx:xxx123@10.2.xx.xx/" # 用户名中含有特殊符号,这是转义后的用户名 driver.get(url)
这里千万注意,如果你的username,password里边含有特殊字符,如:!@#¥%……&*等等,一定要转换为UrlEncode格式,不然肯定登录不成功,一把血泪史呀
在这里特别感谢我L姐,没有她我也解决不了这个问题
提供一个转码的网址:https://tool.chinaz.com/tools/urlencode.aspx
例如:“admin@1234”这个字符串,转码后为:
二、采用python中的requests库实现Windows身份认证登录
首先安装requests库,requests_ntlm库
pip install requests
pip install requests_ntlm
Windows身份登录
import requests from requests_ntlm import HttpNtlmAuth requests.get("http://xxx.com",auth=HttpNtlmAuth('domain\\username','pwd'))
举个例子:
登录成功,并且可以得到header请求头,sessionid等等一些信息