2016-05-31 158 views
1

我基本上想通過使用Chrome擴展來自動化網站。但是這個網站有非常多的客戶端代碼,所以很難找出我需要做出哪些請求來獲取所需的信息。Chrome擴展中的隱形標籤

我能想到的最簡單的方法是使用一個內容腳本的輸入元素(在這種情況下使用jQuery)來輸入文字,然後點擊按鈕,像這樣:

$.ready(function(){ 
    $("#input").val("foo"); 
    $("#submit").click(); 
}); 

神似這個問題:Injecting input into a tab opened by a Chrome Extension,但與該網站的互動不應該是可見的。

因此:我可以從擴展程序中打開Chrome瀏覽器中的頁面嗎?對用戶不可見並使用它們與網站進行交互?

回答

6

如果您希望頁面完全不可見,我相信唯一的選擇是將其加載到背景頁面的iframe中。然後,您可以使用內容腳本訪問iframe中的頁面,就像訪問任何正常的可見頁面一樣。

由於許多網站使用X-Frame-Options標頭限制嵌入,因此在將頁面加載到iframe之前,您可能必須使用webRequest API刪除該標頭。有些頁面還使用其他技術來防止嵌入,這可能會使這一過程複雜化。

示例代碼:

的manifest.json

{ 
    "manifest_version": 2, 
    "name": "Hidden page in background", 
    "description": "Interact with a hidden page in background", 
    "version": "1.0", 

    "background": { 
    "page": "background.html", 
    "persistent": true 
    }, 
    "content_scripts": [ 
    { 
     "matches": ["*://*.google.fr/*"], 
     "js": ["contentscript.js"], 
     "all_frames": true 
    } 
    ], 
    "permissions": ["*://*.google.fr/*", "webRequest", "webRequestBlocking"] 
} 

background.html

<!DOCTYPE html> 
<html> 
    <head> 
    <script src="background.js"></script> 
    </head> 
    <body> 
    <iframe id="iframe1" width="1000 px" height="600 px" src="http://www.google.fr"></iframe> 
    </body> 
</html> 

background.js

// This is to remove X-Frame-Options header, if present 
chrome.webRequest.onHeadersReceived.addListener(
    function(info) { 
     var headers = info.responseHeaders; 
     var index = headers.findIndex(x=>x.name.toLowerCase() == "x-frame-options"); 
     if (index !=-1) { 
     headers.splice(index, 1); 
     } 
     return {responseHeaders: headers}; 
    }, 
    { 
     urls: ['*://*.google.fr/*'], // 
     types: ['sub_frame'] 
    }, 
    ['blocking', 'responseHeaders'] 
); 

content_script.js

var elementToInsert = document.createElement("h1"); 
elementToInsert.textContent = "This text comes from my content script."; 
document.body.insertBefore(elementToInsert, document.body.firstChild); 

夫婦的注意事項:

  • 去除的X-Frame-Options標題不限於此處的背景頁面。這將允許將相關頁面嵌入到任何其他頁面上的iframe中。不幸的是,Chrome似乎不支持ALLOW-FROM uri值,該值只能用於限制您的擴展程序的嵌入。
  • 內容腳本正在被注入到所有頁面。您可以通過編程方式將其注入到背景頁面上的iframe,但這會變得更加複雜。
  • 我以www.google.fr爲例,因爲它使用X-Frame-Options,但不使用任何其他技術來防止嵌入。我使用了法國域名,因爲google.com傾向於自動重定向到本地國家/地區級域名。
+0

這正是我所期待的。在我的情況下,我意外地甚至不需要刪除X-Frame-Options標頭。 – Pete

0

請參閱tabs.create,您可以調用下面的代碼創建一個不可見的選項卡(不活動)。

chrome.tabs.create({ url: 'https://www.google.com', active: false, }); 
+0

這仍然是一個可見的選項卡。 – Pete

+0

我想要做的事通常可以用無頭瀏覽器完成,但不能用於擴展程序。 – Pete