web-dev-qa-db-ja.com

コマンドラインを使用してjsonlz4ファイル(Firefoxブックマークバックアップ)を解凍する方法

これを解凍するJavaScript +ブラウザー固有のさまざまな方法があるようですが、jsonlz4ファイルを何かに変換する方法はありませんunlz4 読むつもりです?

24
l0b0

lz4json を使用してjsonlz4を解凍できました:

apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4
18
Rolf

このスクリプトをファイルに保存します(例: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)
19

これに対して十分に永続的なグーグルは多くの解決策をもたらしますが、それらのほとんどは、(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>
6

実際、ほとんどすべてのFirefoxプロファイルlz4ファイルはmozlz4ファイルです。つまり、同じ「ファイル形式ヘッダー」を持っています。 1つのファイルを除きます。 webext.sc.lz4ファイルについて話します。 mozJSSCLz40v001\0ファイルヘッダーと、ファイルのグループをバイトストリームにパックするためのいくつかのscパッケージ。

。mozlz4テキストファイルを読み取りまたは圧縮するFirefoxアドオン mozlz4-edit

5
user282490

承認されたソリューションは、Linux以外のシステムでは機能しません。 https://github.com/cnst/lz4json に分岐して、BSDを含む他のすべてのUNIX®システムで問題なくコンパイルできるようにしました。 Mac OS Xのサンプルは次のとおりです。

MacPortsを搭載したMac OS XUNIX®

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

1
cnst

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()
0
user136036