Создание файлов cookie с помощью сети.Браузер

#haskell

#haskell

Вопрос:

Итак, я пытаюсь использовать сеть.Библиотека браузера для хранения сеансов cookie. Вот что у меня есть на данный момент:

 main = do
   args <- getArgs
   [user, pass] <- if not (null args) then return args else do
     user <- fetch "username"
     pass <- fetch "password"
     return [user, pass]
    sup <- browse $ do
 --       setOutHandler $ const $ return ()
        (request (getRequest ("http://www.plurk.com/API/Users/login?"
                               "username="     user
                               "amp;password="    pass
                               "amp;api_key=FVXhr06sHbbp7Lv2rezPVw8rhpl7fNnX")))
   let (_,a) = rspHeaders <$> sup
 --  let (Right b) = parseJSON a
 --  let (Just c) = findIn b ["fans_count"]
   putStrLn $ hdrValue (a!!5)

 fetch info = do
   putStr $ "Enter your plurk "    info    ": "
   hFlush stdout
   return =<< getLine
  

это дает следующий результат:

 Sending:
GET /API/Users/login?username=saiko_chriskunamp;password=XXXXXXXXXXamp;api_key=FVXhr06sHbbp7Lv2rezPVw8rhpl7fNnX HTTP/1.1
Host: www.plurk.com
Content-Length: 0
User-Agent: hs-HTTP-4000.0.9


Creating new connection to www.plurk.com
Received:
HTTP/1.1 200 OK 
Server: nginx/1.0.0
Date: Sat, 21 May 2011 06:37:41 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Set-Cookie: plurkcookiea="bYQstPmQg58L5hTs9nZ7fvIEzuc=?age=STIwCi4=amp;api_login=STAxCi4=amp;chkN=Uyc4YzU1ZWM3YTMzNzQxM2I2MDM2MmY1ZWZhODM5NzdhOScKcDEKLg==amp;gender=TDFMCi4=amp;user_id=TDgwNTc3NDlMCi4=amp;user_ip=Uyc3NS4zNi4yMTMuMjgnCnAxCi4="; Domain=.plurk.com; expires=Sat, 04-Jun-2011 06:37:41 GMT; Max-Age=1209600; Path=/
Expires: Sat, 21 May 2011 06:37:40 GMT
Cache-Control: no-cache
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 2648


Cookies received:
  MkCookie {ckDomain = ".plurk.com", ckName = "plurkcookiea", ckValue = "bYQstPmQg58L5hTs9nZ7fvIEzuc=?age=STIwCi4=amp;api_login=STAxCi4=amp;chkN=Uyc4YzU1ZWM3YTMzNzQxM2I2MDM2MmY1ZWZhODM5NzdhOScKcDEKLg==amp;gender=TDFMCi4=amp;user_id=TDgwNTc3NDlMCi4=amp;user_ip=Uyc3NS4zNi4yMTMuMjgnCnAxCi4=", ckPath = Just "/", ckComment = Nothing, ckVersion = Nothing}
Accepting cookies with names: plurkcookiea
plurkcookiea="bYQstPmQg58L5hTs9nZ7fvIEzuc=?age=STIwCi4=amp;api_login=STAxCi4=amp;chkN=Uyc4YzU1ZWM3YTMzNzQxM2I2MDM2MmY1ZWZhODM5NzdhOScKcDEKLg==amp;gender=TDFMCi4=amp;user_id=TDgwNTc3NDlMCi4=amp;user_ip=Uyc3NS4zNi4yMTMuMjgnCnAxCi4="; Domain=.plurk.com; expires=Sat, 04-Jun-2011 06:37:41 GMT; Max-Age=1209600; Path=/
  

Последняя строка — это результат putStrLn , и я мог бы запустить ее через parsec, если бы мне действительно было нужно .. но выше этого, из выходных данных browse, есть конструктор MkCookie со всей необходимой мне информацией. Есть ли какой-нибудь способ легко получить это?

Ответ №1:

getCookies внутри BrowserAction монады возвращается список принятых файлов cookie. Используйте это следующим образом:

 import Network.HTTP
import Network.Browser

main = do
    (rsp, cookies) <- browse $ do
        rsp <- request $ getRequest "http://google.com/"
        cookies <- getCookies
        return (rsp, cookies)
    print cookies