我正在运行 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]["selected"]-1].get("entries")[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 列表(所有打开的选项卡)并将其提供stdin
给sed
:
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...
)来过滤出您需要的部分。