興味がある 問題の終わりは、あらゆるサイトの完全なスクリーンショットを生成するスクリプトが作成されたことです。
必要なのは:
- Internet Explorer ActiveXコンポーネントとそのドキュメント 。
- PHP 5.2.2以降
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 .
コードノート
- 不明な理由で、スクリーンショットが撮られ、黒い画面が表示されることがあります。これを解消するために、記録されたピースは圧縮スクロールでファイルに書き込まれ、ファイルサイズがチェックされます。 ファイルが小さい場合は、おそらく再撮影が必要です。
- すばやくテストする場合は、次のコマンドラインを使用できます。
php -d extension_dir=c:\php\ext\ -d extension=php_gd2.dll ie.php
- Apacheから実行できますが、このためにはセキュリティ設定を変更する必要があります。 これらの関数のドキュメントには、何をすべきかが記載されています。
他のブラウザと同様に
FireFoxの場合、 埋め込みMozillaセクションを見つけました。残念ながらコーディングが必要ですが、本格的なサービスを作成する場合は、はるかに効率的です。
UPD:コメントを読んでください。他のエンジンや他のシステムでこれを行う方法に関するリンクがたくさんあります。
PS IE7のvirtualkaでのみチェックされます。
PS IE自体は私が嫌い、私はFireFoxを使用しています。