Existe alguma maneira de tirar uma captura de tela de um site em PHP e salvá-la em um arquivo?
Existe alguma maneira de tirar uma captura de tela de um site em PHP e salvá-la em um arquivo?
Respostas:
ÚLTIMA EDIÇÃO : depois de sete anos, ainda estou recebendo votos positivos para esta resposta, mas acho que agora é muito mais precisa.
Claro que você pode, mas precisará renderizar a página com alguma coisa. Se você realmente deseja usar apenas o php, sugiro que o HTMLTOPS , que renderiza a página e a produz em um arquivo ps (ghostscript), converta-o em .jpg, .png, .pdf. Pode ser um pouco mais lento com páginas complexas (e não suportam todo o CSS).
Caso contrário , você pode usar o wkhtmltopdf para gerar uma página html em pdf, jpg, qualquer que seja. Aceite CSS2.0, use o webkit (wrapper do safari) para renderizar a página. Você também deve instalá-lo no seu servidor.
ATUALIZAÇÃO Agora, com o novo recurso HTML5 e JS, também é possível renderizar a página em um objeto de tela usando JavaScript. Aqui está uma boa biblioteca para fazer isso: Html2Canvas e aqui está uma implementação do mesmo autor para obter um feedback como o G +. Depois de renderizar o dom na tela, você poderá enviar para o servidor via ajax e salvá-lo como jpg.
EDIT : Você pode usar a ferramenta imagemagick para transformar pdf em png. Minha versão do wkhtmltopdf não suporta imagens. Por exemplo convert html.pdf -append html.png
.
EDIT : Este pequeno script shell fornece um exemplo de uso simples / porém funcional no linux com php5-cli e as ferramentas mencionadas acima.
EDIT : notei agora que a equipe wkhtmltopdf está trabalhando em outro projeto: wkhtmltoimage, que fornece o jpg diretamente
Desde o PHP 5.2.2 , é possível capturar um site apenas com o PHP !
imagegrabscreen - captura a tela inteira
<?php
$img = imagegrabscreen();
imagepng($img, 'screenshot.png');
?>
imagegrabwindow - pega uma janela ou sua área de cliente usando um identificador de janelas (propriedade HWND na instância 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: Note, essas funções estão disponíveis apenas nos sistemas Windows!
Se você não quiser usar nenhuma ferramenta de terceiros, encontrei uma solução simples que usa a API do Google Page Insight .
Só preciso chamá-lo de API com params screenshot=true
.
https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=https://stackoverflow.com/&key={your_api_key}&screenshot=true
Para a exibição do site para celular, passe &strategy=mobile
nos parâmetros,
https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=http://stackoverflow.com/&key={your_api_key}&screenshot=true&strategy=mobile
DEMO .
Você pode usar um navegador sem cabeça simples como o PhantomJS para acessar a página.
Além disso, você pode usar o PhantomJS com PHP.
Confira este pequeno script php que faz isso. Dê uma olhada aqui https://github.com/microweber/screen
E aqui está a API - http://screen.microweber.com/shot.php?url=/programming/757675/website-screenshots-using-php
Isso deve ser bom para você:
Certifique-se de baixar a distribuição wkhtmltoimage!
Sim. Você precisará de algumas coisas:
Veja khtmld (aemon) em * nx. Veja Url2Jpg para Windows, mas como é o aplicativo dotNet, você também deve usar o Url2Bmp
Ambas são ferramentas de console que você pode utilizar em seu aplicativo da web para obter a captura de tela.
Também existem serviços da web que o oferecem. Veja isso por exemplo.
Editar:
Este link é útil para.
Está em Python, mas examinando a documentação e o código, você pode ver exatamente como isso é feito. Se você pode executar python, é uma solução pronta para você:
Observe que tudo pode ser executado em uma máquina para uma plataforma ou em uma máquina com máquinas virtuais executando as outras plataformas.
De código aberto e gratuito, role até o final da página para obter links para documentação, código fonte e outras informações.
Sim, ele é. Se você precisar apenas de imagem de URL, tente isto
<img src='http://zenithwebtechnologies.com.au/thumbnail.php?url=www.subway.com.au'>
Passe o URL como argumento e você obterá a imagem para obter mais detalhes, verifique este link http://zenithwebtechnologies.com.au/auto-thumbnail-generation-from-url.html
Bem, o PhantomJS é um navegador que pode ser facilmente colocado em um servidor e integrado ao php. Você pode encontrar o código no WDudes. Eles incluíram muito mais recursos, como especificar o tamanho da imagem, cache, fazer o download como um arquivo ou exibir em img src etc.
<img src=”screenshot.php?url=google.com” />
Parâmetros de URL
Largura e altura: screenshot.php? Url = google.com & w = 1000 & h = 800
Com o recorte: screenshot.php? Url = google.com & w = 1000 & h = 800 & clipw = 800 & cliph = 600
Desative o cache e carregue screesnhot:
screenshot.php? Url = google.com.br & cache = 0
Para baixar a imagem: screenshot.php? Url = google.com & download = true
Você pode ver o tutorial aqui: Capturar captura de tela de um site usando PHP sem API
Eu sempre uso a tela de micro-ondas para capturar imagens de qualquer página da web. Aqui podemos encontrar um tutorial bem escrito . Isso é mais fácil e não deve demorar mais de 3 minutos para aprender.
Eu finalmente configurei usando microweber / screen como proposto por @boksiora.
Inicialmente, ao tentar o link mencionado aqui, o que obtive:
Please download this script from here https://github.com/microweber/screen
Estou no Linux. Portanto, se você deseja executá-lo, pode ajustar o meu passo a seguir para o seu ambiente.
Aqui está o passo que fiz no meu shell na DOCUMENT_ROOT
pasta:
$ 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
Aponte seu navegador para screen/demo/shot.php?url=google.com
. Quando você vê a captura de tela , está pronto. Discussões para configurações mais avançadas estão disponíveis aqui e aqui .
Existem muitos projetos de código aberto que podem gerar capturas de tela. Por exemplo, PhantomJS, webkit2png etc
O grande problema desses projetos é que eles são baseados em tecnologias de navegador mais antigas e têm problemas para renderizar muitos sites, especialmente sites que usam fachadas da web, flexbox, svg e várias outras adições às especificações HTML5 e CSS nos últimos dois meses / anos.
Eu tentei alguns dos serviços de terceiros e a maioria é baseada no PhantomJS, o que significa que eles também produzem capturas de tela de baixa qualidade. O melhor serviço de terceiros para gerar capturas de tela de sites é o urlbox.io . É um serviço pago, embora exista uma avaliação gratuita de 7 dias para testá-lo sem comprometer-se com nenhum plano pago.
Aqui está um link para a documentação , e abaixo estão etapas simples para fazê-lo funcionar em PHP com o compositor.
// 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" />
Por exemplo, aqui está uma captura de tela em altura total desta página:
Há muitas opções e todos têm seus prós e contras. Aqui está uma lista de opções ordenadas por dificuldade de implementação.
Prós
Contras
Prós
Contras
Prós
Contras
Prós
Contras
Disclaimer: Eu sou o fundador do ApiFlash. Eu fiz o meu melhor para fornecer uma resposta honesta e útil.
Estou no Windows, então pude usar a função imagegrabwindow depois de ler a dica aqui do stephan. Eu adicionei no recorte (para se livrar do cabeçalho do navegador, nas barras de rolagem etc.) e no redimensionamento para obter uma imagem final. Aqui está o meu código . Espero que ajude alguém.
O webkit2html funciona no Mac OS X e Linux, é bastante simples de instalar e usar. Veja este tutorial .
No Windows, você pode usar o CutyCapt , que possui uma funcionalidade semelhante.
Eu usei bluga . A API permite tirar 100 instantâneos por mês sem pagar, mas às vezes usa mais de 1 crédito para uma única página. Acabei de atualizar um módulo drupal, Bluga WebThumbs para o drupal 7, que permite imprimir uma miniatura em um modelo ou filtro de entrada.
A principal vantagem de usar esta API é que ela permite especificar as dimensões do navegador, caso você use css adaptável, por isso estou usando-a para obter renderizações para o layout para dispositivos móveis e tablets, bem como para o regular.
Existem clientes API para os seguintes idiomas:
PHP , Python , Ruby , Java , .Net C # , Perl e Bash (o shell script requer perl)
Tudo depende de como você deseja tirar a captura de tela.
Você pode fazer isso via PHP, usando um serviço da web para obter a imagem para você
grabz.it tem um serviço da web para fazer exatamente isso, aqui está um artigo mostrando um exemplo simples de uso do serviço.
Você pode usar a solução https://grabz.it .
Ele possui uma API PHP que é muito flexível e pode ser chamada de diferentes maneiras, como em um cronjob ou em uma página da Web PHP.
Para implementá-lo, você precisa primeiro obter uma chave e um segredo do aplicativo e fazer o download o SDK (gratuito).
E um exemplo de implementação. Primeiro de tudo a inicialização:
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");
E exemplo de captura de tela:
// 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");
Em seguida, é possível salvar. Você pode usar um dos dois métodos de salvamento, Save
se o identificador de retorno de chamada acessível ao público estiver disponível e, SaveTo
se não estiver. Verifique a documentação para obter detalhes .
Outro dia, escrevi um aplicativo rápido e sujo para fazer isso usando a API do Google. Certamente espaço para melhorias ...
Encontre-o aqui com uma demonstração e código ao vivo .
Não publiquei o código aqui simplesmente porque continuo refinando-o e espero que, quando tiver tempo, converta-o em uma classe adequada.
Eu usei o page2images . É desenvolvido com base no cutycapt, que é realmente rápido e estável. Se você não deseja gastar muito tempo com o desempenho e a configuração, deve usá-lo. Se você for ao site deles, poderá encontrar mais detalhes e exemplos de código PHP.
Depois de muito navegar na web, encontrei isso.
PPTRAAS > Uma ferramenta gratuita para capturar capturas de tela passando seu URL como parâmetro
Eles oferecem várias opções simplesmente pressionando o URL.
Obter tela inteira
https://pptraas.com/screenshot?url= {VOCÊ URL AQUI}
Obter captura de tela da página de tamanho específico
https://pptraas.com/screenshot?url= {VOCÊ URL AQUI} e size = 400.400
Pode-se até converter a página em pdf
https://pptraas.com/pdf?url= {VOCÊ URL AQUI}
Você poderia fazer 2 coisas.
Use Puppeteer
Você pode usar o pacote PHP Puppeteer para ativar um navegador e tirar uma captura de tela.
Use uma API
Existem muitas APIs de captura de tela. Você pode ver o ScreenshotAPI.net por exemplo. (Isenção de responsabilidade, sou o criador dessa API)
Não diretamente. Softwares como o Selenium têm recursos como este e podem ser controlados pelo PHP, mas têm outras dependências (como executar o servidor baseado em java no computador com o navegador que você deseja capturar).
você pode usar o cutycapt.
O kwhtml está obsoleto e mostra a página como um navegador antigo.
Descobri que esta é a melhor e mais fácil ferramenta: ScreenShotMachine . É um serviço pago, mas você recebe 100 capturas de tela gratuitas e pode comprar outras 2.000 por (cerca de) US $ 20, por isso é um bom negócio. Ele tem um uso muito simples, basta usar um URL, então escrevi este pequeno script para salvar um arquivo com base nele:
<?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!");
?>
Eles têm uma documentação muito boa aqui , então você definitivamente deve dar uma olhada.