Get the current or all Firefox tab urls in Bash

01-09-2014 | Remy van Elst


Table of Contents


This snippets gets the current firefox tab url or all the firefox tab url's. It uses the sessionstore.js file in your profile folder. That file is updated almost instantly, however it will not always be the correct url.

I use this to track my time on different websites over the day together with some other shell scripts.

Get all the open tabs:

python2 <<< $'import json\nf = open("/home/username/.mozilla/firefox/RANDOM.profile/sessionstore.js", "r")\njdata = json.loads(f.read())\nf.close()\nfor win in jdata.get("windows"):\n\tfor tab in win.get("tabs"):\n\t\ti = tab.get("index") - 1\n\t\tprint tab.get("entries")[i].get("url")'

Example output:

http://wiki.bash-hackers.org/commands/classictest http://monitoring.raymii.nl/nagios/ http://www.brendangregg.com/blog/2014-07-16/iosnoop-for-linux.html http://duplicity.nongnu.org/duplicity.1.html http://www.routeralley.com/guides.html http://www.hactrn.net/sra/vaxen.html http://duplicity.nongnu.org/duplicity.1.html http://tweakers.net/nieuws/list/20140902

Get the current active/open tab number:

python2 <<< $'import json\nf = open("/home/username/.mozilla/firefox/RANDOM.profile/sessionstore.js", "r")\njdata = json.loads(f.read())\nf.close()\nprint str(jdata["windows"][0]["selected"])'

Example output:

11

Printing that line number from all open tab url's gives you the current open tab. sed -n "3p" file prints line 3 from file. Combining the commands with bash expansion results in the following:

sed -n "$(python2 <<< $'import json\nf = open("/home/username/.mozilla/firefox/RANDOM.profile/sessionstore.js", "r")\njdata = json.loads(f.read())\nf.close()\nprint str(jdata["windows"][0]["selected"])')p" <(python2 <<< $'import json\nf = open("/home/username/.mozilla/firefox/RANDOM.profile/sessionstore.js", "r")\njdata = json.loads(f.read())\nf.close()\nfor win in jdata.get("windows"):\n\tfor tab in win.get("tabs"):\n\t\ti = tab.get("index") - 1\n\t\tprint tab.get("entries")[i].get("url")')

Output:

http://tweakers.net/nieuws/list/20140902

This can also be in your .bashrc file:

current_firefox_tab_number() {
    python2 <<< $'import json\nf = open("/home/username/.mozilla/firefox/RANDOM.profile/sessionstore.js", "r")\njdata = json.loads(f.read())\nf.close()\nprint str(jdata["windows"][0]["selected"])'
}

current_firefox_url() {
    sed -n "$(current_firefox_tab_number)p" <(python2 <<< $'import json\nf = open("/home/username/.mozilla/firefox/RANDOM.profile/sessionstore.js", "r")\njdata = json.loads(f.read())\nf.close()\nfor win in jdata.get("windows"):\n\tfor tab in win.get("tabs"):\n\t\ti = tab.get("index") - 1\n\t\tprint tab.get("entries")[i].get("url")')
}

Example:

$ current_firefox_tab_number 
11

$ current_firefox_url 
http://tweakers.net/nieuws/list/20140902

Tags: bash, firefox, python, sessionstore,