10

早朝にサイトでいくつかのバッチ ジョブを実行するために使用している Chrome 拡張機能があります。この URL が Chrome で呼び出されたときに実行するコンテンツ スクリプトが既に用意されており、必要なすべてのジョブを完了します。これをスケジューラーにストリングする最良の方法を見つけるのに問題があり、この URL が午前 3:00 に Chrome タブで自動的に開かれます。このコードはすべて専用の Azure 仮想マシンで実行しているため、スクリプトの実行が設定されているときにユーザーがログインすることはありません。新しいタブの作業が完了すると、自動的に閉じます。これは既に処理済みです。

これまでのところ、Windows タスク スケジューラを使用して、引数として渡された URL を使用して Chrome を開く実験を行ってきました。ただし、この方法は信頼性が低いことがわかっています。

仮想マシンで Chrome を開いたままにしておく場合、特定の時間に URL でタブを開くために使用できるネイティブ Chrome API はありますか? また、別のページで次の 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);
}

これについての考えは大歓迎です。

4

1 に答える 1

12

このAPI は、イベント ページchrome.alarmsで使用するユース ケースに最適です。

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 });
    }
});
于 2013-05-16T10:33:51.743 に答える