问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

phantomjs 在thinkphp 下怎么用

发布网友 发布时间:2022-04-18 00:32

我来回答

2个回答

懂视网 时间:2022-04-18 04:53

推荐:《PHP视频教程》

php调用phantomJS截图

  • 知识储备

  • *unix系统安装phantomjs,权限相关知识

    基本JavaScript语法知识

    php exec函数调用REPL phantomjs

    phantomjs js截图文档 http://javascript.ruanyifeng.com/tool/phantomjs.html

  • 代码(php 代码环境为yii2框架)

  • <?php
    namespace weapplibraryphantomjs;
    use weapplibraryBizException;
    class ScreenShot
    {
     /** @var string 获取phantomjs 参数中 js文件的决定路径 */
     private $js_path;
     /** @var bool|string 获取php 有777权限的临时文件目录 */
     private $temp_dir;
     function __construct()
     {
     $dir = __DIR__;
     $this->js_path = "{$dir}/script.js";
     /** @var bool|string 获取php 有777权限的临时文件目录 */
     $this->temp_dir = Yii::getAlias('@runtime');
     }
     /**
     * 截图并上传
     * @param string $url
     * @param string $filename
     * @return string
     * @throws BizException
     */
     public function screenShotThenSaveToOss(string $url, string $filename = 'temp.jpg')
     {
     //输出图片的路径
     $outputFilePath = "{$this->temp_dir}/$filename";
     //执行的phantomjs命令
     //phantomjs 可执行文件必须是 绝对路径 否则导致 exec 函数返回值127错误
     $cmd = "usrlocalinphantomjs {$this->js_path} '$url' '$outputFilePath'";
     //捕捉不到phantomjs命令输出结果
     exec($cmd, $output);
     //检查截图文件是否存在
     $isShotImgaeExist = file_exists($outputFilePath);
     if (!$isShotImgaeExist) {
      throw new BizException(0, 'phantomjs截图失败', BizException::SELF_DEFINE);
     }
     //保存截图到oss
     $result = $this->postScreenShotImageToOss($outputFilePath);
     //删除临时文件夹的截图图片
     unlink($outputFilePath);
     return $result;
     }
     /**
     * 上传截图到阿里云直传oss
     * @param string $screenshot_path
     * @return string
     */
     public function postScreenShotImageToOss(string $screenshot_path): string
     {
     $ossKey = 'raw_file_name';
     $file = new CURLFile($screenshot_path, 'image/jpeg', 'file');
     $tokenArray = $this->getOssPolicyToken('fetch');
     $url = $tokenArray->host;
     $postData = [
      'key' => "{$tokenArray->dir}/$ossKey",
      'policy' => $tokenArray->policy,
      'OSSAccessKeyId' => $tokenArray->accessid,
      'success_action_status' => '200',
      'signature' => $tokenArray->signature,
      'callback' => $tokenArray->callback,
      'file' => $file
     ];
     $ch = curl_init();
     //$data = array('name' => 'Foo', 'file' => '@/home/user/test.png');
     curl_setopt($ch, CURLOPT_URL, $url);
     // Disable SSL verification
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
     curl_setopt($ch, CURLOPT_POST, 1);
     curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true); // required as of PHP 5.6.0
     curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     curl_setopt($ch, CURLOPT_TIMEOUT, 20);
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
     //curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: $mime_type"]);
     $res = curl_exec($ch);
     $res = json_decode($res);
     curl_close($ch);
     if (empty($res) || $res->code != 0) {
      return '';
     } else {
      return $res->data->url;
     }
     }
     /**
     * 调用管理后台阿里云oss token接口
     * @param null $url
     * @return array
     */
     public function getOssPolicyToken($url = null)
     {
     $url = Yii::$app->params['oss_screen_shot_token_api'];
     $ch = curl_init();
     // Disable SSL verification
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
     // Will return the response, if false it print the response
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     // Set the url
     curl_setopt($ch, CURLOPT_URL, $url);
     // Execute
     $result = curl_exec($ch);
     // Closing
     curl_close($ch);
     $res = json_decode($result);
     if (empty($res) || $res->code != 0) {
      return [];
     } else {
      return $res->data;
     }
     }
    }
    phantomjs javascript脚本内容
    "use strict";
    var system = require('system');
    var webPage = require('webpage');
    var page = webPage.create();
    //设置phantomjs的浏览器user-agent
    page.settings.userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1';
    //获取php exec 函数的命令行参数
    if (system.args.length !== 3) {
     console.log(system.args);
     console.log('参数错误');
     console.log('第2个参数为url地址 第3个参数为截图文件名称');
     phantom.exit(1);
    }
    //命令行 截图网址参数
    var url = system.args[1];
    //图片输出路径
    var filePath = system.args[2];
    console.log('-------');
    console.log(url);
    console.log('-------');
    console.log(filePath);
    console.log('-------');
    //设置浏览器视口
    page.viewportSize = {width: 480, height: 960};
    //打开网址
    page.open(url, function start(status) {
     //1000ms之后开始截图
     setTimeout(function () {
     //截图格式为jpg 80%的图片质量
     page.render(filePath, {format: 'jpg', quality: '80'});
     console.log('success');
     //退出phantomjs 避免phantomjs导致内存泄露
     phantom.exit();
     }, 1000);
    });

    热心网友 时间:2022-04-18 02:01

    PhantomJS 是一个基于WebKit的服务器端 JavaScript API。它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, 和 SVG。PhantomJS可以用于页面自动化,网络监测,网页截屏,以及无界面测试等。
    已经是服务端的了,怎么还能跟thinkPHP一起使用呢?
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    草青青,青青草,草上接谢珍珠宝,怕日晒怕风摇,摇看珍珠得起早 谜底是... 一加9R要不要升级ColorOS 13正式版 一加9pro怎么coloros12一加9pro升级coloros12的方法 coloros12支持哪些一加机型?coloros12支持一加机型介绍 一加9pro如何coloros12?一加9pro升级coloros12的方法 一加9pro升级coloros12拍照改善吗 我是一个高中生,职教的,我们班上有5个女生,我喜欢有一个,但追她又有... 自动挡d挡旁边的 -是什么意思? 自动挡位上的加减是什么意思? 宣传这个职位是干什么的 网上可不可以看到周汝昌的红楼真梦 红楼梦究竟有几多本续本? 请教:书籍《红楼梦》有几个版本,哪个版本好? 佳能的胶片照相机镜头能配哪种数码单反机? 佳能胶片相机哪款好 佳能的胶片单反相机现在还值得买吗? i’m finished 什么意思 佳能胶片机E0S1V可以自动识别lS0嘛? 1.秋季吃什么水果可以清火? 秋季上火吃什么水果降火 怎样使用春雨计步器手机才不会黑屏死机 春雨计步器金币如何使用 春雨计步器对vivoy23有用吗 步步高x3l怎么使用春雨计步器 春雨计步器怎么用,没有找到暂停按钮 春雨计步器如何开启计步? 春雨计步器如何用 怎样使用春雨计步器 梦见跟小学同学,重新在一起课 梦见儿子和女同学一起补课 ~问~APH,黑塔利亚角色歌 名字~ 黑塔利亚角色歌及歌词 求黑塔利亚角色歌 爸爸姓鲁,妈妈姓刘,男孩,女孩还不知道,大家给起个名吧!小名也顺便起个吧!今年11月20以后出生 怎样给属兔的女儿取小名 兔年3月生的男宝宝娶什么小名好呢? 办理社保卡的地方叫什么?你知道吗? 医保卡到哪里补办? 上木下桑是哪位历史人物 上木下桑是什么人? gitea的初始化sql存在哪里? 国家开发银行金融债券有风险吗?可以买吗?看到中行公告了,为期1年,不知道有没有风险 张梓欣这个名字得多少分 女孩名字张梓欣名字好吗? 忙帮我侄女起个名字,姓张,2012年12月31日下午4点整出生。 我想改一个名字 张子涵 张梓涵 张子欣 张梓欣 哪个好 姓张,2019年5月19号早上七点五十三分生的女孩 跪求一个四个字名字,一经采用,必重谢!! 02年农历5.14 5:55分 姓张 男 取什么名好? 女孩子,蛇年出生 姓张,名字想取名张梓( ),麻烦各位了! 求助:姓张,2013年9月16日上午12点出生的女孩,取什么名字好?