最近打算做一个网址收藏系统,想到了当用户收藏一个网址的时候,自动根据网址给当前网页拍一张快照,防止对方网页因为外因不能访问导致看不到内容,于是开始尝试根据url给网页截图!
第一种,使用php的函数
1 2 3 |
set_time_limit(60); $im = imagegrabscreen(); imagepng($im, "snap1.png"); |
这种方法我尝试了,可以获取到截图,但是只局限于当前网址…
例如我在phpstorm的控制台运行了php文件,结果把我的编辑器界面截图了…意外…
第二种,使用phantomjs
看到这个东西可以截图,于是我在服务器安装了这个软件,写了js’代码调用截图
1 2 3 4 5 6 7 8 9 10 |
var page = require('webpage').create(); var args = require('system').args; var url = args[1]; var filename = args[2]; setTimeout(function () { page.open(url, function () { page.render(filename); phantom.exit(); }); },1000); |
事实证明这个并没有网上说的那么好用,截出来的图片不是缺东西就是乱码!
如图是我截的微云首页和百度首页
好吧,我放弃了,开始安装php扩展
第三种,使用zhtmltopdf
安装编译就不说了,直接调用截图先看看效果吧!
php简单写了个单例模式的model
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<?php /** * Created by PhpStorm. * User: iyahe@qq.com (天明) * Date: 2017/3/12 * Time: 14:20 */ namespace Common\Model; use Api\Controller\UploadController; use Think\Model; class ImgModel extends Model { private static $_instance; protected static $root; protected $tableName = 'user'; public static function start(){ self::$root = $_SERVER['DOCUMENT_ROOT'].'/Uploads/thumb/'; if(!self::$_instance){ self::$_instance = new self(); } return self::$_instance; } //调用不存在的静态方法跳转到此 public static function __callStatic($name, $arguments) { $_instance = self::start(); return call_user_func_array([$_instance,$name],$arguments); } public function makeImg($url){ set_time_limit(0); $path = self::$root.md5($url).'.jpg'; if(zhtml2img($url,$path)){ return self::uplaod($path); } } public function makePdf($url){ $path = self::$root.md5($url); return zhtml2pdf($url,$path); } public function getImg($url){ $path = self::$root.md5($url).'.jpg'; return zhtml2img($url); } protected static function uplaod($path){ $upload = new UploadController(); return $upload->qiniu($path,'jpg','url'); } } |
调用并且输出内容
1 2 |
$result = ImgModel::start()->makeImg('https://www.baidu.com/'); p($result); |
由于我的最后一步是上传图片到七牛云存储,于是收到结果如下:
1 2 3 4 5 |
Array ( [hash] => Fj5X0QVgOKzRhh8BX7I9k5YomT2q [key] => url/904fd6bb708eff6cb07a9aa2f99be4f2.jpg ) |
截图结果如上,
需要注意的是,原本使用扩展截图也是有乱码,需要在liunx服务器上设置中文并且上传一个中文字体,
官方解释:
一、线上服务器乱码解决:
1)系统的LANG设置为: LANG=zh_CN.UTF-8
2) 缺少字体,可以把本地的字体copy到服务器上 /usr/share/fonts/chinese/TrueType目录下
我把本机电脑的 微软雅黑 字体上传到了服务器的目录!