ページのスクリーンショットを撮る方法

こんにちは



これはハブに関する最初の記事です。サービスのページの美しいスクリーンショットをどのように作成し、どのようにこれに到達したのか、どのレーキを踏んだのかについてお話したいと思います。



このサービスは、更新フィードを表示するために非常に重要です。 そして、より速く、より現実に近い(読み取り-フラッシュサポート)動作するほど、ユーザーにとってより快適になります。









インターネットを探索した後、次のオプションが見つかりました。



一般的に、これを見て理想を見ない中で、最も本格的なスクリーンショットを実現するための最初の試みは、 Xvfbの下でのFirefox起動と、30秒のタイムアウトによるスクリーン全体のスクリーンショットでした。

Xvfbは、このような目的に不可欠なユーティリティです。 これは仮想フレームバッファであり、サーバーにフルタイムXを配置せず、解像度を問わず「ディスプレイ」を実行できます。 さて、それらのアプリケーション:)

もちろん、この方法は不完全でした。 最初に、firefoxは頑固であることが判明し、常に自分自身またはプラグインを更新するためのウィンドウをスリップしようとしました。 第二に、時々私はスクリーンショット(単色の写真になった)またはvisを台無しにしました。 第三に、30秒後に厳密にスクリーンショットを撮ることは明らかに最適ではありません。サイトが以前にロードされた場合、待つことは何もありません:)そしてもちろん、彼はメモリを食べました。



次のステップでは、Qtで独自のユーティリティ作成しようとしました -結局、スクリーンショット制作サービスは私たちにとって非常に重要だからです。 Qtは、ほとんどのそのようなプログラムの作成者によって使用される無駄ではありません。最新のエンジンと便利なAPIがあります。 問題はほとんどありませんでしたが、それらは残りました-時々ユーティリティがハングし、時々スクリーンショットが壊れました...そして何らかの理由で、フラッシュを備えたバトルサーバーでは動作しませんでした。



このユーティリティの開発者自身が、ある時点でPhantomJS切り替えることを提案しました -これを利用しました。 状況は再び改善されましたが、完全ではありません。 また、時々ハングし、常にエラーを引き起こすリンクと散発的な障害の場合があります。 フラッシュも機能せず、黒い長方形が表示されましたが、これは原則としてすでにある程度適しています。

しかし、PhantomJSはページでjsを実行できるため、DOMからページの説明(メタタグまたはテキストから直接の秘密のアルゴリズム)、見出しを取得し、潜在的にあらゆる種類の興味深いことを行うことができます。たとえば、iframeでの表示を禁止するページを定義します。これは私たちにとってかなり重要な機能でもあります。 HTMLは非常に複雑なため、サーバー上でHTMLを操作するのは面倒です。 ブラウザエンジンは、いじめに耐えるために何十年も慣れてきました。

だから私たちは彼と一緒に長い間住んでいましたが、かなりの量のリンクを追加し始めたとき、Phantomは私たちに何か新しいことに満足しました-並行して実行されているプログラムのいくつかのコピーはフラッシュでリンクを処理し、突然それを削除し始めましたが、たとえば、1つのスクリーンショットでビデオは別のリンクから取得され、2番目のスクリーンショットでは、ビデオの代わりに、一度に2つのビデオの組み合わせがありました。 要するに、消化管を解剖した。



Google Chromeには一般にフラッシュプレーヤーが組み込まれていることを考えて覚えていましたが、すべての自作プログラムが信頼性の欠如に苦しんでいたことはすでに明らかでした。 これは、Chromeのせいではありません。さらに、PhantomJSと同様の機能を備えた純粋なjsで拡張機能を記述するのは非常に簡単です。

彼はまた、すべての魔法のコマンドラインスイッチを見つけました。これにより、インターフェイスや迷惑な提案なしで実行できます。 また、彼はSTDERRでの記述方法を知っていて、「シークレットモード」で動作します。このモードでは、スクリーンショットを撮ることで最も再現性の高い結果が得られます。 CSSセレクターの全機能が利用可能になり、フラッシュが有効になりました

一般的に、Google Chrome はエロティックな夢をすべて実現しました ;)

実際に、スクリーンショットは、ブラウザが機能する画面全体のスクリーンショットに加えて、特別な魔法のサイト用の特別なケースで撮影されています。



ある意味で、歴史はらせんを作りました-私たちはブラウザから始め、ブラウザで終わりました。 Chromeでこのタスクを実行するだけで、はるかに簡単になりました。 はい、Firefoxで拡張機能を作成することもできます。拡張機能を使用すると、Chromeで実行するのと同じことを実行できる可能性があります。 Firefoxツールバーを作成した後保証します:)

そして、彼は記憶を慎重に扱います。 ちなみに、Chromeでは外部ユーティリティなしでスクリーンショットを撮ることもできます-data-uriの形で取得できますが、皮肉なことに、このモードではフラッシュは削除されません:)





したがって、長い試行錯誤を避けて、独自のスクリーンショットサービスを取得する方法に関する小さなチェックリストを次に示します。







ステップ「...」と「Profit!」を忘れないでください;)



最終的に、私は私が見たすべての商業的な対応物を超えるソリューションを持っていると思います。



All Articles