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许可,用于所有开源申请。所有其他申请都需要商业许可证。