之前在携程订机票,好像看到了有一个发票截图的功能,我们邮政官网也有这个功能,当时大致的瞄了一眼,大概知道怎么做的。昨天朋友也有类似的功能,我决定花点点时间实现下,主要用CutyCapt + Xvfb ,当然也有其他的 实现方式例如:selenium+phantomjs,之前有一篇文章模拟登陆淘宝讲了其安装。下面将详细讲解CutyCapt + Xvfb + PHP 的实现:
1.安装前 CutyCapt 依赖 Qt,添加 Qt 源
[root@iZ25510xsyoZ CutyCapt]# vi /etc/yum.repos.d/atrpms.repo
添加以下内容:
[atrpms]
name=CentOS$releasever-$basearch-ATrpms
baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/stable
gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms
gpgcheck=1
enabled=1
[atrpms-testing]
name=CentOS$releasever-$basearch-ATrpmstesting
baseurl=http://dl.atrpms.net/el$releasever-$basearch/atrpms/testing
gpgkey=http://ATrpms.net/RPM-GPG-KEY.atrpms
gpgcheck=1
enabled=1
2. 安装Qt
yum -y install qt47 qt47-devel qt47-webkit qt47-webkit-devel
3. 下载 以及安装 CutyCapt
下载地址:https://svn.code.sf.net/p/cutycapt/code/CutyCapt/ 或者 SVN 直接 co 一份
svn co https://svn.code.sf.net/p/cutycapt/code/CutyCapt/ 里面只有3个文件
[root@iZ25510xsyoZ ~]# mkdir soft
[root@iZ25510xsyoZ ~]# cd /soft
[root@iZ25510xsyoZ soft]# svn co https://svn.code.sf.net/p/cutycapt/code/CutyCapt/
[root@iZ25510xsyoZ soft]# cd CutyCapt/
[root@iZ25510xsyoZ CutyCapt]# qmake-qt47
[root@iZ25510xsyoZ CutyCapt]# make
4. 依赖安装 Xvfb 服务
[root@iZ25510xsyoZ CutyCapt]# yum install Xvfb
[root@iZ25510xsyoZ CutyCapt]# xvfb-run --server-args="-screen 0, 1024x768x24" ./CutyCapt --url=https://www.baidu.com --out=baidu.png
上面一条命令将访问百度首页且截屏,但是会发现截图里面是乱码,因为没有字体库。
安装字体库:
[root@iZ25510xsyoZ CutyCapt]# yum -y groupinstall chinese-support
再次运行命令:
[root@iZ25510xsyoZ CutyCapt]# xvfb-run --server-args="-screen 0, 1024x768x24" ./CutyCapt --url=https://www.youku.com --out=youku.png
至此就安装基本环境安装完成了
6. 结合 PHP
/**
* CutyCapt + Xvfb + PHP 实现网页截屏[我记得携程有这个小功能]
* @filename index.php
* @touch date no
* @author kevin<askyiwang@gmail.com>
* @license http://www.zend.com/license/3_0.txt PHP License 3.0
* @version 1.0.0
* @need php需要开启 exec 函数
*/
$upload_dir = dirname(__FILE__).'/screen';
$target_url = 'https://www.baidu.com';
$output_file_name = 'baidu.png';
$dir_sep = DIRECTORY_SEPARATOR;
$web_path = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"];
$screen_url = dirname($web_path).'/screen/'.$output_file_name;
$screen_size = '1920x1080x24'; # 分辨率
$command = 'xvfb-run --server-args="-screen 0, '.$screen_size.'" /soft/CutyCapt/CutyCapt --url='.$target_url.' --out='.$upload_dir.$dir_sep.$output_file_name.'';
$retval = array();
exec($command, $retval, $status);
if ($status == 0) {
echo '<img src="'.$screen_url.'">';
} else {
echo '截图失败';
}