我正在尝试编写一个机器人来提取一些仅对经过身份验证的用户可用的数据。我选择了ocaml (v. 3.12.1)
和ocamlnet (v. 3.6.5)
。脚本的第一部分向网站发送一个 POST 请求,通过我收到的 html,我可以看出身份验证有效(p1
并且p2
此代码示例中的值显然不是我正在使用的值)。
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();
然后我提取存储 php session id、帐户名称、密码哈希等的 cookie,将它们放在下一个请求的 header 中并运行它。这就是我遇到麻烦的地方:我系统地获取每个匿名访问者都会得到的无聊页面。
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();
当我打印 cookie 的内容时,我确实得到了一些奇怪的东西:我希望 cookie 的域是,kraland.org
但似乎并非如此。这是我与输出一起使用的打印命令:
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
编辑:我使用 Haskell 的 Http-conduit-browser 解决了这个问题,它使用非常类似于文档示例的东西就像一个魅力。