TYPECHO WIKI
每一个作品都值得被记录

PHP+NodeJs后端给网站截图

Typecho维基君资源分享 • 826次浏览 • 发布 2022-07-14 • 更新 2022-07-14

有些导航站提交网站后会把网站截图并且在详情页会附带网页截图,例如这个 博客大全:blogwe.com

挺好奇怎么实现的,所以了解到了这两个开源项目:PuppeteerPuPHPeteer

注意:需要安装 NodeJs 8+ 的版本

设置 NodeJs 镜像(如果你是第一次安装 NodeJs):

npm config set registry https://registry.npm.taobao.org --global

安装 Puppeteer:

npm i puppeteer

安装 PuPHPeteer:

npm install @nesk/puphpeteer

为了方便实现功能和测试,使用了 Laravel 8 进行安装该项目。

安装 PuPHPeteer:

composer require nesk/puphpeteer

在 Laravel 8 安装 PuPHPeteer 后,创建一个控制器:

php artisan make:controller ImageController

在路由 web.php 中引入(这是 Laravel 8 的新特性):

use App\Http\Controllers\ImageController;

继续在路由写入:

Route::get('create_image', [ImageController::class, 'create']);

在控制器引入:

use Nesk\Puphpeteer\Puppeteer;

在控制器写入 create 方法后访问测试:

public function create()
{
  $puppeteer =  new Puppeteer;
  $browser =  $puppeteer->launch();
  $page = $browser->newPage();
  $page->goto('https://www.bubaijun.com');
  $page->screenshot(['path'=>'example.png']);
  $browser->close();
}

此时访问的页面是空白的,因为没有 return ,打开 public 目录可以看到有一个 example.png 文件,该文件如下:

1.png

可以看到图片尺寸有点小,可以将 create 方法改成这样:

public function create()
{
    $puppeteer = new Puppeteer;

    $browser = $puppeteer->launch();
    
    $page = $browser->newPage();
    
    $page->setViewport(['width' => 1920, 'height' => 1440]);
    
    $page->goto('https://www.bubaijun.com');
    
    $page->screenshot(['path' => 'example.png']);
    
    $browser->close();

}

也就是在 newPage 方法后可以调用 setViewport 方法进行设置页面大小。

具体的相关文档:https://github.com/puppeteer/puppeteer/blob/main/README.md#usage

https://github.com/puppeteer/puppeteer/blob/v5.4.0/docs/api.md#pagesetviewportviewport

以上文档是 NodeJs 的,需要看懂后稍微修改在 PHP 进行调用。

最后说一下,截图所需的时间受影响的因素很多,所以最好放入队列运行。

截图的图片文件还挺大的,截图了一下 1920 * 1440 现在这个博客首页,图片文件是 916K. 可以适当使用一下压缩,博主用工具压缩后只有 344K.

截出来的图:

2.png

广告声明:文内含有的对外跳转链接(包括不限于超链接、二维码、口令等形式),用于传递更多信息,节省甄选时间,结果仅供参考,Typecho.Wiki所有文章均包含本声明。
厂商投放

【腾讯云】🎉五一云上盛惠!云服务器99元/月续费同价!

腾讯云五一劳动节海量产品 · 轻松上云!云服务器首年1.8折起,买1年送3个月!超值优惠,性能稳定,让您的云端之旅更加畅享。快来腾讯云选购吧!

广告
添加新评论 »