Odpowiedzi:
Byłem w stanie rozpakować jsonlz4, używając lz4json
:
apt-get install liblz4-dev
git clone https://github.com/andikleen/lz4json.git
cd lz4json
make
./lz4jsoncat ~/.mozilla/firefox/*/bookmarkbackups/*.jsonlz4
.json.mozlz4
plików, np. Jak pokazano na github.com/andikleen/lz4json/issues/1#issuecomment-336729026 (uwaga do siebie: pamiętaj, pamiętaj, gmake
na FreeBSD…).
liblz4-dev
przed jego zbudowaniem). narzędzie avih, OTOH, działało dla mnie idealnie.
Zapisz ten skrypt w pliku, np . 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)
import lz4
się import lz4.block as lz4
, ale nadal nie działa. Błąd związany z niektórymi bajtami a ciągiem. OTOH ten skrypt działał ze zmianą importu: gist.github.com/Tblue/62ff47bef7f894e92ed5
$ pip install lz4
.
Właściwie prawie wszystkie pliki lz4 profilu Firefox to pliki mozlz4 . Oznacza to, że mają ten sam „nagłówek formatu pliku”. Z wyjątkiem jednego pliku. Mówię o pliku webext.sc.lz4 . Ma mozJSSCLz40v001\0
nagłówek pliku i może jakieś sc
opakowanie do spakowania grupy plików do strumienia bajtów.
Jest to dodatek do Firefoksa czytać lub kompresował .mozlz4 pliki tekstowe mozlz4-edit
Wystarczająco trwałe utrzymywanie googlingu w tym przypadku ujawnia wiele rozwiązań, ale większość z nich wydaje się albo (a) zepsuta przez późniejsze zmiany w bazowych bibliotekach, albo (b) niepotrzebnie skomplikowana (przynajmniej według mojego osobistego gustu), co czyni ich niezręcznymi upuść w istniejącym kodzie.
Następujące wydaje się działać przynajmniej w Pythonie 2.7 i 3.6 przy użyciu najnowszej wersji powiązań 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
Oczywiście nie ma to na celu sprawdzania poprawności danych wejściowych (lub danych wyjściowych), nie ma na celu zapewnienia bezpieczeństwa itp., Ale jeśli ktoś chce po prostu parsować własne dane FF, wykonuje podstawowe zadanie.
Wiersz poleceń wersja tutaj , które mogą być zapisane w odpowiednim katalogu i wywoływany z linii poleceń jak:
chmod +x mozlz4.py
./mozlz4.py <file you want to read> <file to save output to>