Редактор Userscript с открытым исходным кодом для Safari
Userscripts доступен для iOS (iPados) и MacOS. Для всех версий установка проводится через Apple App Store. В MacOS версии перед 4.x
были доступны для загрузки и установки непосредственно из репозитория, но из -за изменений в способах Apple позволяет разработчикам распространять приложения, построенные с помощью API Webextension, это больше не является вариантом.
Чтобы запустить пользовательские программы на iOS, вы должны быть на iOS 15.1 или выше.
Чтобы запустить пользовательские программы на macOS, вы должны запустить MacOS 12 или выше, а также Safari 14,1 или выше.
Ссылка магазина приложений
Прогресс развития
Рекомендуется прочитать эту документацию, и, если у вас есть время, посмотрите следующие обзоры видео, чтобы ознакомиться с приложением и расширением.
После загрузки и установки приложения следует предпринять следующие шаги:
После установки приложения для iOS вам нужно два основных шага, чтобы сделать расширение:
Откройте приложение и установите каталог (для сохранения и загрузки пользователей)
Set Userscripts Directory
и выберите каталогВключить расширение в сафари (и разрешения предоставления)
AA
на iPhone, extension-icon
на iPad, также где вы открываете интерфейс popup
окна расширения)Always Allow
пользователям для All Websites
Примечание
Приложение не может определить, включили ли вы расширение в Safari, поэтому приложение приложения не изменится после того, как вы включите расширение. В настоящее время интерфейс приложения используется только для установки или изменения каталога пользователей.
Вы можете выбрать папку iCloud для синхронизации сценариев между macOS и iOS, но пожалуйста, обратите внимание, что могут быть задержки в синхронизации, и вы можете встретиться с файлами, которые будут выселены из -за оптимизации iCloud, см. № 424.
Есть два основных способа установить пользовательский скрипт из версии iOS:
popup
URL -адрес .user.js
.user.js
непосредственно в каталог пользователей, который вы установили выше Кончик
Оба вышеперечисленного работают одинаково хорошо в версии MacOS.
Версия iOS не включает в себя редактор скриптов, представленного в версии MacOS, но вы всегда можете редактировать файлы сценариев в каталоге, который вы устанавливаете непосредственно на iOS. (Используйте любые сторонние приложения редактора кодов, поддержка открытия и редактирования на месте)
После установки пользовательских программ на macOS вам не нужно выбирать каталог пользователей, если вы не планируете синхронизировать свои пользователи между несколькими устройствами. Вместо этого вы можете использовать каталог по умолчанию, который расположен по адресу ~/User/Library/Containers/Userscripts/Data/Documents/scripts
- опять же, это поведение по умолчанию (и автоматическое). Вам нужно выбрать новое место, если вы хотите сохранить свои пользователи в другом месте, что особенно полезно, если вы используете внешний редактор кода, такой как Sublime Text или VSCODE.
См. Официальное руководство Apple: используйте расширения Safari на вашем Mac
Вот короткий клип, показывающий, как легко создать/добавить пользовательский фрагмент в Safari, используя это расширение на MacOS
settings
(представлена COG) отображает модальный настройки (обсуждается ниже)plus
позволяет пользователям добавлять новые элементыNew CSS
- это «пользовательский», который ожидает кода CSSNew Javascript
- это прототип userscript, который ожидает кода JavaScriptNew Remote
позволяет пользователю добавить удаленную размещенную пользовательскую программу (или стиль), введя веб -адрес ( например: https://www.k21p.com/example.user.js
)@version
@updateURL
Discard
- во время редактирования, возвращает любые неспасенные изменения, которые вы внесли в UserScriptSave
- во время редактирования сохраняет все изменения, которые вы внесли в пользовательскийCommand + S
- сочетание клавиатуры для действия() [] {} "" ''
4
потому что использование 2
пробелов является абсолютным безумием@match
(структура шаблона соответствия), URL -адрес страницы, который соответствует шаблону в этом списке, будет игнорироваться для инъекции сценарияSafari userscripts в настоящее время поддерживает следующие метаданные пользователя:
@name
- это будет имя, которое отображается на боковой панели и будет использоваться в качестве имени файла - вы не можете использовать одно и то же имя для нескольких файлов одного типа@description
- Используйте это, чтобы описать, что делает ваш пользовательский фрагмент - это будет отображаться на боковой панели - есть настройка, чтобы скрыть описания@icon
- Это не имеет функции с этим диспетчера пользователей, но первое значение, предоставленное в метаданных, будет доступно в объекте GM_/GM.info
@match
- шаблоны соответствия домена - вы можете использовать несколько экземпляров этого поля, если вам нужны несколько совпадений доменов - пожалуйста, см.http/s
@exclude-match
- шаблоны доменов, где вы не хотите, чтобы сценарий запускался@include
- используется для совпадения с URL -адресами для инъекций, глобусов и регулярных выражений разрешено, читайте больше здесь@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
, будут предоставлены только эти методы API.@grant
не предоставляются, none
будет принят.none
и что -то другое, none
имеет приоритета. Все пользователям необходимо по крайней мере 1 @match
или @include
чтобы запустить!
Пользовательскими программами в настоящее время поддерживают следующие методы API. Все методы являются асинхронными, если не указано иное. Пользователи должны @grant
эти методы, чтобы использовать их в пользовательском фрагменте. При использовании методов API можно только ввести в сценарий контента из -за проблем безопасности.
Примечание
Следующее описание API применимо к последней филиалам разработки, вам может потребоваться проверить документацию на предмет соответствующей версии. Пожалуйста, переключитесь на версию, которую вы хотите проверить с помощью Branches
или Tags
вверху.
Например, для версии V.4.xx Store App Store: 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
, разрешено со value
, которое было установлено или defaultValue
предоставленным или undefined
, если он будет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
- версия приложения пользователейscriptMetaStr: String
- Metablock для в настоящее время запущенного сценария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
- значение версии userscriptGM.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();
чтобы прервать запрос Это каталог, в котором приложение/расширение будет читать и написать. Этот каталог изменяется, открывая приложение сдерживающего и нажав кнопку «Расположение местоположения».
Примечания к каталогу сценариев
Если вы столкнетесь с проблемой при использовании этого приложения/расширения или вам нужна какая -то помощь, пожалуйста, откройте проблему здесь, в репозитории. При этом, пожалуйста, предоставьте как можно больше деталей. Это включает в себя спецификации системы листинга и какой веб -сайт и сценарий вы пытаетесь выполнить. Пожалуйста, следуйте шаблону выпуска!
«Отказался выполнить сценарий» ошибки (ы), что мне делать!?
Вы видите эту ошибку из -за политики безопасности контента веб -сайта. В настоящее время нет способа позволить сценариям контента расширения обходить CSP в Safari.
Автоматически, расширение попытается обойти строгие CSP, но если у вас все еще возникает проблемы, пытаясь установить ключ Metadata Usercript/val
// @inject-into auto
или// @inject-into content
.Вы можете прочитать больше об этом в этом выпуске.
Нужно ли использовать редактор расширения для создания новых пользовательских программ или для редактирования существующих?
Вы можете использовать свой собственный редактор для обновления и управления своими файлами. Пока вы сохраняете файлы в место сохранения, и они должным образом отформатированы, они должны быть введены. Тем не менее, вы должны открыть всплывающее окно расширения заранее. Это означает, что если вы создаете новый или редактируете существующий пользовательский фрагмент с помощью внешнего редактора и сохраните его в место сохранения, до того, как впрыск произойдет должным образом, всплывающее окно для расширения должно быть открыто, и всплывающее окно должно загружаться полностью.
Какие сочетания клавиш?
В то время как используя прилагаемый редактор, нажатие
⌘ + s
сохранит файл. Работая в редакторе, щелчок⌘ + f
будет подняться на строку поиска, иesc
будет скрывать его.
Когда я использую @require
, где хранятся необходимые файлы?
Все необходимые файлы сохраняются в виде файлов JavaScript в папке контейнера для расширения в macOS 11.x. Эта папка расположена в месте сохранения по умолчанию, по адресу:
~/Library/Containers/Userscripts/Data/Documents/require/
.Если вы перемещаете файлы из папки «Восстания» или вручную отредактировать файл
manifest.json
, вы, вероятно, сломаете функциональность приложения/расширения.
Взносы на уровень кода, пожалуйста, обратитесь к Anforming.md
Кроме того, любая проблема, отмеченная «помощь, разыскивается», активно ищет помощь. Пожалуйста, ответьте на эти вопросы с обратной связью, руководством или предложениями о помощи в кодировании.
Участие и взаимодействие с любыми существующими Issues
или Discussions
оказало бы большую помощь для сообществ проекта и с открытым исходным кодом. Спасибо за ваш вклад.
Самый быстрый и самый простой способ поддержки проекта - оставить положительный отзыв в App Store, если вы наслаждаетесь расширением и хотите увидеть будущие улучшения. Видя эти отзывы, дайте мне знать, что я делаю что -то правильно, или неправильно, и мотивирует меня продолжать работать над проектом.
Второй лучший способ помочь - зарегистрироваться на бета -тестирование новых версий приложения. Поскольку это расширение ценит вашу конфиденциальность и не собирает никаких данных от пользователей , трудно измерить, как используется расширение. Подписавшись на бета -тестер, он не только позволяет вам проверять предстоящие функции, но и дает мне возможность получить прямую обратную связь от реальных пользователей.
Пожалуйста, присоединяйтесь и протестируйте соответствующую бета -версию в выпусках через публичную ссылку Testflight.
Userscripts не собирает никаких данных от своих пользователей и не контролирует действия или действия, которые вы выполняете в рамках приложения и расширения. Это означает, что все, что вы делаете с приложением и расширением, является для вас частным и никогда не совместно используется с разработчиками или третьими лицами. Поскольку нет сбора данных, нет никакого сохранения данных.
Copyright (C) 2018-2024 Джастин Васак
Лицензировано в соответствии с общей публичной лицензией GNU V3.0 для всех заявок с открытым исходным кодом. Коммерческая лицензия требуется для всех других заявлений.