Prenez une capture D'écran du navigateur via JavaScript (ou autre chose)

Pour des raisons de support, je veux pouvoir qu'un utilisateur prenne une capture d'écran de la fenêtre du navigateur actuelle aussi facilement que possible et l'envoie au serveur.

Des idées (folles)?

25
demandé sur Thorben Bochenek 2010-07-23 11:37:13

15 réponses

Cela semblerait être un trou de sécurité assez important dans JavaScript si vous pouviez le faire. Imaginez un utilisateur malveillant installer ce code sur votre site avec une attaque XSS, puis capture d'écran tout votre travail quotidien. Imaginez que cela se passe avec vos services bancaires en ligne...

Cependant, il est possible de faire ce genre de chose en dehors de JavaScript. J'ai développé une application Swing qui utilisait du code de capture d'écran comme celui-ci qui a fait un excellent travail en envoyant un e-mail au helpdesk avec une capture d'écran jointe chaque fois que L'Utilisateur a rencontré une RuntimeException.

Je suppose que vous pourriez expérimenter avec une applet Java signée (choc! horreur! nooon!) qui traîné dans le coin. S'il est exécuté avec les privilèges de sécurité appropriés donnés lors de l'installation, il peut être contraint d'exécuter ce type de code de capture d'écran.

Pour plus de commodité, voici le code du site auquel j'ai lié:

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;

...

public void captureScreen(String fileName) throws Exception {

   Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
   Rectangle screenRectangle = new Rectangle(screenSize);
   Robot robot = new Robot();
   BufferedImage image = robot.createScreenCapture(screenRectangle);
   ImageIO.write(image, "png", new File(fileName));
}
...
7
répondu Gary Rowe 2010-07-23 08:14:54

Vous pouvez essayer de rendre la page entière dans canvas et enregistrer cette image sur le serveur. amusez-vous :)

3
répondu Andreas Köberle 2010-07-23 07:39:18

Une page web ne peut pas faire cela (ou du moins, je serais très surpris si cela pouvait, dans n'importe quel navigateur) mais une extension Firefox peut le faire. Tu vois https://developer.mozilla.org/en/Drawing_Graphics_with_Canvas#Rendering_Web_Content_Into_A_Canvas -- lorsque cette page indique "privilèges Chrome", cela signifie qu'une extension peut le faire, mais pas une page web.

3
répondu MatrixFrog 2010-07-23 08:24:29

Me semble que le support a besoin (au moins) des réponses à deux questions:

  1. à quoi ressemble l'écran? et
  2. Pourquoi ça ressemble à ça?

Une capture d'écran-un visuel - est très nécessaire et répond à la première question, mais elle ne peut pas répondre à la seconde.

Comme première tentative, j'essaierais d'envoyer la page entière au support. Le support technique pourrait afficher cette page dans son navigateur (répond à la première question); et pourrait également voir l'état actuel du code html du client (aide à répondre à la deuxième question).

J'essaierais d'envoyer autant de la page que possible au client JS par AJAX ou comme charge utile d'un formulaire. J'enverrais également des informations non sur la page: Tout ce qui affecte l'état de la page, comme les cookies ou les identifiants de session ou autre.

Le cust peut avoir un bouton de type submit pour démarrer le processus.

Je pense que ça marcherait. Voyons voir: il a besoin de CGI quelque part sur le serveur qui attrape le entrant page utilisateur et le rend disponible pour soutenir, peut - être en écrivant un fichier disque. Ensuite, la personne de soutien peut charger (ou ont chargé automatiquement) cette même page. Toutes les autres informations (cookies et ainsi de suite) peuvent être mises dans la page que le support voit.

PLUS: le JS client qui gère le bouton de soumission onclick () peut également inclure toutes les valeurs de variables js utiles!

Hé, ça peut marcher! Je suis excité :-)

HTH

-- pete

3
répondu Pete Wilson 2010-07-23 09:44:04

J'ai vu des gens faire cela avec deux approches:

  1. Configurez un serveur séparé pour la capture d'écran et exécutez un tas d'instances firefox, consultez ces deux gemmes si vous le faites dans ruby: selenium-webdriver et headless

  2. Utilisation d'une solution hébergée comme http://url2png.com (plus facile)

3
répondu Brian Armstrong 2011-12-02 05:59:58

Veuillez consulter la réponse partagée ici pour une implémentation relativement réussie de ceci: https://stackoverflow.com/a/6678156/291640

Utilisation: https://github.com/niklasvh/html2canvas

3
répondu whoughton 2017-05-23 12:24:14

Vous pouvez essayer PhantomJs, une boîte à outils de navigation headlesss. http://phantomjs.org/

L'exemple Javascript suivant montre la fonctionnalité de capture d'écran de Base:

var page = require('webpage').create();

page.settings.userAgent = 'UltimateBrowser/100';
page.viewportSize = { width: 1200, height: 1200 };
page.clipRect = { top: 0, left: 0, width: 1200, height: 1200 };

page.open('https://google.com/', function () {
  page.render('output.png');
  phantom.exit();
});
2
répondu Jens A. Koch 2014-11-18 11:45:29

Je comprends que ce post a 5 ans, mais pour les futures visites, je vais ajouter ma propre solution ici qui, je pense, résout la question du post original sans aucune bibliothèque tierce en dehors de jQuery.

pageClone = $('html').clone();

// Make sure that CSS and images load correctly when opening this clone
pageClone.find('head').append("<base href='" + location.href + "' />");

// OPTIONAL: Remove potentially interfering scripts so the page is totally static
pageClone.find('script').remove();

htmlString = pageClone.html();

Vous pouvez supprimer d'autres parties du DOM que vous pensez inutiles, comme le formulaire de support s'il se trouve dans une fenêtre modale. Ou vous pouvez choisir de ne pas supprimer les scripts si vous préférez maintenir une certaine interaction avec les contrôles dynamiques.

Envoie cette chaîne au serveur, soit dans un champ caché ou par AJAX, puis du côté du serveur, attachez tout le lot en tant que fichier HTML à l'e-mail de support.

Les avantages de ceci sont que vous obtiendrez non seulement une capture d'écran mais toute la page défilante dans sa forme actuelle, plus vous pouvez même inspecter et déboguer le DOM.

2
répondu Seth Jeffery 2015-04-13 09:56:47

Écran D'Impression? Old school et quelques touches, mais ça marche!

1
répondu Toby 2010-07-23 07:38:55

En JavaScript? Aucun. Je travaille pour une société de sécurité (sorte de trucs de type NetNanny) et le seul moyen efficace que nous avons trouvé pour faire des captures d'écran de l'utilisateur est avec une application cachée.

1
répondu AcidRaZor 2010-07-23 07:42:24

Cela peut ne pas fonctionner pour vous, mais sur IE, vous pouvez utiliser le snapsie plugin. Il ne semble plus en développement, mais la dernière version est disponible sur le site lié.

1
répondu ars 2010-07-23 07:47:24

Je pense que vous avez besoin d'un contrôle activeX. sans elle, je ne peux pas imaginer. vous pouvez forcer l'utilisateur à installer en premier après l'installation côté client des contrôles activex doit travailler et vous pouvez capturer.

1
répondu 2010-07-23 08:28:00

Nous collectons temporairement les États Ajax, les données dans les champs de formulaire et les informations de session. Ensuite, nous le restituons au bureau d'assistance. Puisque nous testons et intégrons pour tous les navigateurs, il n'y a pratiquement aucun cas de support pour des raisons d'affichage.

Avoir un regard sur le bouton rouge en bas sur holidaycheck

Sinon, il y a html2canvas de Google. Mais il est seulement applicable pour les navigateurs jamais et je ne l'ai jamais essayé.

1
répondu schmijos 2011-11-08 09:44:34

Vous pouvez également le faire avec le plugin Fireshot. J'utilise le code suivant (que j'ai extrait du code API, donc je n'ai pas besoin d'inclure L'API JS) pour faire un appel direct à L'objet Fireshot:

    var element = document.createElement("FireShotDataElement");
element.setAttribute("Entire", true);
element.setAttribute("Action", 1);
element.setAttribute("Key", "");
element.setAttribute("BASE64Content", "");
element.setAttribute("Data", "C:/Users/jagilber/Downloads/whatev.jpg");

if (typeof(CapturedFrameId) != "undefined")
        element.setAttribute("CapturedFrameId", CapturedFrameId);


document.documentElement.appendChild(element);

var evt = document.createEvent("Events");
evt.initEvent("capturePageEvt", true, false);

element.dispatchEvent(evt);

Remarque: Je ne sais pas si cette fonctionnalité est disponible uniquement pour la version payante ou non.

1
répondu jamespgilbert 2013-05-14 12:43:24

Peut-être http://html2canvas.hertzen.com / pourrait être utilisé. Ensuite, vous pouvez capturer l'affichage, puis le traiter.

1
répondu liftarn 2013-07-09 13:27:11