碰到一个非常隐蔽的错误

由于种种原因,不得以使用XMLHTTP对象来抓取网页。这个网页的验证需要发送小甜饼,根据以前的经验,MSXML2.ServerXMLHTTP对象是可以保存小甜饼并在下一次请求的时候发送在上一次请求时获得的小甜饼的。
首先我是在PHP中使用的,在PHP中创建一个com的XMLHTTP对象,然后访问一次首页,再访问实际要抓取的网页。按理说XMLHTTP应该能在首页获取小甜饼然后发送给服务器进行身份验证,然后抓取到正确的网页。但郁闷的是,这个PHP页面并没有输出我想要的结果。
怎么想也想不通,后来又在ASP中使用XMLHTTP对象来重复这一过程,可还是没能得到预期的结果。
后来我用vbs写了一个脚本来完成同样的事情,可奇怪的是,当我在命名行中运行这个脚本时,输出的确实正确的结果。我也没想着么多,既然在PHP和ASP中直接使用XMLHTTP都不能得到正确的结果,那我就用PHP的exec函数来执行这个vbs,然后让vbs返回结果。按照这个思路,我写了几行PHP代码来测试,最奇怪的事情在这时发生了,当我打开这个PHP页面的时候,返回的结果竟然和直接使用PHP调用XMLHTTP对象的结果是相同的。我很奇怪,又回到命名行去运行这个vbs,可得到的结果确实正确的!这就非常奇怪了,同一个vbs,在命令行中执行是正确的,用PHP调用就得不到正确的结果,诡异,诡异至极。
最后仔细想了一下,得到了一个听起来很不可能的结论:PHP直接调用XMLHTTP对象和PHP执行这个vbs的时候,是以SYSTEM用户身份去执行的,所以这时候的XMLHTTP也是由SYSTEM用户去使用的,而SYSTEM这个用户不是桌面用户,于是XMLHTTP对象就不会使用小甜饼。而我在命令行中执行这个vbs的时候,使用的是我当前登录的用户,于是XMLHTTP就使用了小甜饼,最后得到了正确的结果。
按照这个猜测,我把Apache服务的运行账户改成我当前的用户,重启,再次使用PHP直接调用XMLHTTP对象,好,这回得到的结果果然是正确的了。

本文发表于 偶的动态,并添加了 标记。保存永久链接到书签。

发表评论

电子邮件地址不会被公开。