最近在搞單位的項目,實現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等等一些信息