2013-11-02 58 views
0

我想在谷歌浏览器运行时收集一些信息。目前我正在使用一些applescript(https://gist.github.com/jcla1/6525572),但我想用C或Go重写。从C/Go的谷歌浏览器获取标签信息

有谁知道一个API的Chrome公开收集信息等的:

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

到目前为止,我才发现原来我可以得到当前标签的标题使用CGWindowListCopyWindowInfo(Carbon),它运行良好,但显然不提供URL(而不是#打开标签等)。

理想情况下,Chrome将拥有一个事件架构,我可以将其插入并接收所有要输入新URL的事件。

P.S.只需要在OSX上工作!

回答

3

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

由于您只需要基本信息,因此您可以忽略大部分调试API并仅下载JSON索引。首先,使用chrome --remote-debugging-port=9222开始镀铬。请注意,所有的铬窗口都需要关闭才能工作。您也可以使用--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 
} 

您可以获得更多信息here


不幸的是,当使用此API打开新选项卡时,无法接收事件。但是,当您使用websockets连接到的选项卡以任何方式发生更改时,您都会收到通知。如果您愿意发疯,您可以构建一个扩展程序来监视更改,例如新标签页和加载的网址。

+0

要尽量避免轮询,但正如您所指出的,另一种选择是编写一个用于监视事件的chrome ext,因此我现在就来看看。谢谢! –