Làm cách nào để giải nén các tệp jsonlz4 (sao lưu dấu trang Firefox) bằng dòng lệnh?


Câu trả lời:


18

Tôi đã có thể giải nén jsonlz4 bằng cách sử dụng lz4json:

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

1
Giải pháp andikleen cũng tốt cho .json.mozlz4các tệp, ví dụ như được hiển thị tại github.com/andikleen/lz4json/issues/1#issuecomment-336729026 (lưu ý đến bản thân: nhớ, nhớ, gmaketrên FreeBSD,).
Graham Perrin

3
Ngoài ra: bugzilla.mozilla.org/show_orms.cgi?id=1209390#c4 (2016-05-13) trong Mozilla bug 1209390 - Sử dụng định dạng tệp lz4 tiêu chuẩn thay vì jsonlz4 / mozlz4 không chuẩn để thu hút sự chú ý đến avih / dejsonlz4: Giải nén các tệp sao lưu dấu trang Mozilla Firefox
Graham Perrin

1
Công cụ của FWIW, andikleen không thể biên dịch, với lỗi "không xác định tham chiếu đến LZ4_decompress_safe_partial" (Tôi đã cài đặt liblz4-devtrước khi xây dựng nó). công cụ của avih, OTOH, đã làm việc hoàn hảo với tôi.
waldyrious

1
Không phải mỉa mai rằng một org web mở đang sử dụng định dạng nén độc quyền cho dữ liệu của người dùng, khiến việc kiểm tra dữ liệu của bạn trở nên không tầm thường?
cnst

@ Graham-Perrin: dejsonlz4 làm việc rất tốt cho tôi. Nó không " chuyển đổi các tệp jsonlz4 thành một cái gì đó unlz4 sẽ đọc " theo yêu cầu nhưng trực tiếp giải nén chúng. Sẽ là tốt để làm cho nó một câu trả lời thực sự để làm cho nó rõ hơn.
mivk

17

Lưu tập lệnh này trong một tệp, ví dụ 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)

Tôi đã phải thay đổi import lz4để import lz4.block as lz4, nhưng nó vẫn không làm việc. Một số lỗi liên quan đến byte và chuỗi. OTOH tập lệnh này đã hoạt động với thay đổi nhập: gist.github.com/Tblue/62ff47bef7f894e92ed5
user31389

1
@ user31389: Tôi đã cập nhật tập lệnh. Nó có hoạt động bây giờ không?
Håkon A. Hjortland

Đã không làm việc cho tôi cho đến khi tôi đã làm $ pip install lz4.
Daniel

5

Trên thực tế hầu như tất cả các tệp lz4 hồ sơ Firefox đều là các tệp mozlz4 . Nó có nghĩa là họ có cùng "tiêu đề định dạng tệp". Ngoại trừ một tập tin. Tôi nói về tập tin webext.sc.lz4 . Nó có mozJSSCLz40v001\0tiêu đề tệp và có thể một số scbao bì để đóng gói nhóm tệp vào luồng byte.

Có một addon Firefox để đọc hoặc nén .mozlz4 tập tin văn bản mozlz4-edit


4

Googling đủ bền bỉ cho việc này tạo ra rất nhiều giải pháp, nhưng hầu hết trong số chúng dường như bị phá vỡ bởi những thay đổi tiếp theo đối với các thư viện cơ bản, hoặc (b) phức tạp không cần thiết (ít nhất là theo sở thích cá nhân của tôi), khiến chúng trở nên lộn xộn thả vào mã hiện có.

Phần sau có vẻ hoạt động ít nhất trên Python 2.7 và 3.6 bằng phiên bản gần đây của các ràng buộc Python LZ4 :

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

Tất nhiên, điều này không cố gắng xác nhận đầu vào (hoặc đầu ra), không nhằm mục đích bảo mật, v.v., nhưng nếu người ta chỉ muốn phân tích dữ liệu FF của chính mình, thì nó đã hoàn thành công việc cơ bản.

Phiên bản dòng lệnh ở đây , có thể được lưu trong thư mục có liên quan và được gọi từ dòng lệnh là:

chmod +x mozlz4.py
./mozlz4.py <file you want to read> <file to save output to>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.