0

我想在 Google Chrome 运行时收集一些信息。目前我正在使用一些applescript(https://gist.github.com/jcla1/6525572)来做这件事,但我想用C或Go重写它。

有谁知道一个 API Chrome 暴露来收集如下信息:

  • # 打开标签
  • 当前活动网址

到目前为止,我只发现我可以使用CGWindowListCopyWindowInfo(Carbon) 获取当前选项卡的标题,它运行良好,但显然不提供 URL(而不是 # open tabs 等)。

理想情况下,Chrome 应该有一个事件架构,我可以挂钩并接收与输入新 URL 相关的所有事件。

PS 只需要在 OSX 上工作!

4

1 回答 1

3

我已经编写了 Go 程序来使用远程调试协议远程控制/检查 chrome。它的工作方式是您首先从特定 url 获取 JSON 数据,然后它会提供打开的选项卡和基本信息,例如选项卡的当前 url。然后,您可以使用 JSON 对象中的 websocket 链接来控制/检查各个选项卡。

由于您只需要基本信息,因此您可以忽略大部分调试 api,只需下载 JSON 索引即可。首先,使用chrome --remote-debugging-port=9222. 请注意,所有 chrome 窗口都需要关闭才能正常工作。您也可以使用--user-data-dir=<some dir>新的配置文件启动,这样您就可以打开其他 chrome 窗口。

一旦你打开了端口,获取数据就很容易了。只需转到http://localhost:9222/json并解组数据。这是我使用的代码:

type Tab struct {
    Description          string `json:"description"`
    DevtoolsFrontendUrl  string `json:"devtoolsFrontendUrl"`
    FaviconUrl           string `json:"faviconUrl"`
    Id                   string `json:"id"`
    ThumbnailUrl         string `json:"thumbnailUrl"`
    Title                string `json:"title"`
    Type                 string `json:"type"`
    Url                  string `json:"url"`
    WebSocketDebuggerUrl string `json:"webSocketDebuggerUrl"`
}

func GetTabs() ([]Tab, error) {
    resp, err := http.Get("http://localhost:9222/json")
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    var tabs []Tab
    err = json.NewDecoder(resp.Body).Decode(&tabs)
    if err != nil {
        return nil, err
    }

    return tabs, nil
}

您可以在此处获得更多信息。


不幸的是,当使用此 API 打开新选项卡时,无法接收事件。但是,当您通过 websockets 连接到的选项卡发生任何变化时,您都会收到通知。如果你愿意发疯,你可以构建一个扩展来监控新标签和加载的 url 等变化。

于 2013-11-02T17:44:16.340 回答