Safariのオープンソースユーザースクリプトエディター
userscriptsは、iOS(iPados)およびmacosで利用できます。すべてのバージョンで、インストールはAppleのApp Storeを通じて行われます。 MacOSでは、 4.x
の前のバージョンがリポジトリから直接ダウンロードおよびインストールできるようになりましたが、Appleが開発者がWebExtension APIで構築されたアプリを配布する方法の変更により、これはもはやオプションではありません。
iOSでユーザースクリプトを実行するには、iOS 15.1以下にある必要があります。
MacOSでユーザースクリプトを実行するには、Safari 14.1以降とともに、12以降のMacOを実行する必要があります。
App Storeリンク
開発の進捗
このドキュメントを読むことをお勧めします。時間がある場合は、アプリと拡張機能に慣れるために、次のビデオの概要をご覧ください。
アプリがダウンロードされてインストールされたら、次の手順を実行する必要があります。
iOSアプリをインストールした後、拡張機能を機能させるには2つの主要な手順が必要です。
アプリを開き、ディレクトリを設定します(ユーザースクリプトを保存およびロードするため)
Set Userscripts Directory
ボタンをクリックして、ディレクトリを選択してくださいSafari(および許可許可)で拡張機能を有効にする
AA
ボタン、iPadのextension-icon
も、拡張機能のpopup
インターフェイスを開く)から拡張機能を管理します。All Websites
のユーザースクリプトAlways Allow
をお勧めします注記
アプリはSafariで拡張機能を有効にしたかどうかを検出できないため、拡張機能を有効にした後、アプリプロンプトは変更されません。現在、アプリインターフェイスは、userscriptsディレクトリの設定または変更にのみ使用されます。
MacOSとiOS間でスクリプトを同期するためにiCloudフォルダーを選択できますが、同期に遅延が発生する可能性があることに注意してください。Icloud最適化のためにファイルが立ち退きする可能性があることに注意してください。#424を参照してください。
iOSバージョンからユーザースクリプトをインストールする主な方法は2つあります。
.user.js
URLにアクセスしてから、拡張機能popup
を開くと、インストールプロンプトが表示されます.user.js
ファイルを上に設定したユーザースクリプトディレクトリに直接保存することもできますヒント
上記の両方がMacOSバージョンでも同様にうまく機能します。
iOSバージョンには、MacOSバージョンで提供されるスクリプトエディターは含まれていませんが、iOSで直接設定したディレクトリでスクリプトファイルをいつでも編集できます。 (サードパーティのコードエディターアプリを使用して、インプレースのオープニングと編集をサポートします)
MacOSにユーザースクリプトをインストールした後、複数のデバイス間でユーザースクリプトの同期を計画していない場合、ユーザースクリプトディレクトリを選択する必要はありません。代わりに~/User/Library/Containers/Userscripts/Data/Documents/scripts
にあるデフォルトのディレクトリを使用することを選択できます。これも、デフォルト(および自動)動作です。ユーザースクリプトを他の場所に保存する場合にのみ新しい場所を選択する必要があります。これは、SublimeテキストやVSCodeなどの外部コードエディターを使用している場合に特に便利です。
Appleの公式ガイドページを参照してください:MacでSafari拡張機能を使用してください
MacOSのこの拡張機能を使用してSafariでユーザースクリプトを簡単に作成/追加する方法を示す短いクリップは次のとおりです。
settings
ボタン(COGで表される)には、設定モーダルが表示されます(以下で説明します)plus
ボタンにより、ユーザーは新しいアイテムを追加できますNew CSS
CSSコードを期待する「ユーザースクリプト」ですNew Javascript
JavaScriptコードを期待するプロトタイプのユーザースクリプトですNew Remote
により、ユーザーはWebアドレスを入力してリモートホストのユーザースクリプト(またはスタイル)を追加できます(例:https: https://www.k21p.com/example.user.js
)@version
タグが含まれています@updateURL
タグが含まれていますDiscard
- 編集中に、ユーザースクリプトに行った未保存の変更を元に戻しますSave
- 編集中に、ユーザースクリプトに行ったすべての変更を保存しますCommand + S
はアクションのキーボードショートカットです() [] {} "" ''
2
スペースを使用することは絶対的な狂気であるため、明らかにデフォルトです4
@match
パターンのコンマ分離リスト(マッチパターン構造)を受け入れます。このリストのパターンと一致するページURLは、スクリプトインジェクションの場合は無視されますユーザースクリプトSafariは現在、次のユーザースクリプトメタデータをサポートしています。
@name
Name-これはサイドバーに表示され、ファイル名として使用される名前です - 同じタイプの複数のファイルに同じ名前を使用することはできません@description
description-これを使用してユーザースクリプトが何をするかを説明します - これはサイドバーに表示されます - 説明を非表示にする設定があります@icon
icon-これにはこのuserscriptマネージャーには関数がありませんが、メタデータで提供される最初の値はGM_/GM.info
オブジェクトでアクセスできます@match
match-ドメインマッチパターン - 複数のドメインマッチが必要な場合は、このフィールドのいくつかのインスタンスを使用できます - 参照してください:マッチパターン構造を参照してくださいhttp/s
のみをサポートします@exclude-match
スクリプトを実行したくないドメインパターン@include
include-注入のためにURLと一致するために使用される、球体、正規表現は許可されています。こちらをご覧ください@exclude
exclude- @include
と同様の方法で機能しますが、注入するのではなく、このキーの値との一致は噴射を防ぎます@inject-into
ユーザーは、スクリプトをに挿入するコンテキストを選択できるようにしますauto
(デフォルト)、 content
、 page
GM
APIは、 content
を使用する場合にのみ使用できます@run-at
@weight
@require
@version
@updateURL
とペアリングすると、マシン上のバージョンがアップデートURLの<
バージョンである場合、ユーザーはリモートソースからユーザースクリプトを更新できます。@version
それ自体では何もしません。リモート更新を適切に機能させるには、 @updateURL
とペアリングする必要があります@updateURL
>
ローカルマシンのバージョンの場合、ファイルは更新されます@updateURL
それ自体は何もしません。リモート更新を適切に機能させるには、 @version
とペアリングする必要があります@downloadURL
@version
と@updateURL
の両方を備えたファイル)@version
と@updateURL
とペアになった場合、ローカルバージョンが@updateURL
が指すファイルのバージョン<
場合、拡張機能は@downloadURL
にあるファイルの内容でファイルのコードを更新しようとします@downloadURL
それ自体で何もしません、それは適切に機能するために@version
と@updateURL
提示する必要があります@noframes
@grant
APIs
(もしあれば)、各@grant
行に1つのAPIメソッドのみが提供される命令制御が提供されます。@grant
値が提供されていない場合、想定されるnone
ません。none
と他の何かを指定した場合、優先されるnone
ません。すべてのユーザースクリプトは、実行するには少なくとも1つの@match
または@include
必要です!
現在、userscriptsは次のAPIメソッドをサポートしています。特に明記しない限り、すべての方法は非同期です。ユーザーは、ユーザースクリプトでそれらを使用するために、これらのメソッド@grant
必要があります。 APIメソッドを使用する場合、セキュリティの懸念により、コンテンツスクリプトの範囲に注入することのみが可能です。
注記
次のAPI説明が最新の開発ブランチに適用されます。対応するバージョンのドキュメントを確認する必要がある場合があります。上部のBranches
またはTags
を介して確認するバージョンに切り替えてください。
たとえば、App StoreのV4.xxバージョン:https://github.com/quoiod/userscripts/tree/release/4.xx
APIタイプの定義については、 types.d.ts
を参照してください
GM.addStyle(css)
css: String
Promise
を返し、失敗した場合はエラーメッセージで拒否されましたGM.setValue(key, value)
key: String
value: Any
- 任意の任意はjson -serializedにすることができますPromise
を返し、失敗した場合はエラーメッセージで拒否されましたGM.getValue(key, defaultValue)
key: String
defaultValue: Any
- オプションPromise
を返し、設定されたvalue
またはdefaultValue
が提供された場合、または成功した場合にundefined
場合、失敗した場合はエラーメッセージで拒否されましたGM.deleteValue(key)
key: String
Promise
を返し、失敗した場合はエラーメッセージで拒否されましたGM.listValues()
Promise
を返し、成功した場合に現在設定された値のキー名の配列で解決され、失敗した場合はエラーメッセージで拒否されましたGM.getTab()
Promise
を返し、このタブが成功した場合に開いている限り、永続的なAny
で解決され、失敗した場合はエラーメッセージで拒否されますGM.saveTab(tabObj)
tabObj: Any
- 任意の任意はjson -serializedになりますPromise
を返し、失敗した場合はエラーメッセージで拒否されましたGM.openInTab(url, openInBackground)
url: String
openInBackground: Bool
オプション、デフォルトでfalse
Promise
を返し、成功した場合に開いたタブのタブデータで解決され、失敗した場合はエラーメッセージで拒否されましたGM.closeTab(tabId)
tabId: Int
オプション、 caller tab
はデフォルトでPromise
を返し、失敗した場合はエラーメッセージで拒否されましたGM.setClipboard(data, type)
data: String
type: String
- オプション、 text/plain
デフォルトでPromise
を返し、 Bool
値で解決され、成功または失敗を示すことを示す、失敗した場合はエラーメッセージで拒否されましたGM.info
&& GM_info
@grant
に追加する必要なく利用できますscriptHandler: String
Userscripts
を返しますversion: String
- userscriptsアプリのバージョンscriptMetaStr: String
- 現在実行中のスクリプトのメタブロックscript: Object
- 現在実行されているスクリプトに関するデータが含まれていますdescription: String
exclude-match: [String]
excludes: [String]
grant: [String]
includes: [String]
inject-into: String
matches: [String]
name: String
namespace: String
noframes: Bool
require: [String]
resources: [String]
-現在実装されていませんrun-at: String
version: String
-ユーザースクリプトバージョン値GM.xmlHttpRequest(details)
details: Object
details
オブジェクトは、次のプロパティを受け入れますurl: String
- 必須method: String
- オプション、デフォルトでGET
user: String
- オプションpassword: String
- オプションheaders: Object
- オプションoverrideMimeType: String
オプションtimeout: Int
オプションbinary: Bool
オプション(非推奨、 Blob
、 ArrayBuffer
、 TypedArray
などのバイナリデータオブジェクトを使用してください。)data: String | Blob | ArrayBuffer | TypedArray | DataView | FormData | URLSearchParams
オプションresponseType: String
- オプションXMLHttpRequests
を参照してくださいonabort: Function
オプションonerror: Function
オプションonload: Function
- オプションonloadend: Function
オプションonloadstart: Function
オプションonprogress: Function
オプションonreadystatechange: Function
オプションontimeout: Function
オプションreadyState
response
responseHeaders
responseType
responseURL
status
statusText
timeout
responseText
( responseType
がtext
である場合)Promise
、Responseオブジェクトで解決された追加のプロパティを含む追加のabort
を含みます。const xhr = GM.xmlHttpRequest({...});
xhr.abort();
リクエストを中止しますconst response = await xhr;
const response = await GM.xmlHttpRequest({...});
GM_xmlhttpRequest(details)
GM.xmlHttpRequest(details)
と同じです。abort
オブジェクトを返します。これはFunction
ですconst foo = GM.xmlHttpRequest({...});
... foo.abort();
リクエストを中止しますこれは、アプリ/拡張子が読み取り、書き込みを行うディレクトリです。このディレクトリは、コンテンディングアプリを開き、それぞれの「変更場所」ボタンをクリックすることにより変更されます。
スクリプトディレクトリノート
このアプリ/拡張機能を使用しているときに問題に遭遇した場合、または何らかの支援が必要な場合は、リポジトリで問題を開いてください。そうするときは、できるだけ多くの詳細を提供してください。これには、システムの仕様と、実行しようとしているWebサイトとスクリプトが含まれます。問題のテンプレートに従ってください!
「スクリプトの実行を拒否した」エラー、私は何をすべきか!?
ウェブサイトのコンテンツセキュリティポリシーのために、このエラーが表示されます。現在、拡張コンテンツスクリプトがSafariでCSPをバイパスできるようにする方法はありません。
自動的に、拡張機能は厳格なCSPを回避しようとしますが、それでも問題が発生している場合は、userscriptメタデータキー
// @inject-into auto
または// @inject-into content
設定しようとします。この問題でこれについては、詳細をお読みください。
拡張機能のエディターを使用して、新しいユーザースクリプトを作成する必要がありますか、既存の編集をする必要がありますか?
独自のエディターを使用して、ファイルを更新および管理できます。ファイルを保存場所に保存し、それらが適切にフォーマットされている限り、それらを注入する必要があります。ただし、事前に拡張機能ポップアップを開く必要があります。つまり、新規を作成するか、外部エディターを使用して既存のユーザースクリプトを編集して保存場所に保存する場合、噴射が適切に発生する前に、拡張ポップアップを開き、ポップアップを完全にロードする必要があります。
キーボードショートカットは何ですか?
含まれているエディターを使用している間、
⌘ + s
クリックするとファイルが保存されます。編集者の作業中に、⌘ + f
クリックすると検索バーが表示され、esc
非表示になります。
@require
使用するとき、必要なファイルはどこに保存されますか?
必要なすべてのファイルは、MacOS 11.xの拡張コンテナフォルダーのJavaScriptファイルとして保存されます。そのフォルダーは、
~/Library/Containers/Userscripts/Data/Documents/require/
の保存場所にあります。要求フォルダーからファイルを移動するか、
manifest.json
ファイルを手動で編集すると、アプリ/拡張機能を破る可能性があります。
コードレベルの貢献を参照してください
さらに、「ヘルプ・ウェンテッド」とマークされた問題は、積極的に支援を求めています。これらの問題には、フィードバック、ガイダンス、またはコーディング支援の申し出について返信してください。
既存のIssues
やDiscussions
に参加してやり取りすることは、プロジェクトやオープンソースコミュニティにとって大きな助けになるでしょう。貢献していただきありがとうございます。
プロジェクトをサポートする最も迅速で簡単な方法は、拡張機能を楽しんで将来の改善を見たい場合、App Storeに肯定的なレビューを残すことです。これらのレビューを見ると、私が正しいことや間違ったことをしていることを知らせてくれ、プロジェクトに取り組み続けるように動機付けます。
支援する2番目の最良の方法は、アプリの新しいバージョンをテストするためにサインアップすることです。この拡張機能はプライバシーを重視し、ユーザーからデータを収集しないため、拡張機能の使用方法を測定することは困難です。ベータテスターになるためにサインアップすることで、今後の機能をテストできるだけでなく、実際のユーザーから直接フィードバックを引き出す機会を与えてくれます。
TestFlightパブリックリンクを介して、リリースの対応するベータ版を結合してテストしてください。
userscriptsは、ユーザーからデータを収集したり、アプリケーションと拡張機能内で実行したりするアクティビティやアクションを監視しません。これは、アプリケーションと拡張機能で行うすべてがあなたにとってプライベートであり、開発者や第三者と共有されることはないことを意味します。データ収集がないため、いかなる種類のデータ保持はありません。
著作権(c)2018-2024ジャスティンワサック
すべてのオープンソースアプリケーションのGNU General Publicライセンスv3.0ライセンスに基づいてライセンスされています。他のすべてのアプリケーションには商業ライセンスが必要です。