Manejo de cookies en Ocamlnet
http-headers (0)
Intento escribir un bot que extraiga algunos datos que solo están disponibles para los usuarios autenticados. Me conformé con ocaml (v. 3.12.1)
y ocamlnet (v. 3.6.5)
. La primera parte del script envía una solicitud POST al sitio web y por el html que recibo, puedo decir que la autenticación funcionó (los valores de p1
y p2
en este ejemplo de código obviamente no son los que estoy usando).
open Http_client
open Nethttp
let pipeline = new pipeline
let () =
let post_call = new post
"http://www.kraland.org/main.php?p=1&a=100"
[("p1", "username");
("p2", "password");
("Submit", "Ok!")]
in
pipeline#add post_call;
pipeline#run();
Luego extraigo las cookies donde se almacenan la id. De la sesión php, el nombre de la cuenta, un hash de la contraseña, etc., las coloco en el encabezado de la siguiente solicitud y la ejecuto. Y aquí es donde me encuentro con problemas: obtengo sistemáticamente la página aburrida que recibe cada visitante anónimo.
let cookies = Header.get_set_cookie post_call#response_header in
let get_call = new get "http://www.kraland.org/main.php?p=1" in
let header = get_call#request_header `Base in
Header.set_set_cookie header cookies;
pipeline#add get_call;
pipeline#run();
Cuando imprimo el contenido de las cookies, obtengo algo extraño: esperaría que el dominio de las cookies fuera kraland.org
pero no parece ser el caso. Este es el comando de impresión que uso junto con el resultado:
List.iter (fun c -> Printf.printf "%.0f [%s%s:%b] %s := %s/n"
(match c.cookie_expires with None -> -1. | Some f -> f)
(match c.cookie_domain with None -> "" | Some s -> s)
(match c.cookie_path with None -> "" | Some s -> s)
c.cookie_secure c.cookie_name c.cookie_value)
cookies;
-1 [/:false] PHPSESSID := 410b97b0536b3e949df17edd44965926
1372719625 [:false] login := username
1372719625 [:false] id := myid
1372719625 [:false] password := fbCK/0M+blFRLx3oDp+24bHlwpDUy7x885sF+Q865ms=
1372719625 [:false] pc_id := 872176495311
Editar: Tuve un problema con el Http-conduit-browser de Haskell y funciona como un hechizo utilizando algo muy parecido al ejemplo del doc .