Tirar uma captura de tela de uma página da Web com JavaScript?


148

É possível tirar uma captura de tela de uma página da Web com JavaScript e enviá-la de volta ao servidor?

Não estou tão preocupado com problemas de segurança do navegador. etc. como a implementação seria para o HTA . Mas isso é possível?


Você pode esclarecer por que deseja fazer isso? Talvez haja soluções alternativas para tirar screenshots.
andyuk 13/09/08

Eu estou olhando para ter o usuário projetar aproximadamente o que eles querem, um esboço e um arrastar e soltar objetos. Desejo que esse "design" seja usado como parte das instruções em um processo de produção. É definitivamente um passo, nada clandestino envolvido pelo usuário aqui :)
Scott Bennett-McLeish

Respostas:


42

Eu fiz isso para um HTA usando um controle ActiveX. Foi muito fácil criar o controle no VB6 para fazer a captura de tela. Eu tive que usar a chamada da API keybd_event porque as SendKeys não podem executar o PrintScreen. Aqui está o código para isso:

Declare Sub keybd_event Lib "user32" _
(ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Public Const CaptWindow = 2

Public Sub ScreenGrab()
   keybd_event &H12, 0, 0, 0
   keybd_event &H2C, CaptWindow, 0, 0
   keybd_event &H2C, CaptWindow, &H2, 0
   keybd_event &H12, 0, &H2, 0
End Sub

Isso só leva você até a janela para a área de transferência.

Outra opção, se a janela da qual você deseja uma captura de tela for um HTA, seria apenas usar um XMLHTTPRequest para enviar os nós do DOM para o servidor e criar as capturas de tela do lado do servidor.


Concordo com Allen, que é uma maneira engenhosa de capturar uma página potencialmente!
Ricket 21/05/19

O que um "HTA" por favor?
Pete Alvin

2
O @PeteAlvin an HTA é um aplicativo de hipertexto, que era uma maneira de executar aplicativos JS privilegiados no Internet Explorer. Não é super relevante hoje.
Joel Anair #

141

O Google está fazendo isso no Google+ e um desenvolvedor talentoso fez a engenharia reversa e produziu http://html2canvas.hertzen.com/ . Para trabalhar no IE, você precisará de uma biblioteca de suporte de tela, como http://excanvas.sourceforge.net/


2
Obrigado, os links em sua postagem explicam tudo bem
Hüseyin Babal

2
Se você não quiser fazer isso por si mesmo, vale a pena tentar o Usersnap . É uma queda na solução para obter capturas de tela precisas do navegador de seus visitantes sem instalar um plug-in (e nenhum Java, ActiveX ou Flash).
22713 Gregor


14

Outra solução possível que descobri é o http://www.phantomjs.org/, que permite tirar facilmente capturas de tela de páginas e muito mais. Embora meus requisitos originais para esta pergunta não sejam mais válidos (trabalho diferente), provavelmente integrarei o PhantomJS em projetos futuros.


Você sabe se os phantomjs podem gerar uma imagem de um elemento em uma página (não na página inteira)?
trusktr

Sim você pode. Use esse trecho com o PhantomJS ou o CasperJS .
Zopieux


9

Uma maneira possível de fazer isso, se você estiver executando o Windows e tiver o .NET instalado, poderá:

public Bitmap GenerateScreenshot(string url)
{
    // This method gets a screenshot of the webpage
    // rendered at its full size (height and width)
    return GenerateScreenshot(url, -1, -1);
}

public Bitmap GenerateScreenshot(string url, int width, int height)
{
    // Load the webpage into a WebBrowser control
    WebBrowser wb = new WebBrowser();
    wb.ScrollBarsEnabled = false;
    wb.ScriptErrorsSuppressed = true;
    wb.Navigate(url);
    while (wb.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); }


    // Set the size of the WebBrowser control
    wb.Width = width;
    wb.Height = height;

    if (width == -1)
    {
        // Take Screenshot of the web pages full width
        wb.Width = wb.Document.Body.ScrollRectangle.Width;
    }

    if (height == -1)
    {
        // Take Screenshot of the web pages full height
        wb.Height = wb.Document.Body.ScrollRectangle.Height;
    }

    // Get a Bitmap representation of the webpage as it's rendered in the WebBrowser control
    Bitmap bitmap = new Bitmap(wb.Width, wb.Height);
    wb.DrawToBitmap(bitmap, new Rectangle(0, 0, wb.Width, wb.Height));
    wb.Dispose();

    return bitmap;
}

E então via PHP você pode fazer:

exec("CreateScreenShot.exe -url http://.... -save C:/shots domain_page.png");

Então você tem a captura de tela no lado do servidor.


1
Embora não esteja relacionada às perguntas, essa é uma sugestão incrível! Obrigado !
Mihai

por que ele não carrega alguns estilos que até eu posso vê-los carregados no IE9 ?!
Dr TJ

7

Essa pode não ser a solução ideal para você, mas ainda vale a pena mencionar.

Snapsie é um objeto ActiveX de código aberto que permite capturar e salvar capturas de tela do Internet Explorer. Depois que o arquivo DLL estiver registrado no cliente, você poderá capturar a captura de tela e fazer upload do arquivo no servidor com JavaScript. Desvantagens: ele precisa registrar o arquivo DLL no cliente e funciona apenas com o Internet Explorer.


6

Tínhamos um requisito semelhante para relatar erros. Como era para um cenário de intranet, pudemos usar complementos de navegador (como Fireshot para Firefox e IE Screenshot para Internet Explorer).



1

Você pode conseguir isso usando HTA e VBScript . Basta ligar para uma ferramenta externa para fazer a captura de tela. Esqueci o nome, mas no Windows Vista existe uma ferramenta para fazer capturas de tela. Você nem precisa de uma instalação extra para isso.

Quanto automático - depende totalmente da ferramenta que você usa. Se houver uma API, tenho certeza de que você pode acionar a captura de tela e o processo de salvamento por meio de duas chamadas do Visual Basic sem que o usuário saiba que você fez o que fez.

Desde que você mencionou o HTA, suponho que você esteja no Windows e (provavelmente) conheça seu ambiente (por exemplo, sistema operacional e versão) muito bem.


Ele está tentando fazê-lo como parte de uma aplicação web através calcula dos clientes, não para uso pessoal
mrBorna

1

Eu descobri que o dom-to-image fez um bom trabalho (muito melhor que o html2canvas). Consulte a seguinte pergunta e resposta: https://stackoverflow.com/a/32776834/207981

Esta pergunta é sobre como enviar isso de volta ao servidor, o que deve ser possível, mas se você deseja fazer o download das imagens, combine-as com o FileSaver.js e se deseja fazer o download de um zip com vários arquivos de imagem, todos gerados no lado do cliente, dão uma olhada no jszip .


0

Uma ótima solução para captura de tela em Javascript é a https://grabz.it .

Eles possuem uma API de captura de tela flexível e fácil de usar, que pode ser usada por qualquer tipo de aplicativo JS.

Se você quiser experimentá-lo, primeiro você deve obter a chave do aplicativo de autorização + segredo e o SDK gratuito

Em seu aplicativo, as etapas de implementação seriam:

// include the grabzit.min.js library in the web page you want the capture to appear
<script src="grabzit.min.js"></script>

//use the key and the secret to login, capture the url
<script>
GrabzIt("KEY", "SECRET").ConvertURL("http://www.google.com").Create();
</script>

A captura de tela pode ser personalizada com diferentes parâmetros . Por exemplo:

GrabzIt("KEY", "SECRET").ConvertURL("http://www.google.com", 
{"width": 400, "height": 400, "format": "png", "delay", 10000}).Create();
</script>

Isso é tudo. Em seguida, basta esperar um pouco e a imagem aparecerá automaticamente na parte inferior da página, sem a necessidade de recarregar a página.

Existem outras funcionalidades do mecanismo de captura de tela que você pode explorar aqui .

Também é possível salvar a captura de tela localmente. Para isso, você precisará utilizar a API do lado do servidor GrabzIt. Para mais informações, consulte o guia detalhado aqui .


0

Se você deseja fazer isso no lado do servidor, há opções como o PhantomJS , que agora está obsoleto. O melhor caminho a seguir seria o Headless Chrome com algo como Puppeteer no Node.JS. Capturar uma página da Web usando o Puppeteer seria tão simples como a seguir:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
})();

No entanto, exige que o chrome sem cabeça seja capaz de executar em seus servidores, o que tem algumas dependências e pode não ser adequado em ambientes restritos. (Além disso, se você não estiver usando o Node.JS, pode ser necessário cuidar da instalação / inicialização dos navegadores.)

Se você deseja usar um serviço SaaS, existem muitas opções, como



0

Atualmente, biblioteca GitHub de abril de 2020 html2Canvas https://github.com/niklasvh/html2canvas

Estrelas do GitHub 20K | Pipeles do Azure: Sucedido | Downloads 1,3M / mês |

citação: " JavaScript HTML renderer O script permite que você faça" capturas de tela "de páginas da Web ou partes dele diretamente no navegador do usuário . A captura de tela é baseada no DOM e, como tal, pode não ser 100% precisa da representação real, pois não cria uma captura de tela real, mas cria a captura de tela com base nas informações disponíveis na página.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.