วิธีการแตกไฟล์ jsonlz4 (การสำรองบุ๊คมาร์ค Firefox) โดยใช้บรรทัดคำสั่ง?


22

ดูเหมือนว่าจะมีวิธีการเฉพาะแตกต่างกันของ JavaScript + เบราว์เซอร์ในการแตกไฟล์ แต่ไม่มีวิธีแปลงไฟล์ jsonlz4 เป็นบางอย่างที่unlz4จะอ่านหรือไม่


คำตอบ:


18

ฉันสามารถแตก jsonlz4 โดยใช้lz4json:

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

1
วิธีการแก้ปัญหา andikleen นั้นดีสำหรับ.json.mozlz4ไฟล์เช่นที่แสดงที่github.com/andikleen/lz4json/issues/1#issuecomment-336729026 (หมายเหตุถึงตัวเอง: จำ, จำไว้, gmakeบน FreeBSD …)
Graham Perrin

3
นอกจากนี้: bugzilla.mozilla.org/show_bug.cgi?id=1209390#c4 (2016-05-13) ภายใต้ Mozilla bug 1209390 - ใช้รูปแบบไฟล์ lz4 มาตรฐานแทน jsonlz4 / mozlz4 ที่ไม่ได้มาตรฐานดึงดูดความสนใจไปที่avih / dejsonlz4: Decompress Mozilla Firefox ทำบุ๊คมาร์คไฟล์สำรอง
Graham Perrin

1
FWIW เครื่องมือของ andikleen ไม่สามารถรวบรวมได้โดยมีข้อผิดพลาด "การอ้างอิงที่ไม่ได้กำหนดไปยัง LZ4_decompress_safe_partial" (ฉันติดตั้งliblz4-devก่อนสร้าง) เครื่องมือของ avih OTOH ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน
วาลดีริอัส

1
ไม่ใช่เรื่องน่าแปลกใจที่องค์กรเปิดเว็บกำลังใช้รูปแบบการบีบอัดข้อมูลสำหรับผู้ใช้ทำให้ไม่ต้องตรวจสอบข้อมูลของคุณเอง!
cnst

@ Graham-Perrin: dejsonlz4ทำงานได้ดีมากสำหรับฉัน ไม่ใช่ " แปลงไฟล์ jsonlz4 เป็นสิ่งที่ unlz4 จะอ่าน " ตามที่ร้องขอ แต่จะแตกไฟล์โดยตรง มันเป็นการดีที่จะทำให้มันเป็นคำตอบที่แท้จริงเพื่อให้มองเห็นได้ชัดเจนยิ่งขึ้น
mivk

17

บันทึกสคริปต์นี้ในไฟล์เช่น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เป็นimport lz4.block as lz4แต่ก็ยังไม่ทำงาน ข้อผิดพลาดเกี่ยวกับไบต์บางส่วนกับสตริง OTOH สคริปต์นี้ทำงานกับการเปลี่ยนแปลงการนำเข้า: gist.github.com/Tblue/62ff47bef7f894e92ed5
user31389

1
@ user31389: ฉันอัพเดทสคริปต์ มันใช้งานได้แล้วตอนนี้?
Håkon A. Hjortland

$ pip install lz4ไม่ได้ทำงานสำหรับฉันจนกว่าฉันจะทำ
แดเนียล

5

ที่จริงแล้วไฟล์lz4ของโปรไฟล์ Firefox เกือบทั้งหมดเป็นไฟล์mozlz4 หมายความว่าพวกเขามี "ส่วนหัวของรูปแบบไฟล์" ที่เหมือนกัน ยกเว้นหนึ่งไฟล์ ฉันพูดเกี่ยวกับไฟล์webext.sc.lz4 มีmozJSSCLz40v001\0ส่วนหัวของไฟล์และอาจมีscแพ็กเกจเพื่อแพ็คกลุ่มของไฟล์ไปยังสตรีมไบต์

มี addon Firefox เพื่ออ่านหรือการบีบอัดเป็น.mozlz4ไฟล์ข้อความmozlz4 แก้ไข


4

Googling ที่มีอยู่อย่างพอเพียงสำหรับการแก้ปัญหานี้กลับกลายเป็นจำนวนมาก แต่ส่วนใหญ่ดูเหมือนจะเป็น (ก) แตกหักจากการเปลี่ยนแปลงที่เกิดขึ้นในไลบรารีต้นแบบหรือ (b) ซับซ้อนอย่างไม่จำเป็น (อย่างน้อยก็รสนิยมส่วนตัวของฉัน) วางลงในรหัสที่มีอยู่

ต่อไปนี้ปรากฏขึ้นเพื่อทำงานอย่างน้อยใน Python 2.7 และ 3.6 โดยใช้การโยง 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

แน่นอนว่านี่ไม่ใช่ความพยายามในการตรวจสอบอินพุต (หรือเอาท์พุท), ไม่ได้มีเจตนาที่จะรักษาความปลอดภัย ฯลฯ แต่ถ้าหากใครคนหนึ่งต้องการที่จะสามารถแยกวิเคราะห์ข้อมูล FF ของตัวเองได้

เวอร์ชันบรรทัดคำสั่งที่นี่ซึ่งสามารถบันทึกในไดเรกทอรีที่เกี่ยวข้องและเรียกใช้จากบรรทัดคำสั่งเป็น:

chmod +x mozlz4.py
./mozlz4.py <file you want to read> <file to save output to>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.