curl类实现网站自动登录

  cheney

之前做 SkyDriver网盘批量获取图片链接工具 的时候,只是急于寻找一个能够下载的封装类,找到了curl,就匆匆的使用了。

当然功能是实现了,但是实际上是并没有发挥curl的强大功能。后来才了解到,curl是一个利用URL语法在命令行方式下工作的文件传输工具。它支持:FTP、FTPS、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE 以及 LDAP等众多协议。

curl同样支持HTTPS认证,HTTP POST方法,HTTP PUT方法,FTP上传,kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上载文件断点续传,http代理服务器管道( proxy tunneling),甚至它还支持IPv6、socks5代理服务器,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。

有多种语言的版本,已被广泛使用。

有一天,我有个想法,把某个股票网站的数据全部抓取到本地,然后分析别人的操作,加权排序,然后生成建议,或许有搞头。虽然数据没有专门的加密,但是都是属于内页。就像人人网,如果你想要抓去别人的首页,就至少需要一个人人的帐号登录,然后模拟访问。不然就只能看到登录页。模拟登录也是curl的强项。

首先看一下,登录需要什么信息。查看网页的源码可以看到form表单。

	<form method="post" action="/user/login">
	<span class="mr5>邮箱:
	<input class="inputtext_s" name="strEmail" style="width:100px; vertical-align:middle;" type="text" />
	</span>
	<input class="inputtext_s" name="name" style="width:100px; vertical-align:middle;" type="text" />
	<span>密码:
	<input class="inputtext_s" name="strPassword" style="width:100px; vertical-align:middle;" type="password" />
	</span>
	<input type="submit" class="botton_sg"? value="登录"/>
	<input type="hidden" name="UrlRedirect" value="/gate.mvc/user/Login" />

其实蛮简单的,用WireShark抓一下,登录时的数据,发现比想象的还简单。

整个过程只有三步,POST提交表单,服务器会返回cookis,然后用cookis就能获取到内页的数据了。

ALL

POST的内容如下,表单的格式都不用研究了,直接拷贝这个用就可以了。

POST

服务器返回的信息是Set-Cookies,保存这部分数据,下次请求时提交,它就知道你是谁了。

COOKISE

  • 以下是获取某网页的代码,PHP写的:
	<?php

	$curlPost = "strEmail=odddftigggrrrrahddet&amp;strPassword=hssffgvhnvUrrredirect=";
	$cookie_file = tempnam('./temp','cookie');
	$ch = curl_init();
	
	// 提交POST信息获得cookies
	curl_setopt($ch, CURLOPT_URL, '[http://www.xxxxxxxxn/User/Login');](http://www.xxxxxxxxn/User/Login)
	curl_setopt($ch, CURLOPT_HEADER, 1);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
	curl_setopt ( $ch, CURLOPT_COOKIEJAR, $cookie_file);
	$data = curl_exec($ch);
	
	// 使用cookies可以登录任意页面
	curl_setopt($ch, CURLOPT_URL, '[http://www.xxxxxxxcn/stockpool/info/303');](http://www.xxxxxxxcn/stockpool/info/303)
	curl_setopt($ch, CURLOPT_HEADER, 1);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($c, CURLOPT_COOKIEFILE, $cookie_file);
	
	// 运行cURL,请求网页
	$data = curl_exec($ch);
	// 关闭URL请求
	curl_close($ch);
	
	// 显示获得的数据
	var_dump($data);
  • 用MFC也同样简单:

	CString itemlink = "http://www.xxxxxu.cn/stockpool/info/303";	
	CString postform = "strEmail=occultisffgyefffghhah.net&amp;strPassword=hsddfgggq&amp;UrlRedirect=";
    
    CString cookise;
	// char file[2*2048]; FILE *file;
	// 调用函数库中的curl_easy_init()函数完成初始化 CURL *pcurl = curl_easy_init();
    // 提交POST信息获得cookies curl_easy_setopt(pcurl, CURLOPT_URL, "http://wwwwwwxxxu.cn/User/Login");
	
	curl_easy_setopt(pcurl, CURLOPT_HEADER, 1);
	curl_easy_setopt(pcurl, CURLOPT_POST, 1);
	curl_easy_setopt(pcurl, CURLOPT_POSTFIELDS, postform);
	curl_easy_setopt(pcurl, CURLOPT_COOKIEJAR, cookise);
    // 运行 
    curl_easy_perform( pcurl );

感谢CURL

http://curl.haxx.se/