Я бегу 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 ()
blockquote>
CurrentTab = jdata.get("windows")[0].get("tabs")[jdata["windows"][0]["selected"]-1].get("entries")[HistLen-1].get("url")
в то время как
HistLen = len(jdata.get("windows")[0].get("tabs")[jdata["windows"][0]["selected"]-1].get("entries"))
HistLen
было необходимо, потому что иначе я всегда получал более старую страницу, которую ранее открывал на этой вкладке.Спасибо за чтение
Решение было предоставлено здесь, который является комбинацией 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, необходимо ожидать некоторая секунда.
В первой части это ищет идентификатор активной вкладки, это - что-то между 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".
Я тоже думал об этой проблеме и, наконец, пришел к решению, вдохновленный этой сутью . Я тщательно осмотрел объекты и, к сожалению, не нашел ни одного атрибута, назначающего вкладку активной.
Вместо этого я обнаружил, что вкладки имеют ключ 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)