How to take screenshot of url with PHP
Here is an example and source code of how to take screenshot of url with php. I have taken this code from one of my projects. It is also able to handle https and optionally, follow through with redirects.
Requirements :
-PhantomJS standalone executable(.exe)
-PHP library for phantomjs
Setup :
- Follow the installation for PHP PhantomJS here
- Set the path to your phantomjs executable file in the code
$client->getEngine()->setPath(__DIR__.’/bin/phantomjs.exe’);
Note : You may have to rename /bin/phantomjs to /bin/phantomjs.exe
Additional features :
– customize width/height of screenshot
– support http and https
– follow redirects
require 'vendor/autoload.php'; use JonnyW\PhantomJs\Client; function get_redirect_url($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // Set to true to make curl follow the url curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $a = curl_exec($ch); $url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); // This gets the last location/url after all the redirection has been followed through return $url; } function get_http_response_code($url) { $ch = curl_init($url); curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); return $code; } function is_redirect($url) { $code = get_http_response_code($url); if (($code == 301) || ($code == 302)) { return true; } return false; } function screenshot($width, $height, $url, $filePath="file.jpg", $followRedirect=false) { $path = pathinfo($filePath); $directory = $path['dirname']; if( $followRedirect && is_redirect($url) ) { $redirectedUrl = get_redirect_url($url); echo "{$url} redirects to {$redirectedUrl} <br/>"; $url = $redirectedUrl; } // Ensure the path is writable to PhantomJS/PHP if( !is_writable($filePath) ) { //echo "$directory of $filePath is not writable. Chmod-ing <br />"; //return false; } $client = Client::getInstance(); $client->getEngine()->setPath(__DIR__.'/bin/phantomjs.exe'); // HTTPS support $client->getEngine()->addOption('--ssl-protocol=any'); $client->getEngine()->addOption('--ignore-ssl-errors=true'); $client->getEngine()->addOption('--web-security=false'); $width = $width ? $width : 1280; // Note : Specifying a 800x600 may be too small and result in @media css determining $height = $height ? $height : 800; // it to be a mobile instead of desktop. Generally a 1280x800 should be good. $top = 0; $left = 0; //@see JonnyW\PhantomJs\Http\CaptureRequest $request = $client->getMessageFactory()->createCaptureRequest($url, "GET"); //('http://jonnyw.me', 'GET'); $request->setOutputFile($filePath); $request->setViewportSize($width, $height); $request->setCaptureDimensions($width, $height, $top, $left); $request->setDelay(3); // Depends on how long it takes for the webpage to fully load. this vs setTimeout(x) ? $request->setTimeout(1000); // Not sure the diff between setDelay and setTimeout though... //@see JonnyW\PhantomJs\Http\Response $response = $client->getMessageFactory()->createResponse(); // Send the request $client->send($request, $response); return file_exists($filePath); // Check if screenshot exists }
Be First to Comment