有個公司內網,登入帳密後可取得json資料。
我可以正常從瀏覽器登入。
但我想要藉由Python自動化擷取。
可是一直過不了登入的需求。
它是跳出像下圖的登入訊息視窗。
我開F12看不到element,沒辦法用selenium find_element來操作。
網路找了很多參考範例,但都未解。
import requests
from requests.auth import HTTPBasicAuth
url = 'https://xxx.xxx.xxx'
response = requests.get(url, auth=HTTPBasicAuth(username, password))
if response.status_code == 200:
data = response.json()
print(data)
else:
print(f"Request failed {response.status_code}: {response.text}")
import requests
url = 'https://xxx.xxx.xxx'
data = {
'username': username,
'password': password
}
response = requests.post(url, data=data)
import requests
url = 'https://xxx.xxx.xxx'
response = requests.get(url, auth=(username, password))
if response.status_code == 200:
print(response.text)
else:
print(f"Authentication failed: {response.status_code}")
有點亂槍打鳥的嘗試...
再請邦友們協助解惑指點
非常感謝
底下的範例需要先安裝 pywin32 及 pyautogui 這兩個模組
pip install pywin32
pip install pyautogui
然後在同一個資料夾裡面新建兩個文件,分別是:
WindowMgr.py 內容
import win32gui, win32com.client, win32con, winxpgui, win32api, ctypes
from re import match
class WindowMgr:
def __init__ (self):
self._handle = None
self.is_exist = False
"""Pass to win32gui.EnumWindows() to check all the opened windows"""
def _window_enum_callback(self, hwnd, wildcard):
if match(".*"+wildcard+"*", str(win32gui.GetWindowText(hwnd))) is not None:
self._handle = hwnd
self.is_exist = True
""" 找到標題內含wildcard字串的視窗 """
def find_window_wildcard(self, wildcard):
self._handle = None
self.is_exist = False
win32gui.EnumWindows(self._window_enum_callback, wildcard)
""" 將目標視窗設為前景 """
def set_foreground(self):
win32gui.SetForegroundWindow(self._handle)
""" 執行 find_window_wildcard ()後要找另一個目標視窗前,需先執行 reset() """
def reset(self):
shell = win32com.client.Dispatch("WScript.Shell")
shell.SendKeys('%')
run.py 內容
from WindowMgr import WindowMgr
import pyautogui as p
uname = 'username'
passwd = 'password'
win = WindowMgr()
win.find_window_wildcard("Windows 安全性")
win.set_foreground() # 把目標視窗設為前景
p.write(uname)
p.sleep(0.5)
p.press('tab')
p.sleep(0.5)
p.write(passwd)
p.sleep(0.5)
p.press('enter')
# 與pyautogui相關資訊可以查詢
# https://pyautogui.readthedocs.io/en/latest/keyboard.html
p.sleep(5)
win.reset()
win.find_window_wildcard("原本EDGE的title部份文字")
win.set_foreground() # 把目標視窗設為前景
#然後再用 pyautogui 操作 json 存取的部份
WindowMgr.py 無需改動。(用於切換目標視窗)
需要適當修改 run.py 內容,使用了 pyautogui 操作鍵盤滑鼠輸入,
簡單測試就是先開啟EDGE,然後進到你截圖那個登入頁面,然後進檔案總管或是用cmd執行 run.py
它會把視窗焦點切到 'Windows 安全性' 這個視窗(假設滑鼠遊標在username欄),然後輸入 username,然後再按一下tab,把滑鼠遊標轉移到password欄,然後輸入password,再按下Enter,進行登入(這裡程式會暫停5秒),然後把視窗焦點切到'原本EDGE的title部份文字' 這個視窗,
再來就要看你那個 json 資料怎麼下載,如果是有個下載連結的,可以用 pyautogui 移到上面按右鍵另存或直接點擊之類的,要依照實際情況作處理... 這是用 pyautogui 的作法,提供您參考。
上列的代碼沒有實際測試,理論上是可行的,祝好運^^"
如果你想使用Python的Requests庫來進行HTTP登錄,並使用Windows身份驗證而不是基本身份驗證,你可以使用requests_ntlm
庫。這個庫可以幫助你進行NTLM身份驗證,這是一種常見的Windows身份驗證方法。
首先使用pip安裝requests_ntlm
庫:
pip install requests-ntlm
然後,你可以使用以下示例代碼來進行HTTP登錄:
import requests
from requests_ntlm import HttpNtlmAuth
session = requests.Session()
session.auth = HttpNtlmAuth('domain\\username','password')
response = session.get('https://xxx.xxx.xxx')
data = response.json()
print(data)
資料來自 ChatGPT