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程序的特点,下一步我们利用这几个函数写个小偷程序!
文章评论