通过命令行从 Firefox 获取当前活动选项卡的 URL

通过命令行从 Firefox 获取当前活动选项卡的 URL

我正在运行 Mozilla Firefox 54.0。

给定一个已打开的 Firefox 会话和多个打开的选项卡,是否有办法通过命令行提取当前活动选项卡(我正在查看的选项卡)?

我找不到任何东西命令行参数列表Mozilla 开发者页面

我的问题不同于这个问题,因为它既不能按照我预期的方式工作,我也不想要所有的选项卡;我想要一个特定的选项卡,即我正在查看的选项卡。

有人有想法吗?

有没有办法与正在运行的 Firefox 实例进行交互?

谢谢阅读

编辑:解决方案:

import json

f= open('~/.mozilla/firefox/RANDOM.default/sessionstore-backups/recovery.js' )

jdata = json.loads(f.read())

f.close()

CurrentTab = jdata.get("windows")[0].get("tabs")[jdata["windows"][0]["sel‌​ected"]-1].get("entr‌​ies")[HistLen-1].get‌​("url")

 while

HistLen = len(jdata.get("windows")[0].get("tabs")[jdata["windows"][0][‌​"selected"]-1].get("‌​entries"))

HistLen是必要的,因为否则我总是会在该选项卡中得到一些我之前打开过的旧页面。

谢谢阅读

答案1

已提供解决方案这里sed这是和的组合python2。下面是更清晰一些的版本:

sed -n "$(
python2 <<< $'import json
f = open("/home/username/.mozilla/firefox/RANDOM.default/sessionstore-backups/recovery.js", "r")
jdata = json.loads(f.read())
f.close()
print str(jdata["windows"][0]["selected"])')p" <(python2 <<< $'import json
f = open("/home/username/.mozilla/firefox/RANDOM.default/sessionstore-backups/recovery.js", "r")
jdata = json.loads(f.read())
f.close()
for win in jdata.get("windows"):
 for tab in win.get("tabs"):
  i = tab.get("index") - 1
  print tab.get("entries")[i].get("url")'
)

其使用的文件是:

/home/username/.mozilla/firefox/RANDOM.profile/sessionstore.js

在较新的版本中你应该将其更改为:

/home/username/.mozilla/firefox/RANDOM.default/sessionstore-backups/recovery.js

笔记该文件每 15 秒重新生成一次,因此窗口立即更改后它不会给您正确的 URL,您必须等待几秒钟。


这是如何运作的?

第一部分,它查找活动选项卡的 id,它是 1 到打开的选项卡数之间的某个值。假设它是“3”,那么对应于此目的的代码是:

str(jdata["windows"][0]["selected"])

接下来它返回一个 URL 列表(所有打开的选项卡)并将其提供stdinsed

for win in jdata.get("windows"):
 for tab in win.get("tabs"):
  i = tab.get("index") - 1
  print tab.get("entries")[i].get("url")

因此,我们正在做类似的事情:

sed -n 3p <<< "URL1
URL2
URL3"

这将带我们进入“URL3”。

答案2

我也想过这个问题,最后找到了解决办法,灵感来自这个要点。我彻底检查了这些对象,但不幸的是,我没有发现任何将选项卡指定为活动选项卡的属性。

我发现标签有一个lastAccessed键,从那里我计算出了最新的标签。

import json
import lz4.block
import pathlib
from time import time

# Set up path and regex for files
path = pathlib.Path.home().joinpath('.mozilla/firefox')
# files = path.glob('*default*release*/sessionstore-backups/recovery.jsonlz4')
files = path.glob('5ov6afhq.default-release-1/sessionstore-backups/recovery'+
                  '.jsonlz4')

for f in files:
    # decompress if necessary
    b = f.read_bytes()
    if b[:8] == b'mozLz40\0':
        b = lz4.block.decompress(b[8:])

    # load as json
    j = json.loads(b)
    if 'windows' in j.keys():
        for w in j['windows']:

            # Variables for keeping track of most recent tab
            most_recent_tab_index = ''
            min_time = 1000

            # run through tabs
            for t in w['tabs']:
                # Firefox does not 0-index
                i = t['index'] - 1

                # Convert time to seconds
                access_time = int((int(time()*1000) - t['lastAccessed'])/600)

                if access_time < min_time:
                    most_recent_tab_index = t['entries'][i]['url']

            print("MOST RECENT TAB: ", most_recent_tab_index)

答案3

如果您使用基于 X11 的桌面,您可以尝试使用 xprop -id找到的窗口 ID xlsclients -l。它需要巧妙地使用grep(可能使用grep -B... -A...)来过滤出您需要的部分。

相关内容