急用,求高手,fsockopen获取人人网,gzip格式怎么转换?

PLLLG 2011-01-09 06:50:57
$host="www.renren.com";
$request="GET / HTTP/1.1\r\nAccept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*\r\nAccept-Language: zh-cn\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)\r\nAccept-Encoding: gzip, deflate\r\nHost: www.renren.com\r\nConnection: Keep-Alive\r\nCookie: _r01_=1; depovince=GW\r\n\r\n";

$fp=fsockopen($host,80);
fputs($fp,$request);
$result="";
while(!feof($fp)){
$result.=fgets($fp,1024);
}
fclose($fp);

echo $result;

获取到的是Content-Encoding: gzip乱码
如果把Accept-Encoding: gzip, deflate改为Accept-Encoding: deflate可以
但是我想直接把gzip解压缩成正常代码
用gzuncompress 已经将http头去掉 还是提示data error
用其他函数直接显示空白
那位高手帮忙看下,急用。。。谢谢
...全文
464 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bengkuidejianli 2012-09-15
  • 打赏
  • 举报
回复
为嘛是PHP的。。。 先哭一会儿。
3467 2012-03-12
  • 打赏
  • 举报
回复
呵呵,看看
skyaspnet 2011-01-10
  • 打赏
  • 举报
回复
如果是直接获取静态源代码的话,可以考虑使用CRUL类来完成,然后再进行相应操作,感觉会更简单一些
LuciferStar 2011-01-10
  • 打赏
  • 举报
回复
nAccept-Encoding: gzip, deflate
把这个从request里去掉即可。
ihefe 2011-01-10
  • 打赏
  • 举报
回复
试试接收字符串后 gzuncompress解压。 注意编码一致
LuciferStar 2011-01-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fxs_2008 的回复:]
1楼用的解码法;
2楼是发送请求时不发送支持解码信息,这样服务器一般不Response压缩数据。
[/Quote]
嗯,用这个方法,明确告知服务器我不支持压缩,结果服务器就乖乖地不压缩了^_^。屡试不爽。
fxs_2008 2011-01-10
  • 打赏
  • 举报
回复
1楼用的解码法;
2楼是发送请求时不发送支持解码信息,这样服务器一般不Response压缩数据。
foolbirdflyfirst 2011-01-10
  • 打赏
  • 举报
回复
主要是两个问题

#1.返回头Transfer-Encoding: chunked表明是chunked的传输编码,这个意思是,服务器分批把http body返回给你
比如http body如下

2 --表示下一个chunked的长度为2,这个数字是16进制,不是10进制
ab -- 长度为2的串
3 -- 同上
abc -- 长度为3的串
1 -- 同上
a -- 长度为1的串
0 -- 长度为0,这个是结束标识

所以最终的http body应该是ababca ,长度标识是不需要的。

#2.经过deflate的http body需要忽略前10个字符.

header("content-type:text/html;charset=utf-8");
$host="www.renren.com";
$request="GET / HTTP/1.1\r\n"
."Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*\r\n"
."Accept-Language: zh-cn\r\n"
."User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)\r\n"
."Accept-Encoding: gzip, deflate\r\n"
."Host: www.renren.com\r\n"
."Connection:close\r\n"
."Cookie: _r01_=1; depovince=GW\r\n\r\n";

$fp=fsockopen($host,80);
fputs($fp,$request);
$result="";
while(!feof($fp)){
$result.=fgets($fp,1024);
}
fclose($fp);
$hb = explode("\r\n\r\n",$result);//分隔http head和body
$body = $hb[1]; //http body
$chunk = strtok($body,"\r\n");//获取第一个chunked string的16进制串长标识
while( $len = (hexdec($chunk) + 0) ) //最后一个chunked string的串长铁定是0,这是协议规范
{
$start = strlen($chunk) + 2;//从chunked标识后读取串, +2是因为还要考虑"\r\n"
$bd .= substr($body , $start , $len );//读取真正要decode的http body
$body = substr($body , $start + $len + 2); //body把上一个chunked去掉
$chunk = strtok($body,"\r\n");//查找下一个chunked长度标识
}
echo gzinflate(substr($bd,10));//忽略前10个字符

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧