代码小白思路:PHP运行javescript的实现

PHP与SEO 思享 435浏览

一些网站为了验证是真实访客还是爬虫,会使用前端JavaScript来对一些内容进行加密。比如百度在线翻译,我们直接抓包中的sign值就是加密后的结果。这样就意味着,我们直接请求翻译接口,是无法获得翻译结果的。这时候,我们通过运行加密js,就可以实现解密功能。那么,PHP作为后端语言,如何实现呢?

V8js扩展

只要搜一下,基本就知道可以通过v8js扩展来运行js。除此之外,我在网上还看到有一个另外的扩展PHP-JS。我之前发布了《windows系统下怎么安装php-v8js扩展》这是本地电脑用的windows。

代码示例

<?php 
$Js = file_get_contents("js.js");
$v8 = new V8Js();//实例化
$r = '你好';
$v8->str = $r;//传递变量
$result=$v8->executeString($Js);//运行js
echo $result;

我的云服务器是用的linux。而我折腾了几天,无论是编译安装还是找rpm资源安装,都没有成功安装v8js扩展。

因此,我自己琢磨了一下,想到了用nodejs执行js的方法替代

nodejs

宝塔面板软件商店自带nodejs的管理插件,下载安装非常方便,安装完成后使用exec()用nodejs 执行js文件

当然,这又设计到一个问题,我不知道怎么传参数给js,于是又用了一个笨办法,就是直接将变量写入到js文件里,然后再进行执行。

当然,这就存在读取写入,单纯实现功能,如果考虑效率问题,如果有大佬知道有更好地解决办法,还请指正

代码示例

<?php
$keywords = '你好';
$jsfuc = file_get_contents('jsfuc.js');
$handle = fopen('js.js','w');
fwrite($handle, "var str = '$keywords';");
fwrite($handle, "\n");
fwrite($handle, $jsfuc);
fclose($handle);
$result = exec("node js.js");
echo $result;

这种方法相对于编译安装v8js来说,简单太多了,也不知道为啥,编译安装的时候多出几个G来,我的笨办法也挺好

备注:exec函数可能默认是禁用状态,需要开启;如果不能成功可以尝试使用js文件的完整路径

20220914更新

命令行是可以直接传递参数的,可以参考《命令行运行Node.js传递参数》这样就可以省去写入js这么麻烦了

推荐阅读

PHP提示:Warning: count():Parameter must be an array or an object that implements Countable

错误原因:PHP7.2以后,count()函数的参数无效时会抛出warning警告。...

PHP7.4 报错:Deprecated Functionality: implode(): Passing glue string after array is deprecated.

PHP7.4运行项目报错:Deprecated Functionality: implode(): Passing glue string after array is deprecated。只需交换 implode() 函数的两个参数!...

百度自动推送php实现代码

我们知道主动推送有助于搜索引擎抓取和收录网站内容,wordpress或者主流CMS其实已经集成了推送功能。但是如果我们要定期归还,而不是只在发布的时候推一次。这个功能可以通过结合PHP和Pagoda Panel的预定任务来实现。$api = '百度站......