これを解凍するJavaScript +ブラウザー固有のさまざまな方法があるようですが、jsonlz4ファイルを何かに変換する方法はありませんunlz4
読むつもりです?
lz4json
を使用してjsonlz4を解凍できました:
apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4
このスクリプトをファイルに保存します(例:mozlz4
:
#!/usr/bin/env python
from sys import stdin, stdout, argv, stderr
import os
try:
import lz4.block as lz4
except ImportError:
import lz4
stdin = os.fdopen(stdin.fileno(), 'rb')
stdout = os.fdopen(stdout.fileno(), 'wb')
if argv[1:] == ['-c']:
stdout.write(b'mozLz40\0' + lz4.compress(stdin.read()))
Elif argv[1:] == ['-d']:
assert stdin.read(8) == b'mozLz40\0'
stdout.write(lz4.decompress(stdin.read()))
else:
stderr.write('Usage: %s -c|-d < infile > outfile\n' % argv[0])
stderr.write('Compress or decompress Mozilla-flavor LZ4 files.\n\n')
stderr.write('Examples:\n')
stderr.write('\t%s -d < infile.json.mozlz4 > outfile.json\n' % argv[0])
stderr.write('\t%s -c < infile.json > outfile.json.mozlz4\n' % argv[0])
exit(1)
これに対して十分に永続的なグーグルは多くの解決策をもたらしますが、それらのほとんどは、(a)基礎となるライブラリへのその後の変更によって壊れるか、(b)不必要に複雑になり(少なくとも私の個人的な趣味)、それらを不格好にします既存のコードにドロップします。
以下は、少なくともPython 2.7および3.6および Python LZ4バインディング を使用した3.6で動作するようです。
def mozlz4_to_text(filepath):
# Given the path to a "mozlz4", "jsonlz4", "baklz4" etc. file,
# return the uncompressed text.
import lz4.block
bytestream = open(filepath, "rb")
bytestream.read(8) # skip past the b"mozLz40\0" header
valid_bytes = bytestream.read()
text = lz4.block.decompress(valid_bytes)
return text
もちろん、これは入力(または出力)の検証を試みたり、安全を意図したりするものではありませんが、自分のFFデータを解析できるようにしたいだけの場合は、基本的な作業が行われます。
コマンドラインバージョン here 、これは関連ディレクトリに保存され、コマンドラインから次のように呼び出されます。
chmod +x mozlz4.py
./mozlz4.py <file you want to read> <file to save output to>
実際、ほとんどすべてのFirefoxプロファイルlz4ファイルはmozlz4ファイルです。つまり、同じ「ファイル形式ヘッダー」を持っています。 1つのファイルを除きます。 webext.sc.lz4ファイルについて話します。 mozJSSCLz40v001\0
ファイルヘッダーと、ファイルのグループをバイトストリームにパックするためのいくつかのsc
パッケージ。
。mozlz4テキストファイルを読み取りまたは圧縮するFirefoxアドオン mozlz4-edit
承認されたソリューションは、Linux以外のシステムでは機能しません。 https://github.com/cnst/lz4json に分岐して、BSDを含む他のすべてのUNIX®システムで問題なくコンパイルできるようにしました。 Mac OS Xのサンプルは次のとおりです。
Sudo port install lz4
git clone https://github.com/cnst/lz4json.git
cd lz4json
make
./lz4jsoncat ~/Library/Application\ Support/Firefox/Profiles/CHANGE\
THIS.default/sessionstore-backups/recovery.jsonlz4 \
| python -m json.tool | fgrep :textarea | more
FreeBSDおよびNetBSDw /pkgsrchttps://github.com/cnst/lz4json ;でFinkやHomebrewなどの他のシステムのサポートを追加することも、私のバージョンでは簡単です。他のUNIXシステムのプルリクエストを歓迎します(元のツールの作成者はGNU/Linuxサポートにのみ関心があり、非Linuxサポートを追加するプルリクエストを拒否します)。
また、Firefoxを直接使用するソリューションは次のとおりです https://superuser.com/a/1363748/18057 。
Python 3ソリューション。
lz4が必要:pip install lz4
コードを.pyファイルとして保存します。次に、ファイルをドラッグアンドドロップするか、コマンドラインを使用してファイルにアクセスします。
1つのファイルパスのみを受け入れます。そのファイルにMozilla LZ4拡張子(.lz4、.mozlz4、.jsonlz4、.baklz4)が付いている場合、それはデコードされます。それ以外の場合、ファイルは常にエンコードされます(常に元のファイルと同じフォルダーに)。出力ファイルが既に存在する場合、上書きの警告/質問が表示されます。
from sys import argv, exit
import os
try:
import lz4.block as lz4
except ImportError:
print("Please install lz4 via 'pip install lz4'.")
EXTENSIONS = {"1": ".lz4", "2": ".mozlz4", "3": ".jsonlz4", "4": ".baklz4"}
def check_overwrite(path):
if os.path.exists(path):
i = input(f"File {path} already exists. Overwrite? y/n\n")
if i.lower() == "y":
print("Overwriting file.")
return True
else:
print("Exiting.")
exit(1)
else:
return True
def print_info():
print(f"Usage: {argv[0]} <infile>")
print("Decompress Mozilla-LZ4 encoded <infile> or compress <infile> to Mozilla-LZ4.")
print("Output file will be put in same folder as input file.")
exit(1)
def choose_ext():
print(f"Please choose file extension:")
for k, v in EXTENSIONS.items():
print(f"{k}: {v}")
if (i := input()) in EXTENSIONS.keys():
return EXTENSIONS[i]
else:
print("Invalid extension.\nExiting")
exit(1)
def main():
if len(argv) != 2:
print_info()
else:
if not os.path.exists(argv[1]):
print_info()
else:
in_full_name = os.path.basename(argv[1])
in_folder_path = os.path.dirname(argv[1])
in_name, in_ext = os.path.splitext(argv[1]) # "search.json", ".mozlz4"
in_file_handle = open(argv[1], "rb")
if in_ext.lower() in EXTENSIONS.values():
''' Decompress '''
print(f"Trying to decompress {in_full_name}")
out_file = os.path.join(in_folder_path, f"{in_name}")
if check_overwrite(out_file):
with open(out_file, "wb") as f:
assert in_file_handle.read(8) == b"mozLz40\0"
f.write(lz4.decompress(in_file_handle.read()))
else:
''' Compress '''
print(f"Trying to compress {in_full_name}")
ext = choose_ext()
out_file = os.path.join(in_folder_path, f"{in_full_name}{ext}")
if check_overwrite(out_file):
with open(out_file, "wb") as f:
f.write(b"mozLz40\0" + lz4.compress(in_file_handle.read()))
if __name__ == '__main__':
main()