phantomjs 另类用法

这几天接到了一个数据采集的项目 

通过对网站的前期分析得到以下内容

1.网站本身采用.NET开发

2.需抓取内容采用DES加密

虽然得到了前端javascript的加解密算法,但大家也知道跨语言算法想要交互开发难度是相当大的。原打算修改现有php DES算法进行匹配发现难度太大,费时费力。后突然想到是否可以在php中调用js脚本来处理,这也就是本文章重点了phantomjs。其实很简单 第一版本打开网页直接执行解码方法,但用这种方法处理速度会被拉慢,毕竟有个网页访问的过程,之后就想是否可以调用本地自己构造的网页来进行同等的处理呢,我在Windows上测试是可行的,暂未在liunx上进行测试。

首先构造本地网页非常简单,就是一个引用解码脚本的空html文档,名为Demo.html

 

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script type="text/javascript" src="webdes.js"></script>
</head>
<body>
</body>
</html>


然后开始写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方法


最后说明一下这种方法毕竟是调用第三方程序来处理,肯定比不上原生直接写算法要快,但速度还是可以接受的

 

我也就抛砖引玉一下,这个模板可以直接套用。




 

posted @ 2016-06-23 16:24  GanymedeNil  阅读(226)  评论(0编辑  收藏  举报