मैं वर्तमान में एक पायथन एप्लिकेशन पर काम कर रहा हूं, जो फेसबुक एपीआई के साथ काम करता है। जैसा कि हम सभी जानते हैं, फेसबुक अपनी तकनीक से प्यार करता है और डेटा संपीड़न के लिए zstd के साथ काम कर रहा है।

समस्या: फेसबुक या तो सामान्य जेसन के साथ एक असम्पीडित प्रतिक्रिया लौटा रहा है या यदि प्रतिक्रिया लंबी है, तो यह एक zstd संपीड़ित जेसन के साथ प्रतिक्रिया दे रही है।

मेरा वर्तमान कोड कुछ ऐसा है:

import zstd
import json


def handle_response(response)
    json = None
    try:
        json = json.loads(zstd.decompress(response.content))
    except:
        json = json.loads(response.text)

    return json

मैं वर्तमान में सोच रहा हूं, अगर ऐसा करने का एक और साफ तरीका है और यहां तक ​​​​कि zstd का पता लगाएं।

2
mynameisgod 3 अगस्त 2021, 17:31
2
यदि आप किसी विशिष्ट प्रकार के अपवाद के साथ नंगे except को प्रतिस्थापित करते हैं तो आपके पास "क्लीनर" होगा।
 – 
martineau
3 अगस्त 2021, 17:49
संपीडित डेटा में एक फ़ाइल हस्ताक्षर होगा, जिसे कभी-कभी मैजिक नंबर कहा जाता है जो इसकी पहचान करता है। एक दस्तावेज है जो प्रारूप का वर्णन करता है और zstd मैजिक नंबर। पायथन में जादुई संख्या जांचने के तरीके हैं।
 – 
Alex
3 अगस्त 2021, 17:53

1 उत्तर

सबसे बढ़िया उत्तर

आप जो कर रहे हैं वह ठीक है।

मुझे लगता है, आप यह देखने के लिए जांच कर सकते हैं कि धारा चार बाइट्स 28 b5 2f fd से शुरू होती है या नहीं। यदि ऐसा नहीं होता है, तो यह zstd स्ट्रीम नहीं है। अगर ऐसा होता है, तो यह एक zstd स्ट्रीम हो सकता है। बाद के मामले में, आप डिकंप्रेस करने का प्रयास करेंगे और यदि यह विफल हो जाता है, तो आप केवल इनपुट की प्रतिलिपि बनाने के लिए वापस आ जाएंगे।

यह बिल्कुल वैसा ही है जैसा आप पहले से कर रहे हैं, क्योंकि zstd.decompress सबसे पहला काम उस हस्ताक्षर की तलाश करना है।

3
Mark Adler 3 अगस्त 2021, 18:25
तो मूल रूप से: request.content.startswith(b"\x28\xb5\x2f\xfd") धन्यवाद! :)
 – 
mynameisgod
4 अगस्त 2021, 01:10
या बस वही करें जो आपने प्रश्न में रखा है।
 – 
Mark Adler
4 अगस्त 2021, 02:55