それはすべて始まりました...
数年前、私はWebプログラミングに精通し始めたばかりで、最初の「プロジェクト」の1つはサイトのディレクトリでした。 経験を増やすために、開発は自分のために行われました。 しかし、以来 同様のサイトは暗い、暗い、私は何か特別なことをしたかった。 カタログ内の各サイトにスクリーンショットを表示することにしました。 初めてすべてのスクリーンショットを手で取り、既製のファイルとしてアップロードしたので、これをすべて自動化する方法を知りませんでした。
時間が経ち、プロジェクトは「ほこりで覆われて」おり、対処する時間はありませんでしたが、約1年前に新しい「創造性の波」が現れ、「オートスクリーンセーバーの問題」を解決したいと思いました。
最初に思いついたのは、APIを提供する既製のスクリーンショットサービスです。 しかし、いくつかを並べ替えたところ(名前は覚えていません)、これは私には向いていないことに気付きました。可能性はかなり限られており、時には「ラインナップ」を待つ必要がありました。スクリーンショットのウェブサイトはかなり悲惨に見えました。 そして、主な問題は、これらすべてが非同期で動作しなければならず、スクリプトからは理解できなかったことでした-サービスは一時的なスタブ画像を提供したか、すでに準備されたサイトのスクリーンショットを提供しました。
そこで、私は自分の「自転車」を作ることにしました。
ツール選択
そもそも、コマンドラインからLinuxで動作するスクリーンショットを取得できるユーティリティを見つける必要がありました(Xがないため、サイトはubuntuサーバー上で回転しています)。 仕事仲間がCutyCaptにリンクしてくれました 。
CutyCaptは、ウェブページのスクリーンショットを作成し、SVG、PDF、PS、PNG、JPEG、TIFF、GIF、BM P(元の説明の翻訳of.site)。
公式サイトからのコピーペーストを行わないために、インストール、依存関係、起動パラメーター、例、Xサーバーがない場合の使用方法(xvfb-runを使用)など、すべてが既に説明されていると言います。
コーディング
そのため、ツールを決定しました。 サイトに戻る。 私はそれをこのように見ました:管理者は説明ページに「スクリーンショットを撮る」ボタンを持っています。これは、AJAXリクエストを通じて、必要な処理(サイズ変更/トリミング/スケッチ)を実行する画像を作成するスクリプトを呼び出します。
すぐに言ってやった。 PHPスクリプトのコードの一部を示します(最も基本的なものは残しておきます)。
<?PHP // - URL , // ( id), - $url = 'http://habrahabr.ru'; // "" // $tmpfname = tempnam('/tmp', 'catalog') . '.jpg'; // $url = escapeshellarg($url); // // CutyCapt . , url , - // "xvfb-run" $cmd = sprintf('xvfb-run --server-args="-screen 0, 1024x768x24" //C//CutyCapt --min-width=1280 --url=%s --out=\'%s\'', $url, $tmpfname); // exec($cmd); // , if (file_exists($tmpfname)) { // , 0 ( ) if (filesize($tmpfname) > 1) { // $tmpfname , // , , , ..... // , , phpthumb (phpthumb.gxdlabs.com) $f = date("ymd_his", time()).".jpg"; // if (copy($tmpfname, IMAGES_DIR.$f)) { if (file_exists(IMAGES_DIR.$f)) { try{ $thumb = PhpThumbFactory::create(IMAGES_DIR.$f); // jpg $thumb->setOptions( array('jpegQuality' => 90) ); // $thumb->resize(800); // 800x800px $thumb->crop(0, 0, 800, 800); $thumb->save(IMAGES_DIR.$f); // $thumb->resize(200)->crop(0,0,200,150); $thumb->save(IMAGES_DIR.'t_'.$f); } catch(exception $e) { // ... } // , . } } } // unlink($tmpfname); } // json - / ?>
そうそう、「落とし穴」に関する情報を共有したいと思います。
- 時々CutyCaptは非常に長い間上映されましたが、作業を完了しませんでした。
- 時々0バイトのスクリーンショットを作成しました
- 一部のフラッシュサイトでエラーが発生してクラッシュすることがありました。 それらを犠牲にして、システムからフラッシュプラグインを削除するだけでした。 フラッシュの場所のスクリーンショットでは空になっていますが、フラッシュによるクラッシュはこれ以上ありません。
参照:
公式サイトCutyCapt
PHP.net
PS私がCuttyCaptについてほとんど書いていないように思えるなら、言ってください-私は記事を補足します(すべてが公式サイトに明確に記載されているように思えました)