ブラウザー拡張機能を使用して外部ページをスクレイピングし、データをサイトに送信するか、ページ内に表示して、DOM 経由でページの JavaScript からアクセスできるようにします。
ドメインでプロキシを使用して、外部ページを取得し、それをオリジンがドメインにある JavaScript に渡すこともできます。
アクセス可能な外部ページ用の API を使用できます。
Access-Control-Allow-Origin=* でページを提供するように、外部ページのコードを要求、コマンド、変更することができます (アクセスできる場合)。
できることはこれだけだと思います。
編集: 「奇妙に見える」は、ユーザーとプロセスの意図的な違いに気付くまでです. ユーザーが悪意を持っているとは考えられていませんが、プロセスはそうである可能性があります。プロセスは、たとえば、ユーザーがログインしている gmail セッションから外部ページにアクセスできる場合にデータを取得し、そのデータをサーバーに送信することができます。端末上のユーザーはおそらく (常にではありませんが!) そのセッションにログインしたユーザーであるため、ユーザーが悪意のあるユーザーであるとは考えられません。ただし、ユーザーが移動する Web サイトを起源とするスクリプトは、そのユーザーと同じ権限で動作することはできません。そのスクリプトはエージェントでもあり、アクションを実行できますが、ユーザーによって作成または指示されることはありません。これが、オリジンの分離と同一オリジン ポリシーの最も強力な理由です。
例
ブックマークレットと IFrame の実行コンテキスト
ブックマークレットを介してすべてのページに JS を挿入する場合、その挿入されたコードは、ページの残りの部分、または少なくともそのページの「トップ フレーム」と同じオリジンを持っているかのように動作します。 . トップフレームと同じコンテキストで実行されます。ページにネストされた iframe がある場合、ブックマークレットがそこに挿入しようとすると、「安全でないページ x からのアクセス試行」エラーが発生します。これは、ブックマークレットの起点がトップ ページにあり、トップ ページが異なるドメインのネストされた iframe にアクセスできないためです。
そのため、スクレイピングしたいサイトの一部がトップ フレームの下の iframe にある場合、ブックマークレットはそれを取得できません。
ブックマークレットを使用してデータを送信する
あるページの URL を自分のドメインで取得し、別のドメインのその URL からデータを取得し、そのデータを同じページに表示するには、データを取得する方法が必要です。 . ブックマークレットを使用できますが、フローには「ユーザー ヘルプ」が含まれます。次のようになります。
- D. ドメインのページを読み込みます。ユーザーは URL を入力ボックスに入力します。送信をクリックします。
- D の Javascript は、ユーザーが指定した URL を指す新しいタブ/ウィンドウを開きます。
- ユーザーがその外部ページでスクレイピング ブックマークレットをクリックすると、目的のデータ X が収集されます。
- 目的のデータ X は、Ajax を介して「サーバー」S にセッション識別子 I で送信されます。
- ページ D はサーバー S をポーリングし、セッション識別子 I を持つデータが取得されたことが通知されるまで、そのデータを取得して D に表示します。
サーバーの必要性があります。これはドメインに固有であるため、ローカル ストレージを使用して情報を送信することはできません。サーバーを必要としない代替手段があります。ブラウザ拡張機能を作成する必要があります。
ブラウザ拡張機能を使用したデータの送信 拡張機能の「バックグラウンド ページ」は、基本的にすべてのブラウザ タブのローカル サーバーと同じであり、異なるドメインをターゲットとするタブ間で情報を送信できます。このセットアップの「クライアント」は「コンテンツ スクリプト」であり、すべてのページにロードされます (ユーザーが実際にブックマークレットをクリックしてロードする必要がないことを除いて、ブックマークレットと同じです。これは自動的に行われます)。フローは次のようになります。
- 再びDページ。ユーザーが入力ボックスに URL を入力します。送信 -> をクリックすると、拡張機能のコードがトリガーされます。
- 拡張機能のバックグラウンド ページは、タブを開くように指示し、それを URL にターゲティングします。
- コンテンツ スクリプトがそのタブに自動的に読み込まれ、取得するデータをバックグラウンドでチェックします。そのデータを取得し、メッセージ (json 文字列) を介してバックグラウンド ページに送信します。
- バックグラウンド ページは、その通知とデータをページ D の元のコンテンツ スクリプトにプッシュします。これにより、情報が表示されます。
- 必要に応じて、バックグラウンド ページも情報をサーバーに送信して、そのユーザーのデータストアに保存します。
私がブラウザ拡張機能の「バックグラウンド ページ」と「コンテンツ スクリプト」に使用する言語は、Google Chrome に重点を置いています。同じ概念が Safari や Firefox でも利用できます。IE をサポートしたい場合は、別のことを解決する必要があります。IE10 は、拡張機能をサポートする予定さえありません。