手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:snoopy

snoopy的缺陷与CURL的强大

在使用PHP进行POST和GET的时候,如果为了简单的应用,大多情况下,我们都采用了fsockopen,于是snoopy就成了我们的最佳选择。可惜,并非所有POST都可以通过snoopy来完成。毕竟,在snoopy中,POST的方式,即类似FORM的entype只支持两种 :application/x-www-form-urlencoded和multipart/form-data,一个是针对FORM中的变量,一个是针对文件上传。一般来说这两种足够了。但昨天发现了一个问题。那就是。。。http://www.baidu.com/search/blogsearch_help.html#n7
baidu和google其他一样,都提供了blogsearch的ping服务,因此,你发表博客后,可以通知一下百度,你的博客更新了。
于是昨天尝试着用snoopy来进行POST发送。结果。。。一直失败,提示无法连接80端口,再看一下百度的说明:

XML/HTML代码
  1. ping-service对非POST方法请求返回HTTP_METHOD_NOT_ALLOWED(405)错误代码,对超大错误包返回 HTTP_REQUEST_ENTITY_TOO_LARGE(413)错误代码,对非“text/xml”请求包返回 HTTP_UNSUPPORTED_MEDIA_TYPE(415)错误代码。  
  2. 其他情况返回HTTP_OK(200)代码,xml-rpc响应http包体为一个xml文档,含有一个int值,0表示推送成功,其他值表示推送失败,目前只有0和1。  

而snoopy在连接的时候是需要先fsockopen,打开80端口的连接后才能发送数据。。。所以,死活连接不上了。最后,用了curl。。。短短几行代码就解决了。。
事实上,即使snoopy能够连接上百度的ping服务,也没有办法提交,因为$snoopy->submit()方法的第二个参数必须是数组。众所周知,FORM提交都是由name对应着value的。snoopy正是这样操作的,他无法直接把一个字符串不对应name就提交。。。

以下是curl代码:

XML/HTML代码
  1. set_time_limit( 0 );  
  2. $url = "http://ping.baidu.com/ping/RPC2";  
  3. $data = '<?xml version="1.0" encoding="UTF-8"?>  
  4. <methodCall>  
  5. <methodName>weblogUpdates.extendedPing</methodName>  
  6. <params>  
  7. <param>  
  8. <value><string>百度的空间</string></value>  
  9. </param>  
  10. <param>  
  11. <value><string>http://hi.baidu.com/baidu/</string></value>  
  12. </param>  
  13. <param>  
  14. <value><string>http://hi.baidu.com/baidu/blog/item/5e8b10d574e971cd50da4b74.html</string></value>  
  15. </param>  
  16. <param>  
  17. <value><string>http://hi.baidu.com/baidu/rss</string></value>  
  18. </param>  
  19. </params>  
  20. </methodCall>';  
  21.   
  22.   
  23.   
  24. $header[]="Content-Type: text/xml; charset=utf-8";  
  25.   
  26. $ch = curl_init();  
  27. curl_setopt($ch, CURLOPT_URL, $url);  
  28. curl_setopt($ch, CURLOPT_HTTPHEADER, $header);  
  29. curl_setopt($ch, CURLOPT_POST, 1);  
  30. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);  
  31. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  
  32. curl_setopt($ch, CURLOPT_HEADER, 0);  
  33. $res = curl_exec($ch);  
  34. curl_close($ch);   
  35. echo '<pre>';  
  36. print_r( htmlspecialchars($res) );  
  37. echo '</pre>';  

Tags: snoopy, curl

Snoopy更新

snoopy是在系统不支持curl的情况下所采用的抓取网络信息最有用的工具之一,因为他可以模拟POST,GET等方法,而无须让你再向以前一样用fsockopen,写上一大堆代码。

这样的一个类库,在目前被PHP的使用者广泛应用着,本来以为他就这样的一直不再更新下去,不料最近还是有了一些改动,当然这些改动都是一些BUG fix,而且是安全方面的,建议下载后更新。

更新情况:

Posted By: mohrt
Date: 2008-10-22 22:54
Summary:
Snoopy 1.2.4 security fix

A security vulnerability was fixed in the latest 1.2.4 version of Snoopy. It was possible to send shell commands through https url fetches that are not properly sanitized by the PHP program using Snoopy.

下载页面为:

http://sourceforge.net/project/showfiles.php?group_id=2091

Tags: snoopy, fsocketopn