PHPでWebサイトのスクリーンショットを撮り、それをファイルに保存する方法はありますか?
PHPでWebサイトのスクリーンショットを撮り、それをファイルに保存する方法はありますか?
回答:
最終編集:7年後も、この回答に対する賛成票はまだありますが、これははるかに正確になったと思います。
もちろん可能ですが、ページを何かでレンダリングする必要があります。本当にphpのみを使用したい場合は、ページをレンダリングしてpsファイル(ghostscript)に出力するHTMLTOPSをお勧めします。次に、.jpg、.png、.pdfに変換します。複雑なページ(すべてのCSSをサポートしているわけではありません)。
それ以外の場合は、wkhtmltopdfを使用してhtml、pdf、jpgなどのページを出力できます。CSS2.0を受け入れ、webkit(safariのラッパー)を使用してページをレンダリングします。これで問題ありません。サーバーにもインストールする必要があります。
更新今回、新しいHTML5およびJS機能により、JavaScriptを使用してページをキャンバスオブジェクトにレンダリングすることもできます。:それを行うためにここに素敵なライブラリHtml2Canvasと、ここでは実装である G +のようなフィードバックを得るために、同じ作者による。domをキャンバスにレンダリングしたら、ajaxを介してサーバーに送信し、jpgとして保存できます。
編集:pdfをpngに変換するためにimagemagickツールを使用できます。私のバージョンのwkhtmltopdfは画像をサポートしていません。例えばconvert html.pdf -append html.png
。
編集:この小さなシェルスクリプトは、php5-cliと上記のツールを使用したLinuxでの簡単な/しかし実用的な使用例を示しています。
編集:私は今、wkhtmltopdfチームが別のプロジェクトに取り組んでいることに気づきました:wkhtmltoimage、これは直接jpgを提供します
PHP 5.2.2以降では、PHPのみでWebサイトをキャプチャすることが可能です!
imagegrabscreen —画面全体をキャプチャします
<?php
$img = imagegrabscreen();
imagepng($img, 'screenshot.png');
?>
imagegrabwindow-ウィンドウハンドル(COMインスタンスのHWNDプロパティ)を使用してウィンドウまたはそのクライアント領域を取得します。
<?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');
?>
編集:これらの関数はWindowsシステムでのみ使用可能です。
サードパーティのツールを使用したくない場合は、Google Page Insight API を使用する簡単なソリューションを見つけました。
paramsを使ってそれをapiと呼ぶだけですscreenshot=true
。
https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=https://stackoverflow.com/&key={your_api_key}&screenshot=true
&strategy=mobile
paramsでのモバイルサイトビューパスの場合、
https://www.googleapis.com/pagespeedonline/v1/runPagespeed?
url=http://stackoverflow.com/&key={your_api_key}&screenshot=true&strategy=mobile
デモ。
PhantomJSのようなシンプルなヘッドレスブラウザーを使用してページを取得できます。
また、PHPでPhantomJSを使用できます。
これを行うこの小さなphpスクリプトを確認してください。こちらをご覧くださいhttps://github.com/microweber/screen
そして、これがAPI- http://screen.microweber.com/shot.php?url=/programming/757675/website-screenshots-using-php
これはPythonにありますが、ドキュメントとコードを確認すると、これがどのように行われるかを正確に確認できます。Pythonを実行できる場合、これは既製のソリューションです。
すべてが1つのプラットフォームの1台のマシン、または他のプラットフォームを実行する仮想マシンを備えた1台のマシンで実行できることに注意してください。
無料のオープンソース。ページの一番下までスクロールして、ドキュメント、ソースコード、その他の情報へのリンクを確認してください。
はい、そうです。URLの画像だけが必要な場合はこれを試してください
<img src='http://zenithwebtechnologies.com.au/thumbnail.php?url=www.subway.com.au'>
引数としてURLを渡すと、画像が表示されます詳細については、このリンクを確認してくださいhttp://zenithwebtechnologies.com.au/auto-thumbnail-generation-from-url.html
まあ、PhantomJSはサーバーに簡単に配置してphpに統合できるブラウザーです。コードはWDudesにあります。画像サイズの指定、キャッシュ、ファイルとしてのダウンロード、img srcでの表示など、多くの機能が含まれています。
<img src=”screenshot.php?url=google.com” />
URLパラメータ
幅と高さ:screenshot.php?url = google.com&w = 1000&h = 800
トリミングあり:screenshot.php?url = google.com&w = 1000&h = 800&clipw = 800&cliph = 600
キャッシュを無効にして、新しいscreesnhotをロードします:
screenshot.php?url = google.com&cache = 0
画像をダウンロードするには:screenshot.php?url = google.com&download = true
こちらのチュートリアルをご覧ください:APIを使用せずにPHPを使用してWebサイトのスクリーンショットをキャプチャ
私は常にmicroweber画面を使用して、任意のWebページのスクリーンショットをキャプチャします。ここには、よく書かれたチュートリアルがあります。これはより簡単で、学ぶのに3分以上かかるべきではありません。
@boksioraによって提案されたように、私は最終的にmicroweber / screenを使用して設定しました。
最初にここで言及したリンクを試してみると、私が得たもの:
Please download this script from here https://github.com/microweber/screen
私はLinuxを使っています。したがって、実行したい場合は、環境に合わせてステップを調整できます。
シェルでDOCUMENT_ROOT
フォルダーに対して実行した手順は次のとおりです。
$ 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
ブラウザでにアクセスしscreen/demo/shot.php?url=google.com
ます。あなたが見たときのスクリーンショットを、あなたが行われています。より高度な設定についての議論はこことここで利用できます。
スクリーンショットを生成できる多くのオープンソースプロジェクトがあります。たとえば、PhantomJS、webkit2pngなど
これらのプロジェクトの大きな問題は、古いブラウザテクノロジーに基づいており、多くのサイト、特にwebfonts、flexbox、svg、およびここ数か月/年にわたってHTML5とCSS仕様へのその他のさまざまな追加を使用するサイトのレンダリングに問題があることです。
私はいくつかのサードパーティのサービスを試しましたが、ほとんどはPhantomJSに基づいています。ウェブサイトのスクリーンショットを生成するための最良のサードパーティサービスは、urlbox.ioです。です。これは有料サービスですが、有料プランを確約せずにテストできる無料の7日間トライアルがあります。
ここにドキュメントへのリンクがあります。以下は、PHPでcomposerを使用するための簡単な手順です。
// 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" />
たとえば、このページの高さ全体のスクリーンショットは次のとおりです。
多くのオプションがあり、それらはすべて長所と短所があります。以下は、実装の難易度順に並べられたオプションのリストです。
長所
短所
長所
短所
長所
短所
長所
短所
免責事項:私はApiFlashの創設者です。私は正直で役立つ答えを提供するために最善を尽くしました。
私はWindowsを使用しているので、stephanからのヒントを読んだ後、imagegrabwindow関数を使用することができました。最終的な画像を取得するために、クロッピング(ブラウザのヘッダー、スクロールバーなどを取り除くため)とサイズ変更を追加しました。これが私のコードです。それが誰かを助けることを願っています。
webkit2htmlはMac OS XとLinuxで動作し、インストールと使用が非常に簡単です。このチュートリアルを参照してください。
Windowsでは、同様の機能を持つCutyCaptを使用できます。
ブルーガを使用しました。このAPIを使用すると、1か月あたり100枚のスナップショットを無料で取得できますが、1つのページに複数のクレジットを使用する場合もあります。drupalモジュールのBluga WebThumbsをdrupal 7にアップグレードしました。テンプレートまたは入力フィルターでサムネイルを印刷できます。
このAPIを使用する主な利点は、適応型CSSを使用する場合にブラウザーのサイズを指定できることです。そのため、これを使用して、通常のレイアウトだけでなく、モバイルおよびタブレットのレイアウトのレンダリングを取得します。
次の言語のAPIクライアントがあります。
PHP、 Python、 Ruby、 Java、 .Net C#、 Perl およびBash(シェルスクリプトはperlを必要とするように見えます)
それはすべて、スクリーンショットを撮る方法によって異なります。
PHPを介してこれを行うことができ、Webサービスを使用して画像を取得します
grabz.itには、これを行うためのWebサービスがあります。サービスを使用する簡単な例を示す記事を次に示します。
https://grabz.itソリューションを使用できます。
これは非常に柔軟なPHP APIを備えており、cronjobやPHP Webページからなど、さまざまな方法で呼び出すことができます。
これを実装するには、まずアプリのキーとシークレットを取得し、(無料の)SDK をダウンロードする必要があります。
そして実装の例。まず、初期化:
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");
そしてスクリーンショットの例:
// 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");
次は保存Save
です。パブリックにアクセス可能なコールバックハンドルが使用可能なSaveTo
場合とそうでない場合、2つのsaveメソッドのいずれかを使用できます。詳細については、ドキュメントを確認してください。
先日、Google APIを使用してこれを行うための迅速で汚れたアプリを書きました。間違いなく改善の余地があります...
ライブデモとコードを使用して、ここで見つけてください。
ここではコードを投稿しませんでした。コードを改良し続けたので、時間があれば、適切なクラスに変換したいと考えています。
私はpage2imagesを使用しました。それは本当に高速で安定しているキューティキャプに基づいて開発されました。パフォーマンスと構成にあまり時間をかけたくない場合は、それを使用する必要があります。彼らのウェブサイトにアクセスすると、詳細とサンプルのPHPコードを見つけることができます。
ウェブでのサーフィンのためにたくさん見つけた後、私はこれを見つけました。
PPTRAAS > URLをパラメーターとして渡してスクリーンショットをキャプチャする無料ツール
URLを押すだけで複数のオプションが提供されます。
ページ全体のスクリーンショットを取得
https://pptraas.com/screenshot?url= {ここにあなたのURL}
特定のサイズのページのスクリーンショットを取得する
https://pptraas.com/screenshot?url= {YOU URL HERE}&size = 400,400
ページをPDFに変換することもできます
https://pptraas.com/pdf?url= {ここにあなたのURL}
2つのことができます。
操り人形師を使う
PHP Puppeteerパッケージを使用して、ブラウザーを起動し、スクリーンショットを撮ることができます。
APIを使用する
スクリーンショットAPIはたくさんあります。たとえば、ScreenshotAPI.netを見ることができます。(免責事項私はそのAPIの作成者です)
直接ではありません。Seleniumなどのソフトウェアにはこのような機能があり、PHPで制御できますが、他の依存関係があります(スクリーンショットを作成したいブラウザーを備えたコンピューターでJavaベースのサーバーを実行するなど)
私はこれが周りの最良かつ最も簡単なツールであることがわかりました:ScreenShotMachine。これは有料サービスですが、100枚の無料のスクリーンショットを取得し、さらに2,000ドルを(約)$ 20で購入できるので、かなりお得です。使い方は非常に簡単で、URLを使用するだけなので、それに基づいてファイルを保存する次の小さなスクリプトを作成しました。
<?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!");
?>