「ショートカット」の「Web ページで JavaScript を実行」アクションについて
ほとんどの Web ページでは JavaScript を使ってスクリプトが記述されています。JavaScript は、アニメーション、インタラクティブメニュー、ビデオ再生などの動的なエフェクトを作り出すプログラミング言語です。通常、Web サーフィン中に JavaScript がユーザに表示されることはありません。ただし、「Web ページで JavaScript を実行」アクションを含むショートカットを構築して「Safari」App から実行すると、Web ページの JavaScript を制御できます。
Web ページでカスタムの JavaScript を実行するショートカットには、さまざまな用途があります。たとえば、授業の時間割を抽出して「カレンダー」App に追加する、Facebook グループのメンバーデータを書き出してスプレッドシートに追加するなど、Web ページから特定のデータを取得してタスクに組み込むショートカットを作成できます。
また、Web ページのテキストのフォントを変更する、ビデオの再生速度を変更するなど、Web ページを変更できるショートカットも作成できます。
Web ページで JavaScript を実行するショートカットの使いかたについては、「ショートカット」の「Web ページで JavaScript を実行」アクションを使うを参照してください。
Web ページのデータの取得について
「Web ページで JavaScript を実行」アクションでは、特定の条件に一致するすべての要素を取り込んでから、それらを繰り返し処理してデータでタスクを実行(またはそれらをさらに調査)することで、Web ページからデータを取得できます。
たとえば、Web ページのすべてのイメージ要素のリストを作成するには、以下のスクリプトを使用します:
var elements = document.querySelectorAll("img");
もう 1 つの例として、class が「post」のすべての要素を取得するには、以下のスクリプトを使用します:
var elements = document.querySelectorAll(".post");
NodeList が作成された後、以下のようなスクリプトを使って、それらの要素を繰り返し処理できます(要素をさらに絞り込んだり、要素をデータ構造に追加したりします)。
var elements = ...;
for (let element of elements) {
// ...
}
Web ページの処理結果のクエリーについて詳しくは、https://developer.mozilla.org/Selectors および https://developer.mozilla.org/SelectorAll を参照してください。
「Web ページで JavaScript を実行」アクションの入力
「Web ページで JavaScript を実行」アクションへの入力は、アクティブな「Safari」の Web ページである必要があります。つまり、共有シートにある「ショートカット」のアクション機能拡張(「Safari」では具体的に SFSafariViewController または ASWebAuthenticationSession)からショートカットを実行する必要があります。
共有シートからショートカットが実行されると、「Safari」App からの入力がショートカットの最初のアクションに渡されます。
「Web ページで JavaScript を実行」アクションへの入力は「Safari」の Web ページである必要がありますが、マジック変数を使ってアクションに追加データを挿入することもできます。たとえば、以下のショートカットには、Web ページ上のビデオを変更する「Web ページで JavaScript を実行」アクションが含まれます。ビデオの再生速度が「速度」変数によって制御されます。
ヒント:「Change Video Speed」ショートカットがギャラリーで使用可能です。
「Web ページで JavaScript を実行」アクションがショートカット内の最初のアクションでない場合は、ショートカットを実行するとエラーメッセージが表示されます。
これを修正するために、「変数を取得」アクションを追加し、そのパラメータを「Safari」の Web ページに設定して、Web ページのコンテンツを「Web ページで JavaScript を実行」アクションに渡すことができます。
「Safari」からショートカットを実行する方法については、別の App からショートカットを設定して実行するを参照してください。
「Web ページで JavaScript を実行」アクションの出力
データを返すには、JavaScript で完了ハンドラ(completion(result)
など)を呼び出す必要があります。通常、JavaScript は非同期パターンで使用されるため、この呼び出しは意図的に同期的ではありません。この方法により、アクションを非同期的に完了できます。たとえば、以下のスクリプトは有効です:
window.setTimeout(function() {
completion(true);
}, 1000);
「Web ページで JavaScript を実行」アクションの出力は、以下を含む有効な JSON データ型です:
String
Number
ブール値(真/偽)
配列(ほかの任意の有効な JSON 型を含む)
辞書(ほかの任意の有効な JSON 型を含む)
null
undefined
JSON について詳しくは、「ショートカット」での JSON の使用についてを参照してください。
「ショートカット」では、JavaScript と「ショートカット」App の間で通信するために、戻り値が内部で自動的にエンコードされたりデコードされたりします。つまり、完了ハンドラを呼び出す前に JSON.stringify(result)
を呼び出す必要はありません。
戻り値は JSON であるため、戻り値が適切に機能しないことがあります。たとえば、関数や Node には JSON エンコードされた実用的な表現が含まれません。この場合は、必要な JSON 互換の値を含む配列または辞書を作成することをお勧めします。
Node について詳しくは、https://developer.mozilla.org/Node および https://developer.mozilla.org/Functions を参照してください。
注記:JavaScript のオブジェクトはただの辞書なので、基本オブジェクトは適切に JSON に変換されます。
ヒント:「Web ページで JavaScript を実行」アクションからデータを返したくない場合は、関数の引数を指定せずに completion()
を呼び出すことができます(undefined
は有効な出力であるため)。これは、completion(undefined)
の呼び出しと同等です。
「Web ページで JavaScript を実行」アクションの時間制限
「Web ページで JavaScript を実行」アクションは、「Safari」のすべての JavaScript 機能拡張と同様に時間制限が適用されるため、できるだけすばやく完了する必要があります。同期関数を使用する以下のような JavaScript は、時間内に完了しない場合があります:
window.alert()
window.prompt()
window.confirm()
2 秒以上のタイムアウト。例:
window.setTimeout(function() { completion(); }, 5000);
JavaScript が時間制限を超えると、ショートカットを実行しても完了せず、「JavaScript タイムアウト」エラーメッセージが表示されます。
構文と実行時エラーの処理
「Safari」でサポートされる任意の構文を使って、「Web ページで JavaScript を実行」アクション内で JavaScript を記述できます。iOS 12 では、for of
ループや let
などの ECMA 6 の JavaScript 構文がサポートされます。
「ショートカット」App では、Safari 機能拡張からショートカットを実行する前に、「Web ページで JavaScript を実行」アクションで基本的な構文チェックを実行してエラーを検出できます。
テキストフィールドへのスクリプトの入力中に、構文の強調表示によって、記述中の JavaScript が有効であることを確認できます。たとえば、文字列の末尾に引用符を入れ忘れると、その文字列の後ろにあるすべてのテキストが強調表示されます。
スクリプトの構文が有効でも実行時エラーが含まれる場合は、「Web ページで JavaScript を実行」アクションによって例外がキャッチされ、表示されます。たとえば、存在しない変数または関数(shortcuts.completion()
など)がスクリプトで参照されている場合は、実行時にエラーが表示されます。
プライバシーおよびセキュリティ
ショートカットに Web ページでの JavaScript の実行を許可すると、機密の可能性があるデータも含め、Web ページ上のすべての情報にそのショートカットがアクセスできます。「ショートカット」App では、JavaScript の実行時にセキュリティとプライバシーを確保するための対策をいくつか講じています。
「Web ページで JavaScript を実行」アクションを含むショートカットを実行すると、そのショートカットが Web ページを操作しようとしていることを通知するプロンプトが表示されます。これは、パスワード、電話番号、クレジットカード情報などの機密の可能性がある Web ページ上のデータにそのショートカットがアクセスできることを示します。
「許可」をタップすると、指定した Web ページでショートカットが実行されます。同じショートカットを同じ Web ページで再度実行する場合は、プロンプトはもう表示されません。この許可は、ショートカットごと、Web ページごとに保持されます。
「ショートカット」では、ショートカットに Web ページへのアクセスを許可した後も、アップデートされたマルウェア定義を定期的にダウンロードして潜在的に悪質なスクリプトからさらに保護するための追加の手順が実行されます。「ショートカット」では、Web ページを操作する前に JavaScript が分析され、マルウェア定義が参照されます。この評価に基づき、スクリプトを許可するか、拒否するか、ショートカットの実行を許可する前に追加のプロンプトを表示するかが「ショートカット」に指示されます。
注記:この評価はデバイス上で行われます。JavaScript の内容(「Web ページで JavaScript を実行」アクションのテキストフィールドへの入力内容)が分析のために外部のサーバに送信されることはありません。
ショートカットの実行が阻止された場合は、説明のエラーメッセージが表示されます。
重要:信頼できない JavaScript を含むショートカットは実行しないでください。