PythonスクリプトでWindowsで現在アクティブなGoogleChromeタブのURLを取得するにはどうすればよいですか?これはユーザーの邪魔をせずに行う必要があるため、コピー/貼り付けにキーストロークを送信することはできません。
3 に答える
まず、pywin32をダウンロードしてインストールする必要があります。これらのモジュールをスクリプトにインポートします。
import win32gui
import win32con
Google Chromeが現在アクティブなウィンドウである場合は、最初に次の方法でウィンドウハンドルを取得します。
hwnd = win32gui.GetForegroundWindow()
(それ以外の場合は、を使用してGoogle Chromeウィンドウハンドルを見つけwin32gui.FindWindow
ます。WindowsDetectiveは、ウィンドウのクラス名を見つけるときに便利です。)
URLを取得する唯一の方法は、「オムニボックス」(アドレスバー)のテキストを取得することだと思われます。これは通常、タブのURLですが、ユーザーが現在入力しているURLの一部または検索文字列の場合もあります。
また、オムニボックスのURLには、ユーザーが明示的に入力しない限り(まだEnterキーを押さない限り)、「http://」プレフィックスは含まれませんが、実際には「https://」または「ftp:」が含まれます。 //"これらのプロトコルが使用されている場合。
したがって、現在のChromeウィンドウ内にオムニボックスの子ウィンドウがあります。
omniboxHwnd = win32gui.FindWindowEx(hwnd, 0, 'Chrome_OmniboxView', None)
もちろん、Google Chromeチームがウィンドウクラスの名前を変更することを決定した場合、これは機能しなくなります。
そして、オムニボックスの「ウィンドウテキスト」を取得しますが、これはwin32gui.GetWindowText
私にはうまくいかないようです。うまくいく代替手段があるのは良いことです:
def getWindowText(hwnd):
buf_size = 1 + win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0)
buf = win32gui.PyMakeBuffer(buf_size)
win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, buf_size, buf)
return str(buf)
この小さな関数は、WM_GETTEXTメッセージをウィンドウに送信し、ウィンドウのテキスト(この場合はオムニボックス内のテキスト)を返します。
どうぞ!
Chromeの内部構造が完全に変更され、win32guiを使用してChromeウィンドウの要素に実際にアクセスできなくなったため、Christianの回答は機能しませんでした。
私が見つけた唯一の可能な方法は、UIオートメーションAPIを使用することでした。これには、いくつかの使用例を含むこのPythonラッパーがあります。
これを実行して、アドレスを取得するChromeウィンドウに切り替えます。
from time import sleep
import uiautomation as automation
if __name__ == '__main__':
sleep(3)
control = automation.GetFocusedControl()
controlList = []
while control:
controlList.insert(0, control)
control = control.GetParentControl()
if len(controlList) == 1:
control = controlList[0]
else:
control = controlList[1]
address_control = automation.FindControl(control, lambda c, d: isinstance(c, automation.EditControl) and "Address and search bar" in c.Name)
print address_control.CurrentValue()
私はStackOverFlowにまったく慣れていないので、コメントの調子が悪い場合はお詫びします。
見た後:
- セレン、
- chrome://Historyを直接起動します。
- キーボードエミュレーションの実行:Pywinautoでコピー/貼り付け、
- DevToolの[ネットワーク]タブに従って、SOCK_RAW接続を使用してヘッダーをキャプチャしようとしています(これは非常に興味深いものでした)。
- オムニバス/searchBarウィンドウ要素のテキストを取得しようとしていますが、
- 履歴テーブルを読み取るためにChromeを閉じて再度開く、...。
ウィンドウのタイトル(hwnd + win32を使用して取得)が「my」にない場合、履歴ファイル自体(\ AppData \ Local \ Google \ Chrome \ User Data \ Default \ History)をアプリケーションフォルダーにコピーして貼り付けることになりました。 "urlsテーブル。これは、sqlite dbがロックされていて、ユーザーエクスペリエンスに干渉しない場合でも実行できます。
必要な非常に基本的なソリューション:sqlite3、psutil、win32gui。お役に立てば幸いです。