Junjun&3588 个人博客

-个人博客-
热爱技术,喜欢科技. Hello Coder!!
  1. 首页
  2. 编程语言
  3. php
  4. 正文

自用备份(curl可模拟http/https登陆 及模拟登陆邮箱什么的 采集用到)

2011-10-02 632点热度 0人点赞 0条评论

function curlGet($url, $method = '', $post = '')
{
$ran = rand(1, 255);
$ran1 = rand(1, 255);
$ran2 = rand(1, 255);
$ran3 = rand(60, 255);
$ran3 = str_replace(array('192', '172', '127'), '', $ran3);
$ip = "$ran3.$ran2.$ran1.$ran";
$headerArr = array("CLIENT-IP:$ip", "X-FORWARDED-FOR:$ip");
$cookieJar = tempnam(XZ_ROOT . './cookie', 'cookie.txt');
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_HTTPHEADER , $headerArr); //构造IP
//curl_setopt ($curl, CURLOPT_REFERER, "http://www.baidu.com/"); //构造来路
curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// curl_setopt($curl,CURLOPT_TIMEOUT,3); //设定最大访问耗时
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookieJar);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookieJar);
if ($method == 'post') {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,$post);
}
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
$str = curl_exec($curl);
$str = iconv("GBK", "UTF-8//IGNORE", $str);
curl_close($curl);
unset($curl);
return $str;
}

模拟浏览器登陆应用开发,最关键的地方是突破登陆验证。CURL技术不只支持http,还支持https。区别就在多了一层SSL加密传输。如果是要登陆https网站,php记得要支持openssl。还是先拿一个例子来分析。

//用户名

$login = 'username';

//密码

$password = 'password';

//163的用户登陆地址

$url = "https://reg.163.com/logins.jsp";

//post 要提交的数据

$fields = "verifycookie=1&style=16∏uct=mail163&username=".$login."&password=".$password."&selType=jy&remUser=&secure=on&%B5%C7%C2%BC%D3%CA%CF%E4=%B5%C7%C2%BC%D3%CA%CF%E4";

//用来存放cookie的文件

$cookie_file = dirname(__FILE__)."/cookie.txt";

//启动一个CURL会话

$ch = curl_init();

// 要访问的地址

curl_setopt($ch, CURLOPT_URL, $url);

// 对认证证书来源的检查,0表示阻止对证书的合法性的检查。

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

// 从证书中检查SSL加密算法是否存在

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);

//模拟用户使用的浏览器,在HTTP请求中包含一个”user-agent”头的字符串。

curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");

//发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。

curl_setopt($ch, CURLOPT_POST, 1);

//要传送的所有数据,如果要传送一个文件,需要一个@开头的文件名

curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);

//连接关闭以后,存放cookie信息的文件名称

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);

// 包含cookie信息的文件名称,这个cookie文件可以是Netscape格式或者HTTP风格的header信息。

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

// 设置curl允许执行的最长秒数

//curl_setopt($ch, CURLOPT_TIMEOUT, 6);

// 获取的信息以文件流的形式返回,而不是直接输出。

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

// 执行操作

$result = curl_exec($ch);

if ($result == NULL) {

echo "Error:
";

echo curl_errno($ch) . " - " . curl_error($ch) . "
";

}

// 关闭CURL会话

curl_close($ch);上 面这个例子相对简单,因为用户名和密码可以明文传输,而且登陆也不需要验证码。qq.com的模拟登陆相对就麻烦多了,首先要突破验证码这关,然后由于 QQ密码是经过javascript加密后传输的,登陆界面也要模拟出来,下一篇文章再继续深入谈谈QQ的模拟登陆。

参考资料:

CURL详解 http://www.21andy.com/blog/20080507/1095.html

Tags: curl,模拟登陆wuzuquan 2008/07/18 09:40您好,我现在在做一个模拟yahoo登陆的php程序,因为yahoo的密码是经过javascript加密的,而且在加密过程中引用了一个网页随机生成的字符串challenge,这个字符串在每次访问网页的时候都不一样。

如果我采用curl来模拟登陆,过程如下:

先curl_init()初始化一个curl连接,设置相关选项后,curl_exec();然后利用采集功能得到challenge的值,经过加密计算出加密后的密码。再来一次curl_exec,将用户名,加密密码等post出去。

可是这样做采集到的challenge永远都是过时的,这该怎么解决呢?

思路:

采集程序的思路很简单大体可以分为以下几个步骤:

1.获取远程文件源代码(file_get_contents或用fopen).

2.分析代码得到自己想要的内容(这里用正规匹配,一般是得到分页)。

3.跟根得到的内容进行下载入库等操作。

在这里第二步有可能要重复的操作好几次,比如说要先分析一下分页地址,在分析一下内页的内容才能取得我们想要的东西。

代码:

记的以前发部过部分的代码今天我在这里在简单的发部一下

复制PHP内容到剪贴板

PHP代码:

@$nl=file_get_contents($rs['url']);//抓取远程内容
preg_match_all("/var url = "gameswf/(.*?).swf";/is",$nl,$connect);//进行正规匹配取得自己要的内容
mysql_query("insert ......插入数据库部分");

上面的代码就是所有采集要用到的代码了,当然大家也可以用fope来作,我个人喜欢用file_get_contents。

下面在共享一下我的下载图片flash到本地的办法,太简单了两行代码

复制PHP内容到剪贴板

PHP代码:

if(@copy($url,$newurl)){
echo 'ok';
}

在论坛上以前还发过一个图片下载函数这会也放上来给大家

复制PHP内容到剪贴板

PHP代码:

/*本存图片函数*/
function getimg($url,$filename){
/*判断图片的url是否为空,如果为空停止函数*/
if($url==""){
return false;
}
/*取得图片的扩展名,存入变量$ext中*/
$ext=strrchr($url,".");

/*strrchr(string,char) 查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。*/
/*判断是否是合法的图片文件*/
if($ext!=".gif" && $ext!=".jpg"){
return false;
}
/*读取图片*/
$img=file_get_contents($url);

/*此函数见http://hi.baidu.com/lixing880/blog/item/3c1786ec95077edb2e2e2161.html */
/*打开指定的文件*/
$fp=@fopen($filename.$ext,"a");
/*写入图片到指点的文件*/
fwrite($fp,$img);
/*关闭文件*/
fclose($fp);
/*返回图片的新文件名*/
return $filename.$ext;
}

共享一下个人的采集心德:

1.不采那些作防盗链了的站,其实可以作假来路但是这样的站采集成本太高

2.采集尽量快的站,最好在本地进行采集

3.采集时有很多时候可以先把一部分数据存入数据库,等以后进行下一步的处理。

4.采集的时候一定要作好出错处理,我一般都是如果采集三次没有成功就跳过。以前经常就因为一条内容不能采就卡在那里一直的采。

5.入库前一定要作好判断,检查内容的合法,过滤不必要的字符串。

标签: 暂无
最后更新:2011-10-02

admin3588

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。

COPYRIGHT © 2022 Junjun&3588 个人博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang