使用Chrome扩展程序在特定时间打开URL

QFD*_*Dev 5 javascript scheduled-tasks google-chrome-extension

我有一个Chrome扩展程序,可以在清晨使用该扩展程序在网站上运行一些批处理作业。在Chrome中调用该URL并完成所有必要的工作时,我已经准备好运行内容脚本。我现在遇到一个问题,想出了将其字符串发送到调度程序的最佳方法,以便于凌晨3:00在Chrome标签中自动打开此URL。我正在专用的Azure虚拟机中运行所有这些代码,因此在将脚本设置为运行时不会有任何用户登录。新标签页完成后,它将自动关闭,这已经由我完成了。

到目前为止,我已经尝试过使用Windows Task Scheduler通过将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);
}
Run Code Online (Sandbox Code Playgroud)

任何对此的想法将不胜感激。

Rob*_*b W 6

chrome.alarmsAPI非常适合您的用例,可以在事件页面上使用

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();
Run Code Online (Sandbox Code Playgroud)

关于创建选项卡:该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 });
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 很棒的解决方案。但6年后还有更新吗?或者说它仍然是最好的选择 (2认同)