phantomjs 另类用法
这几天接到了一个数据采集的项目
通过对网站的前期分析得到以下内容
1.网站本身采用.NET开发
2.需抓取内容采用DES加密
虽然得到了前端javascript的加解密算法,但大家也知道跨语言算法想要交互开发难度是相当大的。原打算修改现有php DES算法进行匹配发现难度太大,费时费力。后突然想到是否可以在php中调用js脚本来处理,这也就是本文章重点了phantomjs。其实很简单 第一版本打开网页直接执行解码方法,但用这种方法处理速度会被拉慢,毕竟有个网页访问的过程,之后就想是否可以调用本地自己构造的网页来进行同等的处理呢,我在Windows上测试是可行的,暂未在liunx上进行测试。
首先构造本地网页非常简单,就是一个引用解码脚本的空html文档,名为Demo.html
Document
然后开始写phantomjs处理脚本,名为Model.js
var page = require('webpage').create(); page.open('Demo.html', function (status) { if(status !== 'success' ){ console.log('FAIL'); }else{ var a = '{keys}'; var b = '{encrypt}'; console.log(page.evaluate(function(c,d){ return jsdecrypt(c,d); },a,b)); } phantom.exit(); });
通过phantomjs的api page.evaluate来执行解密方法 ,原打算直接通过命令行直接传参数,发现无法成功,猜测因为加密字符串大小超过命令行最大字符长度。所以只能通过php读入js文件再进行替换了。
最后就是php部分
//模板数据替换 $str=file_get_contents("Model.js");//打开文件 $str=str_replace("{keys}",$a,$str); $str=str_replace("{encrypt}",$b,$str); file_put_contents("Decode.js",$str);//把替换的内容写到js文件中 //解码操作 $command = "phantomjs Decode.js"; print_r (passthru($command)); //因为输出内容为多行所以使用passthru方法
最后说明一下这种方法毕竟是调用第三方程序来处理,肯定比不上原生直接写算法要快,但速度还是可以接受的
我也就抛砖引玉一下,这个模板可以直接套用。