Python 如何在Windows中获取活动Google Chrome选项卡的URL?

Python 如何在Windows中获取活动Google Chrome选项卡的URL?,python,winapi,google-chrome,Python,Winapi,Google Chrome,我的Python脚本如何在Windows中获取当前活动的Google Chrome选项卡的URL?必须在不中断用户的情况下完成此操作,因此发送按键以复制/粘贴不是一个选项。首先,您需要下载并安装。在脚本中导入以下模块: import win32gui import win32con 如果Google Chrome是当前活动窗口,首先通过以下方式获取窗口句柄: hwnd = win32gui.GetForegroundWindow() (否则,在查找windows的类名时,可以使用.来查找Go

我的Python脚本如何在Windows中获取当前活动的Google Chrome选项卡的URL?必须在不中断用户的情况下完成此操作,因此发送按键以复制/粘贴不是一个选项。

首先,您需要下载并安装。在脚本中导入以下模块:

import win32gui
import win32con
如果Google Chrome是当前活动窗口,首先通过以下方式获取窗口句柄:

hwnd = win32gui.GetForegroundWindow()
(否则,在查找windows的类名时,可以使用.来查找Google Chrome窗口句柄。)

似乎获取URL的唯一方法是获取URL中的文本。这通常是选项卡的URL,但也可以是用户当前键入的任何部分URL或搜索字符串

此外,omnibox中的URL不会包含“http://”前缀,除非用户已明确键入它(并且尚未按下enter键),但如果使用这些协议,它实际上会包含“https://”或“ftp://”

因此,我们在当前Chrome窗口中找到omnibox子窗口:

omniboxHwnd = win32gui.FindWindowEx(hwnd, 0, 'Chrome_OmniboxView', None)
如果Google Chrome团队决定重命名他们的窗口类,这当然会中断

然后我们得到omnibox的“窗口文本”,这似乎对我不起作用。好事情是有一个替代方案确实有效:

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)
这个小函数将消息发送到窗口并返回窗口文本(在本例中为omnibox中的文本)


好了

Christian的回答对我来说不起作用,因为Chrome的内部结构完全改变了,你不能再使用win32gui访问Chrome窗口的元素了

我找到的唯一可能的方法是通过UI自动化API,它有一些使用示例

运行此命令并切换到要从中获取地址的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复制/粘贴
  • 尝试使用SOCK_RAW connections根据DevTool的Network选项卡捕获报头(这一个非常有趣)
  • 试图获取综合/搜索栏窗口元素的文本
  • 关闭并重新打开chrome以读取历史记录表,
“我的”URL表中缺少窗口标题(使用hwnd+win32检索)时,导致将历史文件本身(\AppData\Local\Google\Chrome\User Data\Default\History)复制/粘贴到我的应用程序文件夹中。 即使sqlite db被锁定并且不干扰用户体验,也可以这样做

非常基本的解决方案,需要:sqlite3、psutil、win32gui。
希望能有所帮助。

你能澄清这样的“棘手”问题吗:当某个“恶棍应用”(python脚本、WindowDetective等)试图从“受害者应用”(Chrome,IE,“某些偏执狂应用”)读取任何数据(hwnd、class、text、smth.else)时,“受害者”是否可能可以感觉/看到/检查ih是否已被扫描?这是否仅适用于Windows平台或此库跨平台工作?如果没有,是否有适用于Mac OS的等效库。这是否回答了您的问题?