web-dev-qa-db-fra.com

Captures d'écran du site

Est-il possible de prendre une capture d'écran d'un site Web en PHP, puis de l'enregistrer dans un fichier?

400
Tom

LAST EDIT : après 7 ans, je reçois toujours des votes positifs pour cette réponse, mais je suppose que celui-ci est maintenant beaucoup plus précis.


Bien sûr, vous pouvez, mais vous devrez rendre la page avec quelque chose. Si vous voulez vraiment utiliser uniquement php, je vous suggère HTMLTOPS , qui rend la page et la renvoie dans un fichier ps (ghostscript), puis convertissez-la en .jpg, .png, .pdf .. peut être un peu plus lent avec des pages complexes (et ne supporte pas tous les CSS).

Sinon, vous pouvez utiliser wkhtmltopdf pour générer une page html au format pdf, jpg, peu importe .. Acceptez CSS2.0, utilisez le Webkit (le wrapper de safari) pour afficher la page .., donc ça devrait aller. Vous devez également l'installer sur votre serveur.

UPDATE Maintenant, avec les nouvelles fonctionnalités HTML5 et JS, il est également possible de rendre la page dans un objet de dessin à l'aide de JavaScript. Voici une belle bibliothèque pour le faire: Html2Canvas et voici une implémentation du même auteur pour obtenir un retour comme G +. Une fois que vous avez rendu le dom dans le canevas, vous pouvez ensuite l'envoyer au serveur via ajax et l'enregistrer au format jpg.

EDIT: Vous pouvez utiliser l'outil imagemagick pour transformer un fichier pdf en png. Ma version de wkhtmltopdf ne prend pas en charge les images. Par exemple. convert html.pdf -append html.png.

EDIT: Ce petit script Shell donne un exemple d'utilisation simple/fonctionnel sur linux avec php5-cli et les outils mentionné ci-dessus.

EDIT: j’ai remarqué que l’équipe wkhtmltopdf travaille sur un autre projet: wkhtmltoimage, qui vous donne directement le jpg

274
Strae

Depuis PHP 5.2.2 il est possible de capturer un site Web avec PHP uniquement!

imagegrabscreen - Capture tout l'écran

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

imagegrabwindow - Saisit une fenêtre ou sa zone client à l'aide d'un descripteur de fenêtre (propriété HWND dans une instance COM)

<?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: Remarque, ces fonctions sont disponibles sur les systèmes Windows uniquement!

87
stephan

Si vous ne souhaitez utiliser aucun outil tiers, je suis tombé sur une solution simple utilisant Google Page Insight api.

Il suffit d'appeler c'est api avec les paramètres screenshot=true.

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

Pour la vue du site mobile, passez &strategy=mobile dans les paramètres,

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

DÉMO .

53
Rikesh

Vous pouvez utiliser un simple navigateur sans tête, comme PhantomJS, pour saisir la page.

Aussi, vous pouvez utiliser PhantomJS avec PHP.

Découvrez ce petit script php qui fait cela. Jetez un oeil ici https://github.com/microweber/screen

Et voici l'API- http://screen.microweber.com/shot.php?url=https://stackoverflow.com/questions/757675/website-screenshots-using-php

19
boksiora

Cela devrait être bon pour vous:

https://wkhtmltopdf.org/

Assurez-vous de télécharger la distribution wkhtmltoimage!

17
Christian

Oui. Vous aurez besoin de certaines choses que:

Voir khtmld (aemon) sur * nx. Voir rl2Jpg pour Windows, mais comme il s'agit de l'application dotNet, vous devriez également vérifier rl2Bmp

Les deux sont des outils de console que vous pouvez utiliser à partir de votre application Web pour obtenir la capture d'écran.

Il existe également des services Web qui l'offrent. Vérifiez this par exemple.

Modifier:

Ce lien est utile pour.

10
majkinetor

C'est en Python, mais en parcourant la documentation et le code, vous pouvez voir exactement comment cela est fait. Si vous pouvez exécuter python, c'est une solution toute faite pour vous:

http://browsershots.org/

Notez que tout peut fonctionner sur une machine pour une plate-forme ou sur une machine avec des machines virtuelles exécutant les autres plates-formes.

Gratuit, source ouverte, faites défiler vers le bas de la page les liens vers la documentation, le code source et d’autres informations.

10
Adam Davis

Oui, ça l'est. Si vous avez seulement besoin d'une image d'URL, essayez ceci

<img src='http://zenithwebtechnologies.com.au/thumbnail.php?url=www.subway.com.au'>

Transmettez l'URL en argument et vous obtiendrez l'image pour plus de détails en cliquant sur ce lien http://zenithwebtechnologies.com.au/auto-thumbnail-generation-from-url.html

5
Mee

Eh bien, PhantomJS est un navigateur qui peut être facilement mis sur un serveur et l’intégrer à php. Vous pouvez trouver le code dans WDudes. Ils ont inclus beaucoup plus de fonctionnalités telles que la spécification de la taille de l'image, le cache, le téléchargement sous forme de fichier ou l'affichage dans img src, etc.

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

Paramètres d'URL

  • Largeur et hauteur: screenshot.php? Url = google.com & w = 1000 & h = 800

  • Avec le recadrage: screenshot.php? Url = google.com & w = 1000 & h = 800 & clipw = 800 & cliph = 600

  • Désactiver le cache et charger un nouveau screesnhot:
    screenshot.php? url = google.com & cache = 0

  • Pour télécharger l'image: screenshot.php? Url = google.com & download = true

Vous pouvez voir le tutoriel ici: Capture d'écran d'un site Web à l'aide de PHP sans API

4
Gijo Varghese

J'utilise toujours écran microweber pour capturer une capture d'écran de n'importe quelle page Web. Ici nous pouvons trouver un tutoriel bien écrit . Ceci est plus facile et ne devrait pas prendre plus de 3 minutes pour apprendre.

4
Rinku

cutycapt enregistre les pages Web dans la plupart des formats d'image (jpg, png ..). Téléchargez-le à partir de votre synaptique, cela fonctionne beaucoup mieux que wkhtmltopdf

4
wolfgang

Il existe de nombreux projets open source pouvant générer des captures d'écran. Par exemple, PhantomJS, webkit2png, etc.

Le gros problème de ces projets est qu’ils reposent sur une technologie de navigateur plus ancienne et rencontrent des difficultés pour restituer de nombreux sites, en particulier des sites utilisant des polices Web, des polices flexbox, des svg et divers autres ajouts aux spécifications HTML5 et CSS au cours des derniers mois/années.

J'ai essayé quelques-uns des services tiers, et la plupart sont basés sur PhantomJS, ce qui signifie qu'ils produisent également des captures d'écran de mauvaise qualité. Le meilleur service tiers pour la génération de captures d'écran de sites Web est urlbox.io . Il s'agit d'un service payant, bien qu'il existe un essai gratuit de 7 jours pour le tester sans vous engager dans un forfait payant.

Voici un lien vers la documentation , et voici quelques étapes simples pour la faire fonctionner dans PHP avec 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" />

Par exemple voici une capture d'écran pleine hauteur de cette page:

https://api.urlbox.io/v1/ca482d7e-9417-4569-90fe-80f7c5e1c781/8f1666d1f4195b1cb84ffa5f992ee18992a2b35e % 2Fwebsite-screenshots-using-php% 2F43652083% 2343652083 & full_page = true

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

3
cjroebuck

Je me suis finalement installé en utilisant microweber/screen tel que proposé par @boksiora.
Initialement en essayant le lien mentionné ici ce que j'ai obtenu:

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

Je suis sous Linux. Donc, si vous voulez l'exécuter, vous pouvez ajuster mon étape en fonction de votre environnement.
Voici l'étape que j'ai effectuée sur mon shell dans le dossier DOCUMENT_ROOT:

$ 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

Pointez votre navigateur sur screen/demo/shot.php?url=google.com. Lorsque vous voyez le capture d'écran , vous avez terminé. La discussion pour un réglage plus avancé est disponible ici et ici .

3
Chetabahana

Je suis sous Windows, donc j’ai pu utiliser la fonction imagegrabwindow après avoir lu le conseil de stephan. J'ai ajouté dans le recadrage (pour se débarrasser de l'en-tête du navigateur, les barres de défilement, etc.) et le redimensionnement pour obtenir une image finale. Voici mon code . J'espère que ça aide quelqu'un.

2

webkit2html fonctionne sur Mac OS X et Linux, il est assez simple à installer et à utiliser. Voir ce tutoriel .

Pour Windows, vous pouvez utiliser CutyCapt , qui possède des fonctionnalités similaires.

1
Piskvor

Il y a beaucoup d'options et ils ont tous leurs avantages et leurs inconvénients. Voici la liste des options classées par difficulté de mise en œuvre.

Option 1: Utiliser une API (la plus simple)

Pros

  • Exécuter Javascript
  • Rendu presque parfait
  • Rapide lorsque les options de mise en cache sont correctement utilisées
  • L'échelle est gérée par les API
  • Chronométrage précis, fenêtre d'affichage, ...
  • La plupart du temps, ils offrent un plan gratuit

Inconvénients

  • Pas gratuit si vous prévoyez de les utiliser beaucoup

Option 2: Utilisez l'une des nombreuses bibliothèques disponibles

Pros

  • La conversion est assez rapide la plupart du temps

Inconvénients

  • Mauvais rendu
  • N'exécute pas javascript
  • Absence de prise en charge des fonctionnalités Web récentes (FlexBox, sélecteurs avancés, polices Web, dimensionnement de boîtes, requêtes multimédias, balises HTML5, etc.).
  • Parfois pas si facile à installer
  • Compliqué à l'échelle

Option 3: Utiliser PhantomJs et peut-être une bibliothèque de wrapper

Pros

  • Exécuter Javascript
  • Tres rapide

Inconvénients

  • Mauvais rendu
  • PhantomJs est obsolète et n'est plus maintenu.
  • Absence de prise en charge des fonctionnalités Web récentes (FlexBox, sélecteurs avancés, polices Web, dimensionnement de boîtes, requêtes multimédias, balises HTML5, etc.).
  • Compliqué à l'échelle
  • Pas facile de le faire fonctionner s'il y a des images à charger ...

Option 4: Utiliser Chrome Headless et peut-être une bibliothèque d'encapsuleurs

Pros

  • Exécuter Javascript
  • Rendu presque parfait

Inconvénients

  • Pas si facile d'avoir exactement le résultat souhaité concernant:
    • moment du chargement de la page
    • intégration de proxy
    • défilement automatique
    • ...
  • Compliqué à l'échelle
  • Assez lent et encore plus lent si le code HTML contient des liens externes

Avertissement: Je suis le fondateur d'ApiFlash. J'ai fait de mon mieux pour fournir une réponse honnête et utile.

1

Tout dépend de la manière dont vous souhaitez prendre la capture d'écran.

Vous pouvez le faire via PHP, en utilisant un service Web pour obtenir l'image pour vous.

pour ce faire, grabz.it propose un service Web. Voici un article présentant un exemple simple d'utilisation du service.

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

1
Andrew

Vous pouvez utiliser la solution https://grabz.it .

Il possède une API PHP qui est très flexible et peut être appelée de différentes manières, par exemple à partir d'un cronjob ou d'une page Web PHP.

Pour l'implémenter, vous devez d'abord obtenir un clé et secret de l'application et télécharger le SDK (gratuit).

Et un exemple pour la mise en œuvre. Tout d'abord l'initialisation:

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");

Et exemple de capture d'écran:

// 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");

Ensuite, vous enregistrez. Vous pouvez utiliser l’une des deux méthodes de sauvegarde, Save si le descripteur de rappel accessible au public est disponible et SaveTo si ce n’est pas le cas. Consultez la documentation pour details .

1
Johnny

J'ai utilisé bluga . L'API vous permet de prendre 100 instantanés par mois sans payer, mais il utilise parfois plus d'un crédit pour une seule page. Je viens de terminer la mise à niveau d'un module drupal, Bluga WebThumbs vers drupal 7, qui vous permet d'imprimer une vignette dans un modèle ou un filtre de saisie.

Le principal avantage de l'utilisation de cette API est qu'elle vous permet de spécifier les dimensions du navigateur au cas où vous utiliseriez des CSS adaptatifs. Je l'utilise donc pour obtenir des rendus pour la présentation mobile et celle de la tablette, ainsi que pour la présentation standard.

Il y a des clients api pour les langues suivantes:

PHP , Python , Ruby , Java , . C # Net , - Perl et Bash (le script shell semble nécessiter Perl)

1
Arosboro

J'ai écrit une application sale et rapide l'autre jour pour le faire à l'aide de l'API Google. Très certainement des possibilités d'amélioration ...

  • Il utilise la dernière version de Google API 5.
  • Taille de l'image maintenant 500px large
  • Prend en charge la vue de bureau et mobile
  • Enregistrer dans un fichier dans un dossier spécifié
  • Incorporer un système de cache rudimentaire

Trouvez-le ici avec un démo en direct et code .

Je n'ai pas posté le code ici simplement parce que je continue à le peaufiner et, espérons-le, lorsque le temps le permettra, je le convertirai en une classe appropriée.

0
Fred

Après beaucoup de choses surfer sur le web, j'ai trouvé ça.

PPTRAAS > Un outil gratuit pour capturer une capture d'écran en transmettant votre URL en tant que paramètre

Ils offrent plusieurs options en tapant simplement leur URL.

  1. Télécharger la capture d'écran de la page complète

    https://pptraas.com/screenshot?url= {VOUS URL ICI}

  2. Obtenir une capture d'écran de taille spécifique

    https://pptraas.com/screenshot?url= {VOUS URL ICI} & size = 400 400

  3. On peut même convertir la page en pdf

    https://pptraas.com/pdf?url= {VOUS URL ICI}

0
Fenil Shah

J'ai utilisé page2images . Il est développé sur la base du cutycapt qui est très rapide et stable. Si vous ne souhaitez pas consacrer trop de temps à la performance et à la configuration, vous devez l’utiliser. Si vous visitez leur site Web, vous trouverez plus de détails et un exemple de code PHP.

0
Chen