12

PythonスクリプトでWindowsで現在アクティブなGoogleChromeタブのURLを取得するにはどうすればよいですか?これはユーザーの邪魔をせずに行う必要があるため、コピー/貼り付けにキーストロークを送信することはできません。

4

3 に答える 3

18

まず、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メッセージをウィンドウに送信し、ウィンドウのテキスト(この場合はオムニボックス内のテキスト)を返します。

どうぞ!

于 2012-07-25T07:56:55.647 に答える
4

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()
于 2017-06-04T09:06:20.343 に答える
0

私は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。お役に立てば幸いです。

于 2019-09-12T22:15:28.447 に答える