サイトのスクリーンショットを撮る

PHPドキュメントのオープンスペースをさまようと、偶然、2つの関数imagegrabwindowimagegrabscreenに出会いました 。 Microsoft Windowsでスクリーンショットを撮ることができます。

興味がある 問題の終わりは、あらゆるサイトの完全なスクリーンショットを生成するスクリプトが作成されたことです。

必要なのは:





imagegrabwindow関数 、優れたユースケースを提供します

$browser = new COM( "InternetExplorer.Application" );

$handle = $browser->HWND;

$browser->Visible = true ;

$browser->Navigate( "http://www.libgd.org" );



/* Still working? */

while ($browser->Busy) {

com_message_pump(4000);

}

$im = imagegrabwindow($handle, 0);

$browser->Quit();

imagepng($im, "iesnap.png" );

imagedestroy($im);




* This source code was highlighted with Source Code Highlighter .








しかし、これには大きな欠点があります- ブラウザーウィンドウが開く大きさなので、スクリーンショットを取得します。

これを修正するために、さらに次のことを行うスクリプトを作成する必要がありました。



コジャラ



<?php

$browser = new COM( "InternetExplorer.Application" );

$browser->Visible = true ;

$browser->Fullscreen = true ;

$browser->StatusBar = false ;



$browser->Navigate( "http://www.habrahabr.ru" );

while ($browser->Busy)

com_message_pump(4000);



$handle = $browser->HWND;

$screenWidth = $browser->Width;

$screenHeight = $browser->Height;

$documentHeight = $browser->Document->body->scrollHeight;



$scrollWidth = 20;

$scrollHeight = 20;

$testPartSize = 10*1024;



$im = imagecreatetruecolor($screenWidth - $scrollWidth, $documentHeight);

for ($top = 0; $top < $documentHeight; $top += $screenHeight)

{

$browser->Document->documentElement->scrollTop=$top;

while ($browser->Busy)

com_message_pump(4000);

echo $browser->Document->documentElement->scrollTop.PHP_EOL;



for ($i = 0; $i < 5; $i++)

{

$part = imagegrabwindow($handle, 0);

$dark = imagecolorallocate($part, 0, 0, 0);

imagefilledrectangle($part, $screenWidth - $scrollWidth, 0, $screenWidth, $screenHeight, $dark);

$testFile = sprintf( "screenshot_%05d.png" , $top);

imagepng($part, $testFile, 9, PNG_ALL_FILTERS);

clearstatcache();

if (filesize($testFile) > $testPartSize)

break ;



echo "Bad part, name: {$testFile}, try to generate again." .PHP_EOL;

}



imagecopy(

$im, $part,

0, $top,

0, (!$top || ($top + $screenHeight) < $documentHeight) ? 0 : $screenHeight - $scrollHeight - $documentHeight % $screenHeight,

$screenWidth - $scrollWidth, $screenHeight);

imagedestroy($part);

}

imagepng($im, "screenshot.png" , 9, PNG_ALL_FILTERS);

imagedestroy($im);



$browser->Quit();



* This source code was highlighted with Source Code Highlighter .








コードノート






他のブラウザと同様に



FireFoxの場合、 埋め込みMozillaセクションを見つけました。残念ながらコーディングが必要ですが、本格的なサービスを作成する場合は、はるかに効率的です。

UPD:コメントを読んでください。他のエンジンや他のシステムでこれを行う方法に関するリンクがたくさんあります。



PS IE7のvirtualkaでのみチェックされます。

PS IE自体は私が嫌い、私はFireFoxを使用しています。



All Articles