2012-02-26 10 views
8

मैं HTTPS का उपयोग कर किसी साइट से डेटा को स्क्रैप करने का प्रयास कर रहा हूं। मैं Network.HTTP.Conduit का सफलतापूर्वक उपयोग कर रहा हूं (क्रेडेंशियल्स पोस्ट करना), लेकिन प्रतिक्रिया शीर्षलेख (सेट-कुकी) से कुकी जानकारी निकालने में विफल रहा। ऐसा लगता है कि कुकीज़ से निपटने के लिए http-conduit में own mechanism है, जिसे मैं समझने में विफल रहा।http-conduit ब्राउज़र उपयोग

नेटवर्क। एचटीटीपी.कंडिट। ब्रॉसर स्वचालित रूप से कुकीज़ से निपटने लगता है (जो मेरे द्वारा ठीक है), लेकिन documentation की कमी के कारण मैं इसे काम नहीं कर सका।

अधिक http-नाली ब्राउज़र मॉड्यूल के साथ काम के अनुभव के साथ किसी ने मुझे दिखाया जा सका कैसे:

  1. स्व-हस्ताक्षरित प्रमाण पत्र के साथ डील
  2. (मैं आधार मॉड्यूल में managerCheckCerts के साथ ऐसा करने में कामयाब रहे) शरीर में यूआरएल-एन्कोडेड पैरामीटर के साथ एक POST अनुरोध भेजें, किसी भी रीडायरेक्ट का पालन न करें (इस के लिए बेस मॉड्यूल से 0)
  3. कुकी से 2. सरल जीईटी अनुरोध में चरण का उपयोग करें और प्रतिक्रिया को पढ़ें (आलसी) बाइटस्ट्रिंग (मैं इस के लिए httpLbs का उपयोग करता था)

मेरे लिए यह लग रहा है Network.HTTP.Conduit.Browser की अमूर्त स्तर की तरह अपने आवेदन Network.HTTP.Conduit की तुलना के लिए अधिक उपयुक्त है, इसलिए मैं स्विच भले ही मैं के साथ सौदा कर सकता है करना चाहते हैं कुकीज मैन्युअल रूप से बाद का उपयोग कर।

+0

मुझे दस्तावेज़ भी ढूंढने में समस्या थी, और ऐसा लगता है कि स्रोत कोड में उदाहरण कोड है: https://github.com/exbb2/http-conduit-browser/blob/master/Network/HTTP/Conduit/Browser.hs – Lionel

उत्तर

2

मैंने ब्राउज़र का कभी भी उपयोग नहीं किया है, लेकिन मैंने http-conduit का उपयोग किया है। मैंने इन सवालों के जवाब देने के लिए स्रोत कोड पढ़ा है, अगर मैं कोई गलती करता हूं तो मैं क्षमा चाहता हूं।

  1. वही काम करें जो आप कर रहे हैं। जब आपने दाएं managerCheckCerts के साथ Manager बनाया है, तो browse :: Manager -> BrowserAction a -> ResourceT IO a पर पास करें।

  2. makeRequest :: Request IO -> BrowserAction (Response (Source IO BS.ByteString))Request IO लेता है; शरीर में पैरामीटर के साथ POST अनुरोध बनाने के लिए पहले urlEncodedBody का उपयोग करें और इसे makeRequest पर पास करें। निम्नलिखित पर रीडायरेक्ट अक्षम करने के लिए redirectCount से 0 सेट करें, मुझे विश्वास है।

  3. मुझे विश्वास है कि आपको केवल getCookieJar :: BrowserAction CookieJar का उपयोग करने की आवश्यकता है; BrowserActiongetBrowserState :: BrowserAction BrowserState से आता है।

जिस तरह से http-conduit ब्राउज़र मॉड्यूल के बाहर कुकीज़ प्रबंधित करता है वह यह नहीं करता है। कुकीज़ को HTTP प्रतिक्रिया में वापस कर दिया जाता है; आप क्या कर सकते हैं प्रतिक्रिया को पार्स कर सकते हैं और कुकीज़ को कुकी जार में स्टोर कर सकते हैं। वास्तव में यह वास्तव में सभी ब्राउज़र करता है।

संबंधित मुद्दे