セルフスクリーンショットサービス

それはすべて始まりました...



数年前、私は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 -   /   ?>
      
      





そうそう、「落とし穴」に関する情報を共有したいと思います。

  1. 時々CutyCaptは非常に長い間上映されましたが、作業を完了しませんでした。
  2. 時々0バイトのスクリーンショットを作成しました
  3. 一部のフラッシュサイトでエラーが発生してクラッシュすることがありました。 それらを犠牲にして、システムからフラッシュプラグインを削除するだけでした。 フラッシュの場所のスクリーンショットでは空になっていますが、フラッシュによるクラッシュはこれ以上ありません。




参照:

公式サイトCutyCapt

PHP.net



PS私がCuttyCaptについてほとんど書いていないように思えるなら、言ってください-私は記事を補足します(すべてが公式サイトに明確に記載されているように思えました)



All Articles