2013-11-02 106 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,因此我現在就來看看。謝謝! –