Website screenshots
Asked Answered
B

18

424

Is there any way of taking a screenshot of a website in PHP, then saving it to a file?

Bloomer answered 16/4, 2009 at 19:25 Comment(1)
If you like a drop in solution, have a look at Usersnap - it's a nice service offering accurate website screenshots. You just have to add a small Javascript snippet to your page to make it work.Sunrise
C
291

LAST EDIT: after 7 years I'm still getting upvotes for this answer, but I guess this one is now much more accurate.


Sure you can, but you'll need to render the page with something. If you really want to only use php, I suggest you HTMLTOPS, which renders the page and outputs it in a ps file (ghostscript), then, convert it in a .jpg, .png, .pdf.. can be little slower with complex pages (and don't support all the CSS).

Else, you can use wkhtmltopdf to output a html page in pdf, jpg, whatever.. Accept CSS2.0, use the webkit (safari's wrapper) to render the page.. so should be fine. You have to install it on your server, as well..

UPDATE Now, with new HTML5 and JS feature, is also possible to render the page into a canvas object using JavaScript. Here a nice library to do that: Html2Canvas and here is an implementation by the same author to get a feedback like G+. Once you have rendered the dom into the canvas, you can then send to the server via ajax and save it as a jpg.

EDIT: You can use the imagemagick tool for transforming pdf to png. My version of wkhtmltopdf does not support images. E.g. convert html.pdf -append html.png.

EDIT: This small shell script gives a simple / but working usage example on linux with php5-cli and the tools mentioned above.

EDIT: i noticed now that the wkhtmltopdf team is working on another project: wkhtmltoimage, that gives you the jpg directly

Chemiluminescence answered 16/4, 2009 at 19:48 Comment(2)
Now you mention wkhtmltopdf KnpLabs has a wrapper for it github.com/KnpLabs/snappySnowclad
These were all great solutions a few years back, but the browser tech they are all based on hasn't kept up to date with the latest in HTML5/CSS spec. If you're rendering a site which makes use of webfonts, svg, canvas, flexbox etc then good luck getting an accurate screenshot.. If you do want accurate screenshots check my answer which uses urlboxHairbreadth
C
90

Since PHP 5.2.2 it is possible, to capture a website with PHP solely!

imagegrabscreen — Captures the whole screen

<?php
$img = imagegrabscreen();
imagepng($img, 'screenshot.png');
?>

imagegrabwindow - Grabs a window or its client area using a windows handle (HWND property in COM instance)

<?php
$Browser = new COM('InternetExplorer.Application');
$Browserhandle = $Browser->HWND;
$Browser->Visible = true;
$Browser->Fullscreen = true;
$Browser->Navigate('http://www.stackoverflow.com');

while($Browser->Busy){
  com_message_pump(4000);
}

$img = imagegrabwindow($Browserhandle, 0);
$Browser->Quit();
imagepng($img, 'screenshot.png');
?>

Edit: Note, these functions are available on Windows systems ONLY!

Carola answered 24/12, 2010 at 14:31 Comment(2)
Not really Solely PHP is it?Templetempler
This is using the Internet explorer browser to render stuff.Hepzi
H
61

If you don't want to use any third party tools, I have come across to simple solution that is using Google Page Insight api.

Just need to call it's api with params screenshot=true.

https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=https://stackoverflow.com/&key={your_api_key}&screenshot=true

For mobile site view pass &strategy=mobile in params,

https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=http://stackoverflow.com/&key={your_api_key}&screenshot=true&strategy=mobile

DEMO.

Hbeam answered 12/3, 2014 at 5:36 Comment(6)
This is pretty cool and also seems to work without providing an api key. The image returned is broken though, you need to replace all '_' with '/' and all '-' with '+' and then you can just add it as a data uriColet
This is awesome. I have coded this up at gist.github.com/jaseclamp/d4ac6205db352e822ff6Sagacious
So, for reference, Google's Page Insight API is a third party tool.Madonnamadora
screenshot have a limited resolution to 320x240, is like a thumbFerdy
Nice solution! The only cons with what I encountered here is performance. Get screenshot with this API takes about 3-10 seconds on the average. I think it a bit long :(Gilkey
Example code (with Pagespeed API that returns a JSON object): $url = 'https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url='.$site.'&key='.$apikey; $json = file_get_contents($url); $obj = json_decode($json, true); $screenshot_imgdata = $obj['lighthouseResult']['audits']['screenshot-thumbnails']['details']['items'][0]['data']; echo '<img src="'.$screenshot_imgdata.'">'; - You might want to use the larger final screenshot: $screenshot_imgdata = $obj['lighthouseResult']['audits']['final-screenshot']['details']['data'];Wolverhampton
P
20

You can use simple headless browser like PhantomJS to grab the page.

Also you can use PhantomJS with PHP.

Check out this little php script that do this. Take a look here https://github.com/microweber/screen

And here is the API- http://screen.microweber.com/shot.php?url=https://mcmap.net/q/48108/-website-screenshots

Profant answered 7/8, 2013 at 7:27 Comment(2)
PhantomJS is generally a great solution for this, though when I used it for exactly this purpose, not all HTML interface elements rendered properly.Denyse
screen.microweber.com/shot.php?url=https://stackoverflow.com/… is now a 404 and wondering if the answer here should be deleted. In either case, it should be updated.Urogenous
F
6

There is a lot of options and they all have their pros and cons. Here is list of options ordered by implementation difficulty.

Option 1: Use an API (the easiest)

Pros

  • Execute Javascript
  • Near perfect rendering
  • Fast when caching options are correctly used
  • Scale is handled by the APIs
  • Precise timing, viewport, ...
  • Most of the time they offer a free plan

Cons

  • Not free if you plan to use them a lot

Option 2: Use one of the many available libraries

Pros

  • Conversion is quite fast most of the time

Cons

  • Bad rendering
  • Does not execute javascript
  • No support for recent web features (FlexBox, Advanced Selectors, Webfonts, Box Sizing, Media Queries, HTML5 tags...)
  • Sometimes not so easy to install
  • Complicated to scale

Option 3: Use PhantomJs and maybe a wrapper library

Pros

  • Execute Javascript
  • Quite fast

Cons

  • Bad rendering
  • PhantomJs has been deprecated and is not maintained anymore.
  • No support for recent web features (FlexBox, Advanced Selectors, Webfonts, Box Sizing, Media Queries, HTML5 tags...)
  • Complicated to scale
  • Not so easy to make it work if there is images to be loaded ...

Option 4: Use Chrome Headless and maybe a wrapper library

Pros

  • Execute Javascript
  • Near perfect rendering

Cons

  • Not so easy to have exactly the wanted result regarding:
    • page load timing
    • proxy integration
    • auto scrolling
    • ...
  • Complicated to scale
  • Quite slow and even slower if the html contains external links

Disclaimer: I'm the founder of ApiFlash. I did my best to provide an honest and useful answer.

Firewood answered 7/3, 2019 at 14:5 Comment(0)
H
5

Well, PhantomJS is a browser that can be easily put on a server and integrate it to php. You can find the code in WDudes. They have included lot more features like specifying the image size, cache, download as a file or display in img src etc.

<img src=”screenshot.php?url=google.com” />

URL Parameters

  • Width and Height: screenshot.php?url=google.com&w=1000&h=800

  • With cropping: screenshot.php?url=google.com&w=1000&h=800&clipw=800&cliph=600

  • Disable cache and load fresh screesnhot:
    screenshot.php?url=google.com&cache=0

  • To download the image: screenshot.php?url=google.com&download=true

You can see the tutorial here: Capture Screenshot of a Website using PHP without API

Hesse answered 30/12, 2015 at 1:19 Comment(1)
oh. Sorry about that. Looks like the blog is not anymore. Try github.com/graphcool/chromeless @NarendraVermaHesse
C
4

cutycapt saves webpages to most image formats(jpg,png..) download it from your synaptic, it works much better than wkhtmltopdf

Confidante answered 19/8, 2013 at 19:10 Comment(0)
P
3

I set up finally using microweber/screen as proposed by @boksiora.
Initially when trying the mentioned link here what I got:

Please download this script from here https://github.com/microweber/screen

I'm on Linux. So if you want to run it, you may adjust my step follow to your environment.
Here are the step I did on my shell on DOCUMENT_ROOT folder:

$ sudo wget https://github.com/microweber/screen/archive/master.zip
$ sudo unzip master.zip
$ sudo mv screen-master screen
$ sudo chmod +x screen/bin/phantomjs
$ sudo yum install fontconfig
$ sudo yum install freetype*
$ cd screen
$ sudo curl -sS https://getcomposer.org/installer | php
$ sudo php composer.phar update
$ cd ..
$ sudo chown -R apache screen
$ sudo chgrp -R www screen
$ sudo service httpd restart

Point your browser to screen/demo/shot.php?url=google.com. When you see the screenshot, you are done. Discussion for more advance setting is available here and here.

Primary answered 10/2, 2016 at 18:28 Comment(0)
H
3

There are many open source projects that can generate screenshots. For example PhantomJS, webkit2png etc

The big problem with these projects is that they are based on older browser technology and have problems rendering many sites, especially sites that use webfonts, flexbox, svg and various other additions to the HTML5 and CSS spec over the last couple of months/years.

I've tried a few of the third party services, and most are based on PhantomJS, meaning they also produce poor quality screenshots. The best third party service for generating website screenshots is urlbox.io. It is a paid service, although there is a free 7-day trial to test it out without committing to any paid plan.

Here is a link to the documentation, and below are simple steps to get it working in PHP with composer.

// 1 . Get the urlbox/screenshots composer package (on command line):
composer require urlbox/screenshots

// 2. Set up the composer package with Urlbox API credentials:
$urlbox = UrlboxRenderer::fromCredentials('API_KEY', 'API_SECRET');

// 3. Set your options (all options such as full page/full height screenshots, retina resolution, viewport dimensions, thumbnail width etc can be set here. See the docs for more.)
$options['url'] = 'example.com';

// 4. Generate the Urlbox url
$urlboxUrl = $urlbox->generateUrl($options);
// $urlboxUrl is now 'https://api.urlbox.io/v1/API_KEY/TOKEN/png?url=example.com'

// 5. Now stick it in an img tag, when the image is loaded in browser, the API call to urlbox will be triggered and a nice PNG screenshot will be generated!
<img src="$urlboxUrl" />

For e.g. here's a full height screenshot of this very page:

https://api.urlbox.io/v1/ca482d7e-9417-4569-90fe-80f7c5e1c781/8f1666d1f4195b1cb84ffa5f992ee18992a2b35e/png?url=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F757675%2Fwebsite-screenshots-using-php%2F43652083%2343652083&full_page=true

full page screenshot of stackoverflow.com question powered by urlbox.io

Hairbreadth answered 27/4, 2017 at 8:7 Comment(0)
R
2

I'm on Windows so I was able to use the imagegrabwindow function after reading the tip on here from stephan. I added in cropping (to get rid of the Browser header, scroll bars, etc.) and resizing to get a final image. Here's my code. Hope that helps someone.

Reimport answered 13/5, 2011 at 15:58 Comment(0)
L
1

I used bluga. The api allows you to take 100 snapshots a month without paying, but sometimes it uses more than 1 credit for a single page. I just finished upgrading a drupal module, Bluga WebThumbs to drupal 7 which allows you to print a thumbnail in a template or input filter.

The main advantage to using this api is that it allows you to specify browser dimensions in case you use adaptive css, so I am using it to get renderings for the mobile and tablet layout as well as the regular one.

There are api clients for the following languages:

PHP, Python, Ruby, Java, .Net C#, Perl and Bash (the shell script looks like it requires perl)

Lambrecht answered 18/3, 2012 at 10:45 Comment(0)
R
1

It all depends on how you wish to take the screenshot.

You could do this via PHP, using a webservice to get the image for you

grabz.it has a webservice to do just this, here's an article showing a simple example of using the service.

http://www.phpbuilder.com/articles/news-reviews/miscellaneous/capture-screenshots-in-php-with-grabzit-120524022959.html

Riker answered 16/7, 2012 at 10:50 Comment(0)
F
1

There are some ways in which you can achieve this in PHP, but realistically it's better to delegate this to a non-PHP based API which you can build yourself, or you can pay for. Many people have already listed screenshot APIs in the answers, and you can use any of those to achieve this. My own screenshot API is extremely well tested and covers many rendering cases that most APIs don't cover, but for most people, this is overkill, honestly.

My recommendation is to build your own API using Puppeteer, which is the canonical solution nowadays to build screenshot solutions. My service is built on top of Puppeteer and it really works well for most basic use cases.

You can build a serverless Puppeteer solution on AWS or GCP using something like https://www.npmjs.com/package/chrome-aws-lambda, which is an excellent serverless package for Puppeteer that comes pre-loaded with Chromium.

Ferrari answered 23/7, 2021 at 2:41 Comment(0)
P
0

You can use https://grabz.it solution.

It's got a PHP API which is very flexible and can be called in different ways such as from a cronjob or a PHP web page.

In order to implement it you will need to first get an app key and secret and download the (free) SDK.

And an example for implementation. First of all initialization:

include("GrabzItClient.class.php");

// Create the GrabzItClient class
// Replace "APPLICATION KEY", "APPLICATION SECRET" with the values from your account!
$grabzIt = new GrabzItClient("Sign in to view your Application Key", "Sign in to view your Application Secret");

And screenshoting example:

// To take a image screenshot
$grabzIt->URLToImage("http://www.google.com");  
// Or to take a PDF screenshot
$grabzIt->URLToPDF("http://www.google.com");
// Or to convert online videos into animated GIF's
$grabzIt->URLToAnimation("http://www.example.com/video.avi");
// Or to capture table(s)
$grabzIt->URLToTable("http://www.google.com");

Next is the saving.You can use one of the two save methods, Save if publicly accessible callback handle available and SaveTo if not. Check the documentation for details.

Peculiarity answered 14/6, 2017 at 7:20 Comment(2)
If you're looking for full page screenshots, this provider requires a Professional ($170/yr) subscription.Skirr
The main advantage of Grabzit is that they use a callback when the screenshot is finished. You don't have to continously poll to see if the screenshot is taken.Wolverhampton
P
0

After a lot for surfing on web I found this.

PPTRAAS > A free tool to capture screenshot by passing your URL as a parameter

They provide multiple options by simply hitting their URL.

  1. Get full page screenshot

    https://pptraas.com/screenshot?url={YOU URL HERE}

  2. Get page screenshot of specific size

    https://pptraas.com/screenshot?url={YOU URL HERE}&size=400,400

  3. One can even convert the page to pdf

    https://pptraas.com/pdf?url={YOU URL HERE}

Pansir answered 27/4, 2019 at 11:50 Comment(1)
Josh, when i uploaded the answer, it use to work well, I guess we cant be dependent on this url, please find another alternative as they might have stopped the service for nowPansir
S
-1

Not directly. Software such as Selenium have features like this and can be controlled by PHP but have other dependencys (such as running their java-based server on the computer with the browser you want to screenshot)

Sicyon answered 16/4, 2009 at 19:31 Comment(1)
There are a lot of PHP libraries now available for it. Not exactly a 'PHP' library. Involves some js browser and codes.Hesse
L
-1

you can use cutycapt .

kwhtml is deprecated and show page like old browser.

Louvenialouver answered 22/11, 2016 at 20:56 Comment(0)
A
-1

I've found this to be the best and easiest tool around: ScreenShotMachine. It's a paid service, but you get 100 free screenshots and you can buy another 2,000 for (about) $20, so it's a pretty good deal. It has a very simple usage, you just use a URL, so I wrote this little script to save a file based on it:

<?php
  $url = file_get_contents("http://api.screenshotmachine.com/?key={mykey}&url=https://stackoverflow.com&size=X");

  $file = fopen("snapshots/stack.jpg", "w+");
  fwrite($file, $url);
  fclose($file);
  die("saved file!");
?>

They have a very good documentation here, so you should definitely take a look.

Anechoic answered 25/1, 2018 at 20:40 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.