Un editor de servicios de usuarios de código abierto para Safari
Userscripts está disponible para iOS (iPados) y macOS. Para todas las versiones, la instalación se realiza a través de la App Store de Apple. En MacOS, las versiones anteriores a 4.x
se pusieron a disposición de descargar e instalar directamente desde el repositorio, pero debido a los cambios en la forma en que Apple permite a los desarrolladores distribuir aplicaciones construidas con la API WeBextension, esa ya no es una opción.
Para ejecutar loscripts en iOS, debe estar en iOS 15.1 o superior.
Para ejecutar loscripts en MacOS, debe ejecutar MacOS 12 o más, junto con Safari 14.1 o superior.
Enlace de la tienda de aplicaciones
Progreso del desarrollo
Se recomienda leer esta documentación y, si tiene tiempo, mire las siguientes descripciones de video para familiarizarse con la aplicación y la extensión.
Una vez que se descarga e instale la aplicación, se deben tomar los siguientes pasos:
Después de instalar la aplicación iOS, necesita dos pasos principales para que la extensión funcione:
Abra la aplicación y establezca un directorio (para guardar y cargar los reclutamientos de usuarios)
Set Userscripts Directory
y seleccione el directorioHabilite la extensión en Safari (y permisos de subvención)
AA
en iPhone, extension-icon
en iPad, también donde abre la interfaz popup
de la extensión)Always Allow
los reclutas de usuarios para All Websites
Nota
La aplicación no puede detectar si ha habilitado la extensión en Safari, por lo tanto, el mensaje de la aplicación no cambiará después de habilitar la extensión. Actualmente, la interfaz de la aplicación solo se usa para establecer o cambiar el directorio del UserScripts.
Puede seleccionar una carpeta iCloud para sincronizar scripts entre macOS e iOS, pero tenga en cuenta que puede haber retrasos en la sincronización, y puede ser evicado que los archivos sean evaluados debido a la optimización de iCloud, consulte el #424.
Hay dos formas principales de instalar un script de usuario desde la versión iOS:
.user.js
en Safari, luego abra la popup
de extensión y verá un aviso de instalación.user.js
directamente al directorio de UserScripts que establece anteriormente Consejo
Los dos anteriores funcionan igualmente bien en la versión MacOS.
La versión iOS no incluye el editor de script proporcionado en la versión MACOS, pero siempre puede editar archivos de script en el directorio que establece directamente en iOS. (Use cualquier aplicación de editor de código de terceros, admitir la apertura y edición en el lugar)
Después de instalar UserScripts en MacOS, no necesita seleccionar un directorio de UserScripts si no planea sincronizar suscripts de usuarios entre múltiples dispositivos. En su lugar, puede optar por usar el directorio predeterminado, que se encuentra en ~/User/Library/Containers/Userscripts/Data/Documents/scripts
- nuevamente, esto es un comportamiento predeterminado (y automático). Solo necesita seleccionar una nueva ubicación si desea almacenar suscripts de usuarios en otro lugar, lo cual es especialmente útil si está utilizando un editor de código externo como Text Sublime o VScode.
Consulte la página de guía oficial de Apple: use extensiones de safari en su Mac
Aquí hay un breve clip que muestra cómo crear/agregar fácilmente un escritor de usuarios en Safari usando esta extensión en MacOS
settings
(representado por un COG) muestra el modal de configuración (discutido a continuación)plus
permite a los usuarios agregar nuevos elementosNew CSS
es un "Userscript" que espera código CSSNew Javascript
es un escritor de usuarios prototípico que espera el código JavaScriptNew Remote
permite al usuario agregar un control de usuario (o estilo) remoto al ingresar la dirección web ( ex: https://www.k21p.com/example.user.js
)@version
@updateURL
EtiquetaDiscard
: mientras edita, revierte los cambios no salvados que ha realizado en un UserScriptSave
: mientras se edita, guarda todos los cambios que ha realizado en uncript de usuariosCommand + S
es el atajo de teclado para la acción() [] {} "" ''
4
porque usar 2
espacios es una locura absoluta@match
(estructura de patrones de coincidencia), una URL de página que coincide con un patrón en esta lista se ignorará para la inyección de scriptUserScripts Safari actualmente admite los siguientes metadatos del UserScript:
@name
: este será el nombre que se muestra en la barra lateral y se usará como nombre de archivo, no puede usar el mismo nombre para múltiples archivos del mismo tipo@description
- use esto para describir lo que hace su hript de usuario, esto se mostrará en la barra lateral, hay una configuración para ocultar descripciones@icon
: esto no tiene una función con este administrador de usuarios de UserScript, pero el primer valor proporcionado en los metadatos será accesible en el objeto GM_/GM.info
@match
- Patrones de coincidencia de dominio: puede usar varias instancias de este campo si desea que sean múltiples coincidencias de dominio. Consulte: Estructura de patrones de coincidenciahttp/s
@exclude-match
- Patrones de dominio donde no desea que se ejecute el script@include
: solía coincidir con URL para inyección, se permiten globos y expresiones regulares, lea más aquí@exclude
: funciona de manera similar a @include
, pero en lugar de inyectar, una coincidencia contra el valor de esta clave evitará la inyección@inject-into
: permite al usuario elegir qué contexto inyectar el script enauto
(predeterminado), content
, page
GM
solo están disponibles al usar content
@run-at
@weight
@require
@version
@updateURL
, esto permitirá al usuario actualizar uncriptis de usuarios desde una fuente remota, si la versión en su máquina es <
versión en la URL de actualización@version
no hace nada por sí solo, debe emparejarse con @updateURL
para la actualización remota para funcionar correctamente@updateURL
>
la versión en la máquina local, el archivo se actualizará@updateURL
no hace nada por sí mismo, debe emparejarse con @version
para la actualización remota para funcionar correctamente@downloadURL
@version
como @updateURL
)@version
y @updateURL
, si la versión local es <
la versión del archivo a la que apunta @updateURL
, la extensión intentará actualizar el código del archivo con el contenido del archivo ubicado en el @downloadURL
@downloadURL
no hace nada por sí mismo, necesita @version
y @updateURL
para presentar para funcionar correctamente@noframes
@grant
APIs
especiales (si las hay) utiliza su script, uno en cada línea @grant
, solo se proporcionarán esos métodos API.@grant
, no se supondrá none
.none
y algo más, none
tiene prioridad. ¡Todos los reclutamientos de usuarios necesitan al menos 1 @match
o @include
para ejecutarse!
UserScripts actualmente admite los siguientes métodos API. Todos los métodos son asincrónicos a menos que se indique lo contrario. Los usuarios deben @grant
estos métodos para usarlos en uncript de usuarios. Al usar métodos API, solo es posible inyectar el alcance del script de contenido debido a preocupaciones de seguridad.
Nota
La siguiente descripción de la API se aplica a la última rama de desarrollo, es posible que deba verificar la documentación de la versión correspondiente. Cambie a la versión que desea verificar a través Branches
o Tags
en la parte superior.
Por ejemplo, para la versión v4.xx de la tienda de aplicaciones: https://github.com/boid/userscripts/tree/release/4.xx
Para definiciones de tipo API, consulte: types.d.ts
GM.addStyle(css)
css: String
Promise
, resuelta si tiene éxito, rechazado con un mensaje de error si fallaGM.setValue(key, value)
key: String
value: Any
- Cualquiera puede ser JSON -serializadoPromise
, resuelta si tiene éxito, rechazado con un mensaje de error si fallaGM.getValue(key, defaultValue)
key: String
defaultValue: Any
- opcionalPromise
, resuelto con el value
establecido o defaultValue
proporcionado o undefined
si tiene éxito, rechazado con mensaje de error si fallaGM.deleteValue(key)
key: String
Promise
, resuelta si tiene éxito, rechazado con un mensaje de error si fallaGM.listValues()
Promise
, resuelta con una matriz de los nombres clave de los valores establecidos actualmente si tiene éxito, rechazado con mensaje de error si fallaGM.getTab()
Promise
, resuelta con Any
dato que sea persistente siempre que esta pestaña esté abierta si tiene éxito, rechazado con un mensaje de error si fallaGM.saveTab(tabObj)
tabObj: Any
- Cualquiera puede ser JSON -serializadoPromise
, resuelta si tiene éxito, rechazado con un mensaje de error si fallaGM.openInTab(url, openInBackground)
url: String
openInBackground: Bool
- opcional, false
de forma predeterminadaPromise
, resuelto con los datos de la pestaña para la pestaña que acaba de abrir si tiene éxito, rechazado con el mensaje de error si fallaGM.closeTab(tabId)
tabId: Int
- opcional, la caller tab
de forma predeterminadaPromise
, resuelta si tiene éxito, rechazado con un mensaje de error si fallaGM.setClipboard(data, type)
data: String
type: String
- opcional, text/plain
de forma predeterminadaPromise
, resuelto con un valor Bool
que indica que tiene éxito o falla, rechazado con mensaje de error si fallaGM.info
&& GM_info
@grant
scriptHandler: String
- Devuelve Userscripts
version: String
: la versión de la aplicación UserScriptsscriptMetaStr: String
: el metablock para el script que se ejecuta actualmentescript: Object
: contiene datos sobre el script en ejecución actualmentedescription: 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]
- Actualmente no implementadorun-at: String
version: String
: el valor de la versión de UserScriptGM.xmlHttpRequest(details)
details: Object
details
acepta las siguientes propiedadesurl: String
- requeridomethod: String
- opcional, GET
por defectouser: String
- opcionalpassword: String
- opcionalheaders: Object
- opcionaloverrideMimeType: String
- opcionaltimeout: Int
- opcionalbinary: Bool
: opcional (en desuso, use objetos de datos binarios como Blob
, ArrayBuffer
, TypedArray
, etc. en su lugar).data: String | Blob | ArrayBuffer | TypedArray | DataView | FormData | URLSearchParams
- OpcionalresponseType: String
- opcionalXMLHttpRequests
onabort: Function
- opcionalonerror: Function
- opcionalonload: Function
- Opcionalonloadend: Function
- opcionalonloadstart: Function
- opcionalonprogress: Function
- Opcionalonreadystatechange: Function
- opcionalontimeout: Function
- opcionalreadyState
response
responseHeaders
responseType
responseURL
status
statusText
timeout
responseText
(cuando responseType
es text
)Promise
personalizada contiene un abort
de propiedad adicional, resuelto con el objeto de respuesta.const xhr = GM.xmlHttpRequest({...});
xhr.abort();
para abortar la solicitudconst response = await xhr;
const response = await GM.xmlHttpRequest({...});
GM_xmlhttpRequest(details)
GM.xmlHttpRequest(details)
, excepto:abort
, que es una Function
const foo = GM.xmlHttpRequest({...});
... foo.abort();
para abortar la solicitud Este es el directorio donde se leerá la aplicación/extensión. Este directorio se cambia abriendo la aplicación que contiene y haciendo clic en el botón "Cambiar ubicación" respectivo.
Notas del directorio de scripts
Si encuentra un problema al usar esta aplicación/extensión o necesita ayuda, abra un problema aquí en el repositorio. Al hacerlo, proporcione la mayor cantidad de detalles posible. Esto incluye especificaciones del sistema de listado y qué sitio web y script que está intentando ejecutar. ¡Siga la plantilla de problema!
"Se negó a ejecutar un script" Error (s), ¿qué debo hacer?
Está viendo este error debido a la política de seguridad de contenido del sitio web. Actualmente no hay forma de permitir que los scripts de contenido de extensión omitan los CSP en Safari.
Automáticamente, la extensión intentará eludir los CSP estrictos, pero si todavía está experimentando problemas, intentando configurar la tecla Metadatos de Ussion/Val
// @inject-into auto
o// @inject-into content
.Puede leer más sobre esto en este tema.
¿Necesito utilizar el editor de la extensión para crear nuevos reclutas de usuarios o para editar existentes?
Puede usar su propio editor para actualizar y administrar sus archivos. Siempre que esté guardando los archivos en la ubicación de guardado, y están formateados correctamente, deben inyectarse. Sin embargo, debe abrir la ventana emergente de extensión de antemano. Eso significa que si crea un nuevo o edita un recurso de usuarios existente con un editor externo y lo guarda en la ubicación de guardado, antes de que la inyección ocurra correctamente, la ventana emergente de extensión debe abrirse y la ventana emergente debe cargarse por completo.
¿Cuáles son los atajos del teclado?
Mientras usa el editor incluido, hacer clic en
⌘ + s
guardará el archivo. Mientras trabaja en el editor, hacer clic en⌘ + f
aparecerá en la barra de búsqueda yesc
lo ocultará.
Cuando uso @require
, ¿dónde se almacenan los archivos requeridos?
Todos los archivos requeridos se guardan como archivos JavaScript en la carpeta de contenedores de extensión en MacOS 11.x. Esa carpeta se encuentra en la ubicación de guardado predeterminada, en:
~/Library/Containers/Userscripts/Data/Documents/require/
.Si mueve archivos de la carpeta Requerir o edita manualmente el archivo
manifest.json
, es probable que rompa la funcionalidad de aplicación/extensión.
Contribuciones de nivel de código Consulte a contribuir.md
Además, cualquier problema marcado como "ayuda buscada" está buscando asistencia activamente. Responda a esos problemas con comentarios, orientación u ofertas de asistencia de codificación.
Participar e interactuar con cualquier Issues
o Discussions
existente sería de gran ayuda para el proyecto y las comunidades de código abierto. Gracias por sus contribuciones.
La forma más rápida y fácil de apoyar el proyecto es dejar una revisión positiva en la App Store si disfruta de la extensión y desea ver mejoras futuras. Al ver estas reseñas, me hace saber que estoy haciendo algo bien, o mal, y me motiva a seguir trabajando en el proyecto.
La segunda mejor manera de ayudar es registrarse en las nuevas versiones de la aplicación. Dado que esta extensión valora su privacidad y no recopila ningún dato de los usuarios , es difícil medir cómo se usa la extensión. Al registrarse para ser un probador beta, no solo le permite probar las próximas funciones, sino que también me da la oportunidad de obtener comentarios directos de los usuarios reales.
Une y pruebe la versión beta correspondiente en versiones a través del enlace público TestFlight.
UserScripts no recopila ningún dato de sus usuarios ni monitorea actividades o acciones que realice dentro de la aplicación y la extensión. Esto significa que todo lo que hace con la aplicación y la extensión son privados para usted y nunca se comparte con los desarrolladores o terceros. Dado que no hay recopilación de datos, no hay retención de datos de ningún tipo.
Copyright (c) 2018-2024 Justin Wasack
Licencia con licencia bajo la Licencia Pública General de GNU V3.0 para todas las aplicaciones de código abierto. Se requiere una licencia comercial para todas las demás aplicaciones.