Получить URL текущей активной вкладки из Firefox через командную строку

Я бегу 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")

в то время как

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

HistLen было необходимо, потому что иначе я всегда получал более старую страницу, которую ранее открывал на этой вкладке.

Спасибо за чтение

4
задан 28 June 2017 в 21:18

2 ответа

Решение было предоставлено здесь, который является комбинацией 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".

2
ответ дан 28 June 2017 в 21:18

Я тоже думал об этой проблеме и, наконец, пришел к решению, вдохновленный этой сутью . Я тщательно осмотрел объекты и, к сожалению, не нашел ни одного атрибута, назначающего вкладку активной.

Вместо этого я обнаружил, что вкладки имеют ключ 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)

2
ответ дан 16 January 2020 в 14:53

Другие вопросы по тегам:

Похожие вопросы: