Safari的開源用戶訂閱編輯器
iOS(iPados)和MacOS可用於USERCRIPTS。對於所有版本,安裝都是通過Apple的App Store完成的。在MACOS上, 4.x
之前的版本可直接從存儲庫下載和安裝,但是由於Apple允許開發人員可以分發使用Webextension API構建的應用程序的方式,因此不再是一個選項。
要在iOS上運行USERCRIPTS,您應該使用iOS 15.1或更高版本。
要在MacOS上運行Userscript,您應該運行MacOS 12或更高版本,以及Safari 14.1或更高版本。
App Store鏈接
發展進步
建議閱讀此文檔,如果您有時間,請觀看以下視頻概述,以熟悉應用程序和擴展。
下載應用程序並安裝了以下步驟:
安裝iOS應用後,您需要兩個主要步驟來使擴展名工作:
打開應用程序並設置一個目錄(用於保存和加載Userscripts)
Set Userscripts Directory
按鈕,然後選擇目錄啟用野生動物園的擴展(和授予權限)
extension-icon
的AA
按鈕,也可以打開擴展名的popup
界面)來管理擴展程序。Always Allow
All Websites
的用戶標記筆記
該應用程序無法檢測您是否已啟用了Safari的擴展名,因此,在啟用擴展程序後,應用程序提示不會更改。當前,應用程序接口僅用於設置或更改Userscripts目錄。
您可以選擇一個在MacOS和iOS之間同步腳本的iCloud文件夾,但是請注意,同步可能會延遲,並且由於ICLOUD優化而可能會遇到文件,請參閱#424。
從iOS版本中安裝用戶腳本的主要方法有兩種:
.user.js
URL,然後打開擴展popup
,您將看到一個安裝提示.user.js
文件直接保存到您在上方設置的Userscripts目錄提示
以上兩個在MACOS版本中同樣效果很好。
iOS版本不包括MacOS版本中提供的腳本編輯器,但是您可以始終在直接在iOS上設置的目錄中編輯腳本文件。 (使用任何第三方代碼編輯器應用程序,在現場開放和編輯中支持)
在MACOS上安裝Userscript之後,如果您不打算在多個設備之間同步您的用戶標記,則無需選擇一個Usercripts目錄。取而代之的是,您可以選擇使用位於~/User/Library/Containers/Userscripts/Data/Documents/scripts
默認目錄,這是默認(和自動)行為。您只需要選擇一個新的位置,如果您想將您的Userscript存儲在其他地方,當您使用外部代碼編輯器(例如Sublime Text或vScode)時,這特別有用。
請參閱Apple的官方指南頁:使用Mac上的Safari擴展名
這是一個簡短的剪輯
settings
按鈕(由COG表示)顯示設置模式(下面討論)plus
按鈕允許用戶添加新項目New CSS
是一個“用戶cons”,期望CSS代碼New Javascript
是一個典型的用戶,可以期待JavaScript代碼New Remote
允許用戶通過輸入Web地址(例如:https: https://www.k21p.com/example.user.js
)來添加遠程託管的Usercript(或樣式)(或樣式))@version
標籤@updateURL
標籤Discard
- 在編輯時,將您對用戶的任何未保存的更改恢復Save
- 編輯時,保存您對用戶的所有更改Command + S
是操作的鍵盤快捷鍵() [] {} "" ''
4
,因為使用2
空格是絕對的精神錯亂@match
模式的逗號分開列表(匹配模式結構),與本列表中的模式匹配的頁面URL將在腳本注入中忽略Userscripts Safari當前支持以下Userscript元數據:
@name
name-這將是在側邊欄中顯示並用作文件名的名稱 - 您無法為同一類型的多個文件使用相同的名稱@description
Description-使用此描述您的用戶字樣 - 這將顯示在側邊欄中 - 有一個隱藏說明的設置@icon
icon-這沒有此Userscript Manager的功能,但是元數據中提供的第一個值將在GM_/GM.info
對像中訪問@match
域匹配模式 - 如果您需要多個域匹配,則可以使用此字段的幾個實例 - 請參考:匹配模式結構http/s
@exclude-match
不希望腳本運行的域模式@include
Include-用於與註射URL相匹配,允許地球和正則表達式,請在此處閱讀更多@exclude
以與@include
相似的方式函數@inject-into
允許用戶選擇將腳本注入的上下文auto
(默認), content
, page
GM
API僅在使用content
時可用@run-at
@weight
@require
@version
@updateURL
配對時,如果其計算機上的版本為<
版本,則用戶可以從遠程源更新Usercript@version
本身無能為力,它需要與@updateURL
配對以使遠程更新以正常功能@updateURL
>
本地計算機上的版本,則文件將被更新@updateURL
本身沒有任何作用,它需要與@version
配對以使遠程更新以正常功能@downloadURL
@version
和@updateURL
的文件)@version
和@updateURL
配對時,如果本地版本為<
@updateURL
指向的文件的版本,則擴展名將嘗試使用位於@downloadURL
上的文件的內容來更新文件代碼@downloadURL
本身沒有做任何事情,它需要@version
和@updateURL
才能出現才能正常運行@noframes
@grant
APIs
(如果有),則在每個@grant
行上使用一個,僅提供這些API方法。@grant
值, none
不會假設。none
指定其他內容, none
優先考慮。所有Userscript至少需要1 @match
或@include
運行!
當前,Userscript支持以下API方法。除非另有說明,否則所有方法都是異步的。用戶必須@grant
這些方法才能在用戶標題中使用它們。使用API方法時,由於安全性問題,只能將其註入內容腳本範圍。
筆記
以下API說明適用於最新的開發分支,您可能需要檢查對應版本的文檔。請切換到您要通過Branches
或頂部的Tags
檢查的版本。
例如,對於App Store的v4.xx版本:https://github.com/quoid/userscripts/tree/release/4.xx
有關API類型定義,請參閱: types.d.ts
GM.addStyle(css)
css: String
Promise
,如果成功,則解決了,如果失敗,則拒絕了錯誤消息GM.setValue(key, value)
key: String
value: Any
- 任何人都可以是JSON序列化Promise
,如果成功,則解決了,如果失敗,則拒絕了錯誤消息GM.getValue(key, defaultValue)
key: String
defaultValue: Any
- 可選Promise
,並以設置或默認值為或defaultValue
undefined
value
,如果成功,則拒絕錯誤消息,如果失敗GM.deleteValue(key)
key: String
Promise
,如果成功,則解決了,如果失敗,則拒絕了錯誤消息GM.listValues()
Promise
,並以當前設置值的關鍵名稱的數組解決,如果成功,則拒絕,如果失敗GM.getTab()
Promise
,並用Any
持久數據解決,只要此選項卡(如果成功)打開,如果失敗,則拒絕錯誤消息GM.saveTab(tabObj)
tabObj: Any
人都可以被json序列化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
- 當前正在運行的腳本的Metablockscript: 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
- Userscript版本值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
包含一個額外的屬性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();
中止請求這是應用程序/擴展程序將從中讀取和寫入的目錄。通過打開包含應用程序並單擊相應的“更改位置”按鈕來更改此目錄。
腳本目錄註釋
如果您在使用此應用程序/擴展程序時遇到問題或需要一些幫助,請在存儲庫中打開一個問題。這樣做時,請提供盡可能多的細節。這包括列表系統規格以及您要執行的網站和腳本。請遵循問題模板!
“拒絕執行腳本”錯誤,我該怎麼辦!
由於網站的內容安全策略,您正在看到此錯誤。當前,無法允許擴展內容腳本繞過Safari中的CSP。
自動,擴展程序將嘗試規避嚴格的CSP,但是如果您仍在遇到問題,請嘗試設置Userscript Metadata鍵/val
// @inject-into auto
或// @inject-into content
。您可以在本期中閱讀有關此信息的更多信息。
我是否需要使用擴展程序的編輯器來創建新的Userscript或編輯現有?
您可以使用自己的編輯器來更新和管理文件。只要您將文件保存到保存位置,並且要正確格式化,就應注入它們。但是,您必須事先打開擴展名彈出窗口。這意味著,如果您使用外部編輯器創建新的或編輯了現有的用戶字樣,並將其保存到保存位置,則在正確進行注入之前,必須打開擴展彈出窗口,並且彈出窗口必須完全加載。
什麼是鍵盤快捷鍵?
在使用隨附的編輯器時,單擊
⌘ + s
將保存文件。在編輯器工作時,單擊⌘ + f
將提出搜索欄,esc
將隱藏它。
當我使用@require
時,所需的文件存儲在哪裡?
所有必需的文件均以JavaScript文件保存在MacOS 11.x的擴展容器文件夾中。該文件夾位於默認保存位置,at:
~/Library/Containers/Userscripts/Data/Documents/require/
。如果將文件從需求文件夾移動或手動編輯
manifest.json
文件。
代碼級貢獻請參閱貢獻。
此外,標記為“幫助”的任何問題都在積極尋求幫助。請通過反饋,指導或編碼幫助提出回應這些問題。
參與並與任何現有Issues
或Discussions
進行互動將對項目和開源社區有很大幫助。謝謝您的貢獻。
支持該項目的最快,最簡單的方法是,如果您喜歡擴展名,並希望看到未來的改進,請在應用商店上留下積極的評價。看到這些評論讓我知道我在做對或錯的事情,並激勵我繼續從事該項目。
幫助的第二種最佳方法是註冊該應用程序的新版本。由於此擴展值重視您的隱私,並且不會從用戶那裡收集任何數據,因此很難衡量如何使用擴展名。通過註冊成為Beta測試儀,它不僅允許您測試即將到來的功能,而且還使我有機會從真實用戶那裡獲得直接反饋。
請通過TestFlight公共鏈接加入並測試發行版中的相應Beta版本。
Userscript不會從其用戶那裡收集任何數據,也不會監視您在應用程序和擴展中執行的活動或操作。這意味著您對應用程序和擴展的所有內容都是您私人的,並且從未與開發人員或第三方共享。由於沒有數據收集,因此沒有任何類型的數據保留。
版權(C)2018-2024 Justin Wasack
根據GNU通用公共許可證v3.0許可,用於所有開源申請。所有其他申請都需要商業許可證。