2013-05-16 325 views
3

我有一臺Chrome擴展程序,用於在凌晨凌晨在網站上運行一些批量作業。在Chrome中調用此URL並完成所有必要的工作時,我已經有了一個內容腳本來運行。我現在遇到了一個問題,找出將此字符串串入調度程序的最佳方法,以便在凌晨3點在Chrome選項卡中自動打開此URL。我在專用的Azure虛擬機中運行所有這些代碼,以便在腳本設置爲運行時不會有任何用戶登錄。當新選項卡結束時它會自動關閉,這個我已經處理完畢。使用Chrome擴展程序在特定時間打開網址

到目前爲止,我已經嘗試使用Windows任務計劃程序以URL作爲參數傳遞來打開Chrome。然而這種方法證明是有點不可靠的!

如果我讓Chrome在虛擬機上保持打開狀態,是否有任何本機Chrome API可用於在特定時間使用URL打開選項卡?我也在一個單獨的頁面中使用了下面的JavaScript函數來觸發URL打開,但是我沒有任何機制來測試它是否已經在另一個選項卡中運行,所以這段代碼會導致打開無數的新選項卡,除非它可能是用於檢查URL是否已經打開,我認爲這將超出Javascript的範圍。

var myUrlToCall = "http://www.myspecialurl.com/runme.html"; 

//IS 3 AM YET? 
function runTimer() { 
    setTimeout(function() { 
     var dtNow = new Date(); 
     var hoursNow = dtNow.getHours() * 1; 
     if (hoursNow >= 3) { 
      //Open new window here (but how can I know if it's already open?) 
      window.open(myUrlToCall); 
     } else { 
      runTimer(); 
     } 
    }, 3000); 
} 

對此的任何想法將不勝感激。

+0

您應該在這裏使用'setInterval'而不是'setTimeout',這非常簡單。但它不會解決你的問題。 –

+0

謝謝@Riateche,我認爲它應該使代碼更清潔。我會看看這個。 – QFDev

+0

爲什麼你使用chrome而不是wget或curl來做這件事? – rsanchez

回答

4

chrome.alarms API是一個完美的適合您的使用情況,在event page使用。

function createAlarm() { 
    var now = new Date(); 
    var day = now.getDate(); 
    if (now.getHours() >= 3) { 
     // 3 AM already passed 
     day += 1; 
    } 
    // '+' casts the date to a number, like [object Date].getTime(); 
    var timestamp = +new Date(now.getFullYear(), now.getMonth(), day, 3, 0, 0, 0); 
    //      YYYY    MM    DD HH MM SS MS 

    // Create 
    chrome.alarms.create('3AMyet', { 
     when: timestamp 
    }); 
} 

// Listen 
chrome.alarms.onAlarm.addListener(function(alarm) { 
    if (alarm.name === '3AMyet') { 
     // Whatever you want 
    } 
}); 
createAlarm(); 

關於創建標籤:該chrome.tabs.query方法可用於檢查標籤的存在,並在必要時打開一個新的。如果需要,我假設你想要集中現有的選項卡:

var url = '...'; 
chrome.tabs.query({ 
    url: url 
}, function(tabs) { 
    if (tabs.length === 0) { 
     chrome.tabs.create({ url:url, active: true }); 
    } else { 
     // Focus first match 
     chrome.tabs.update(tabs[0].id, { active: true }); 
    } 
}); 
+0

非常感謝! chrome.alarms方法看起來很有前途。我目前正在通過chrome.tabs.query方法來遍歷選項卡(在background.js中)並向內容腳本發送響應。我在想但是chrome.tabs.query無法發送迴應?也就是說,你提到的創建或更新的方法可能會更好!這已經完成了我的大部分難題,再次感謝! – QFDev

+1

現在需要稍作修改now.getYear()產生113,應該是now.getFullYear()。隨着時代的到來,這是一個巨大的負數,這導致了警報開火。 – QFDev

相關問題