PHP 小偷程序应用的几个函数
所谓小偷程序,就是读取其它网站的数据到本地,然后对获得的数据进行代码过虑、替换等操作后显示出来,整个过程就像在模仿网页浏览器。
本文将说明,使用fsockopen()函数实现GET和POST请求,以及字符串操作的几个函数。建议你了解一下HTTP请求的过程,这样可以让你更容易理解本文内容。
一,获得网站数据--fsockopen()函数的使用
我们需要用到fsockopen()函数,此函数的作用是建立一个socket链接。
我们举个例子,将fsockopen()看作是你的浏览器。当你想要进入某网站时,首先要在地址栏里输入网址,回车后浏览器会与这个网站建立一个链接,这时浏览器会发送请求信息头,服务器收到请求信息头后,开始返回相应的数据,这些数据就是我们看到的网页的原型(HTML、CSS、JAVASCRIPT、文本等数据)。
以上就是一个简单的HTTP请求过程,为了进一步说明这个函数的作用,我们动手个例子。
1.GET请求,获得网易的主页数据,代码如下: //URL $url='www.163.com'; $data = LinkURL($url); print $data; function LinkURL($url) { //80是指端口,30是指超时时间 $fp = @fsockopen($url, 80, $errno, $errstr, 30); if ($fp) { //想一想浏览器的例子,我们必须得发送请求信息头,否则服务器不会返回数据,这里是一个GET请求。 fputs($fp, "GET / HTTP/1.1rn"); fputs($fp, "Host: $urlrn"); fputs($fp, "Accept: /rn"); fputs($fp, "Referer: http://$url/rn"); fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)rn"); fputs($fp, "Connection: Closernrn"); } while ($str = fread($fp, 4096)) $data .= $str; fclose($fp); return $data; } ?>
主页数据及服务器返回的信息被保存在$data变量中: HTTP/1.0 200 OK Date: Sat, 20 Oct 2007 15:11:52 GMT Server: Apache/2.2.4 (Unix) Accept-Ranges: bytes Vary: Accept-Encoding Content-Length: 129070 Content-Type: text/html; charset=gb2312 Age: 21 X-Cache: HIT from www.163.com Connection: close
2.实现POST请求,有很多种方式,这里列举几种。
其一:使用stream_context_create()函数:
$data=MovieSearch('1','s','1'); print $data;
function MovieSearch($key,$value,$isdel) { //例子网站有IP地址限制,最好自己找个网站测试。 $url='http://www.veryab.com/Movie/search/Search.jsp'; //POST数据 $post_data['key'] = $key; $post_data['value'] = $value; $post_data['isdel'] = $isdel; //解析URL地址 $URL_Info=parse_url($url); //对数据进行URL编码转换 foreach($post_data as $key=>$value) $values[]="$key=".urlencode($value); $data_string=implode("&",$values); //请求信息头 $header.="Host: ".$URL_Info["host"]."n"; $header.="Referer: $urln"; $header.="User-Agent: Mozilla 4.0rn"; $header.="Content-type: application/x-www-form-urlencodedn"; $header.="Content-length: ".strlen($data_string)."n"; $header.="Connection: close";
//stream_context_create()提交请求信息。 $opts['http']['method'] = 'POST'; $opts['http']['header'] = $header; $opts['http']['content'] = $data_string; $context = stream_context_create($opts); $content = file($url, false, $context); $data = implode('', $content); return $data; }
其二:使用fsockopen()函数:
$data=MovieSearch('1','s','1'); print $data;
function MovieSearch($key,$value,$isdel) { $url='http://www.veryab.com/Movie/search/Search.jsp'; $post_data['key'] = $key; $post_data['value'] = $value; $post_data['isdel'] = $isdel; $URL_Info=parse_url($url); if(!isset($URL_Info["port"])) $URL_Info["port"]=80; foreach($post_data as $key=>$value) $values[]="$key=".urlencode($value); //POST数据 $data_string=implode("&",$values); //请求信息头 $header.="POST ".$URL_Info["path"]." HTTP/1.1n"; $header.="Host: ".$URL_Info["host"]."n"; $header.="Referer: $referrern"; $header.="Content-type: application/x-www-form-urlencodedn"; $header.="Content-length: ".strlen($data_string)."n"; $header.="Connection: closen"; $header.="n"; $header.=$data_string."n"; //建立链接 $fp = fsockopen($URL_Info["host"],$URL_Info["port"],$errorno,$errorstr,30); //发送请信息头 fputs($fp, $header); //获得数据 while ($str = @fread($fp, 4096)) $data .= $str; fclose($fp); return $data; }
二.整理数据函数。
1.explode()函数,分割字符串。 我们获得的网页数据,会有一大部分是不需要的,为了减少操作,我们需要对其进行裁减,把我们需要的部分留下,然后再使用其它函数进行处理。这里有一个“掐头去尾留中间”的函数: //要被裁减的数据 $pizza = "piece1 piece2 piece3 piece4 piece5 piece6"; //调用 cut()函数 $data = cut($pizza,"piece2","piece5"); //输出:piece3 piece4 print $data;
function cut($file,$from,$end) { //以"piece2"为分隔点对$pizza进行裁减。 //处理后:$data[0]=piece1 // $data[1]=piece3 piece4 piece5 piece6 $data=explode($from,$file);
//再对$data[1]进行裁减,以piece5为分隔点。 //处理后:$data[0]=piece3 piece4 // $data[1]=piece6 $data=explode($end,$data[1]); return $data[0]; } ?> 执行后输出:piece3 piece4,返回piece2和piece5二者之间的所有数据,非常方便。
2.str_replace(),替换数据内容。 由于版面的原因,我举一个简单的例子来说明,相信你一看就会明白: $data="a b c d e f g"; //将$data中的'a',替换成'b' $data=str_replace("a","b",$data); print $data; ?> 程序输出结果:b b c d e f g
3.strip_tags(),过虑HTML代码。 同样,我们举个简单例子: $text = ' Test paragraph.
Other text'; //过虑所有html标签 echo strip_tags($text); echo ' '; //不过虑 and 标签 echo strip_tags($text, '
'); ?> 程序执行结果: Test paragraph. Other text
Test paragraph.
Other text
回想一下刚才的几个函数,功能很强大,又非常简单,这也是PHP程序的特点,下一步我们利用这几个函数写个小偷程序!
文章评论