Stylish is a easy browser extension/plugin for users to customizing the web page styling using CSS/3. It is available in Google Chrome, Firefox, Safari, Opera, and many Chromium-based browsers and really easy to hide the annoying ads out of sight.(different from ad-blocker). but the most abominable is that it doesn't provide a export/import feature.html
The Stylish extension for Google Chrome or Chromium-based browsers lacks export/import feature. This article is to introduce a way to extract the saved styles in Stylish as Json to a file for backing up.web
The Stylish extension located at Library/Application Support/Google/Chrome/Default/Extensions/fjnbnpbmkenffdnngjfgmeleoegfcffe.sql
The files for storage of the saved styles are JS files. The storage-websql.js
file is a controller to store the styles into SQLite3 database file using Javascript and WebSQL tech. The storage.js
is to store the data using local storage IndexedDB.chrome
The CSS code, name and url submitted are processed and stored to database named stylish. [ the mapping of dbname and the data file is specified in the Databases.db in Default/databases/. Databases.db is a SQLite3 db file.]. The data file is in the folder databases/chrome-extension_fjnbnpbmkenffdnngjfgmeleoegfcffe_0
as specified in field origin. And the data file is named a number as specified by id in table Databases, which stores all the databases mapping used by JS.bash
➜ databases sqlite3 Databases.db SQLite version 3.7.17 2013-05-20 00:56:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .tables Databases meta sqlite> .explain sqlite> select * from Databases; id origin name desc esti ---- ------------- ---- ---- ---- 1 chrome-extension_fjnbnpbmkenffdnngjfgmeleoegfcffe_0 stylish Stylish Styles 5242880 4 chrome-extension_dhdgffkkebhmkfjojejmpbldmpobfkfo_0 tmStorage TM Storage 31457280 10 https_passport.weibo.com_0 ufp 1024 11 https_bbs.fudan.edu.cn_0 PersistJS Test Persistent database test. 204800 12 https_bbs.fudan.edu.cn_0 https___bbs_fudan_edu_cn_bbs Persistent storage for https___bbs_fudan_edu_cn_bbs 204800
The databases/chrome-extension_fjnbnpbmkenffdnngjfgmeleoegfcffe_0/1 is a SQLite3 db file, which, in my case, contains nothing. So the data is not saved in this db file.app
Another location for storage is Default/IndexedDB/, which also has a folder named chrome-extension_fjnbnpbmkenffdnngjfgmeleoegfcffe_0dom
While all the data, the styles user saved, are in this file, but it's encrypted. If you open it using Sublime Text 3, it may looks like:ide
So I checked the parser, storage.js
and found something useful.ui
getDatabase
uses var dbOpenRequest = window.indexedDB.open("stylish", 2)
to get the db object.e.target.result
to callback functiongetStyles
, getDatabase
def is called.db.transaction(["styles"], "readonly")
then tx.objectStore("styles")
is the data.var db, dbOpenRequest = window.indexedDB.open("stylish", 3); // change to 2 if 3 failed dbOpenRequest.onsuccess = function(e) { db = e.target.result; }; var tx = db.transaction(["styles"], "readwrite"); var os = tx.objectStore("styles"); var all = []; os.openCursor().onsuccess = function(event) { var cursor = event.target.result; if (cursor) { var s = cursor.value s.id = cursor.key all.push(cursor.value); cursor.continue(); } };
And thenthis
for(var i=0;i< all.length;i++){ var cur = all[i]; console.log(JSON.parse()cur.name,cur.sections[0].code,cur.sections[0].domains,cur.sections[0].regexps,cur.sections[0].urlPrefixes,cur.sections[0].urls) } // or console.log(JSON.stringify(all)); // This is better
The result,
[ The name is the description of a style, all the properties of sections are the CSS code and the rules you specified ]
[ { "originalMd5": "", "updateUrl": "", "enabled": true, "name": "有道詞典", "id": 2, "md5Url": "", "sections": [ { "regexps": [ ".*youdao\\.com.*" ], "urlPrefixes": [], "urls": [], "domains": [], "code": "#topImgAd,\n#Ads,\n#ads,\n#baidu-adv,\n#follow{\n display:none!important;\n float:none;\n }\n#results-contents{\n\twidth:inherit!important;\n}\n#results,\n#collinsResult .ol .collinsMajorTrans{\n\twidth:100%;\n float:none;\n}" } ], "url": "", "method": "saveStyle" }, { "originalMd5": "", "updateUrl": "", "enabled": true, "name": "cnet.com", "id": 3, "md5Url": "", "sections": [ { "regexps": [], "urlPrefixes": [], "urls": [], "domains": [ "cnet.com" ], "code": "#adunit,\n#videoPromo,\n#mpu-plus-top-5738382253301,\n#leader-top-5738382253301\n.ad-mpu-plus-top{\n display: none!important;\n}\n\niframe,\n.ad-leader-top>div, .ad-leader-top>iframe, .ad-leader-top>table, .ad-leader-plus-top>div, .ad-leader-plus-top>iframe, .ad-leader-plus-top>table, .ad-leader-middle>div, .ad-leader-middle>iframe, .ad-leader-middle>table, .ad-leader-middle2>div, .ad-leader-middle2>iframe, .ad-leader-middle2>table, .ad-leader-bottom>div, .ad-leader-bottom>iframe, .ad-leader-bottom>table, .ad-leader-inc>div, .ad-leader-inc>iframe, .ad-leader-inc>table{\n\tdisplay: none!important;\n}\n" } ], "url": "", "method": "saveStyle" }, { "originalMd5": "", "updateUrl": "", "enabled": true, "name": "滬江英語", "id": 4, "md5Url": "", "sections": [ { "regexps": [], "urlPrefixes": [], "urls": [], "domains": [ "hjenglish.com", "hujiang.com" ], "code": ".lamu_banner,\n.top_banner,\n.fix_questionnaire_btn,\n.animated,\n.bounceIn,\n.wx_entrance_box,\n.daily_tasks_list,\n.pass_add_ad1,\n.add_ban_y_sign,\n.bottomActive1212,\n.news_overly,\n.news_overly_c,\n.footer_go_top,\n#footer-ft,\n.sub-qr-box,\n.sub-qr-bubble-big,\n.header_board_tip,\n.header_board_tip2{\n display:none!important;\n}\n" } ], "url": "", "method": "saveStyle" }, { "originalMd5": "", "updateUrl": "", "enabled": true, "name": "今日頭條", "id": 5, "md5Url": "", "sections": [ { "regexps": [], "urlPrefixes": [], "urls": [], "domains": [ "toutiao.com" ], "code": "#pagelet-iad,\n#pagelet-hotpgc,\n#pagelet-hotgallery,\n#pagelet-hotvideo,\n#pagelet-tbad,\n.dtag,\n.hotgallery_show{\ndisplay:none!important;\n}" } ], "url": "", "method": "saveStyle" } ]
to back up the data regularly, just archive the folder chrome-extension_fjnbnpbmkenffdnngjfgmeleoegfcffe_0 under IndexedDB using 7z
or tar
and mv
it to iCloud or Dropbox/baiduyun/360yun ... to sync and cron
.
#!/bin/bash dest=$HOME"/YunPan/iMac 20160501/Google Chrome/Stylish/" path=$HOME"/Library/Application Support/Google/Chrome/Default/IndexedDB" ext="chrome-extension_fjnbnpbmkenffdnngjfgmeleoegfcffe_0.indexeddb.leveldb" dt=$(date +%Y,%m,%d-%H,%M,%S) filename='ggc_stylish_'$dt'.7z' cd "$path" /usr/local/bin/7z a "$filename" "$ext" if [[ $? != 0 ]];then echo "$dt Error with 7z." >> "${dest}backup.log" exit fi mv "$filename" "$dest" if [[ $? != 0 ]];then echo "$dt Error with mv." >> "${dest}backup.log" exit fi cd "$dest" echo "$dt Done with bu." >> "backup.log"
# file default.cron ## weekly 6:30am 30 6 * * 1 /Users/ruili/Bin/cron.d/scripts/ggc_stylish_weekly.sh
run crontab default.cron
and crontab -l