从命令行打开 Chrome/Chromium 并将 javascript 操作发送到 chrome/chromium 控制台

Open Chrome/Chromium from command line and send javascript action to chrome/chromium console

Ubuntu 18.04,我正在尝试创建一个提醒来记住我每天跟踪我的工作日志。

创建sh文件put_hours.sh

#!/bin/bash

zenity \
    --forms \
    --title="TIME TRACKING" \
    --text="Please track your time" \
    --add-entry="¿ What have you done ?" \
    --ok-label "GO"

case $? in
    0) chromium-browser http://site/that/I/want/to/open
    ;;
    1)
   ;;
esac

使其可执行

chmod +x put_hours.sh

运行这

./put_hours.sh

如您所见,这是可行的,但我的问题是:

如何在打开的 url 中向 chrome/chromium 控制台发送 javascript 命令?

我需要 运行 一个简单的命令,例如:

document.getElementById("my_id").value = 'nothing to do'

作为字符串发送的值'nothing to do'应该是window打开的值禅意。

我使用 Zenity 来制作 window 但我并不是被迫使用这个软件。

首先,获取值

Zenity 将在您单击 GO 后将用户输入的小时数打印到标准输出。

第一步是修改脚本以捕获结果并将其分配给变量:

hours=$(zenity \
    --forms \
    --title="TIME TRACKING" \
    --text="Please track your time" \
    --add-entry="¿ What have you done ?" \
    --ok-label "GO")

选项

您接下来可以做什么取决于您对网站的访问和控制类型。有些选项是 hack。

对于以下每个选项,将 $hours 变量作为查询参数传递给网站,例如:

case $? in
    0) chromium-browser "http://site/that/I/want/to/open?hours=$hours"

选项 A - 网站支持通过查询参数填充字段

你可能会走运,上面的方法就可以了。如果它首先不起作用,你可能有错误的查询参数名称。

要确定正确的查询参数名称是什么,请检查源代码以及它在您手动提交表单时的行为方式。

例如https://www.google.com?q=pre+populate+the+search+bar

选项 B - 编写用户脚本以在浏览器中执行此操作

使用 Tamper Monkey 工具在页面加载时 运行 用户脚本,提取查询参数并设置字段。

// ==UserScript==
// @name         Set Hours
// @match        http://site/that/I/want/to/open*
// ==/UserScript==
(function() {
    var urlParams = new URLSearchParams(window.location.search); // Reference: 

    if (urlParams.has('hours')) {
        var hours = urlParams.get('hours');

        document.getElementById("my_id").value = hours;

        alert('well done ad3luc you did ' + hours + ' hours today');
    }
})();

缺点当然是现在逻辑在两个地方,你的脚本和你的浏览器。

这是一个 hack,但我确实喜欢关注点分离。该脚本将值发送到网站。网站,设置字段值。

您还需要确保您选择的参数不会与站点使用的任何现有查询参数冲突。

选项 C - 修改网站

更改网站的源代码,使其支持选项 A。