Um editor de usuários de código aberto para safari
UsersCripts está disponível para iOS (iPados) e macOS. Para todas as versões, a instalação é feita através da App Store da Apple. No MacOS, as versões anteriores ao 4.x
foram disponibilizadas para download e instalar diretamente do repositório, mas devido a alterações na maneira como a Apple permite que os desenvolvedores distribuam aplicativos criados com a API da WEBEXTENSÃO, isso não é mais uma opção.
Para executar o UserScripts no iOS, você deve estar no iOS 15.1 ou superior.
Para executar o UserScripts no MacOS, você deve executar o MacOS 12 ou superior, juntamente com o Safari 14.1 ou superior.
Link da loja de app
Progresso do desenvolvimento
É recomendável ler esta documentação e, se você tiver tempo, assista às seguintes visões gerais de vídeo para se familiarizar com o aplicativo e a extensão.
Depois que o aplicativo for baixado e instalado, as seguintes etapas devem ser tomadas:
Depois de instalar o aplicativo iOS, você precisa de duas etapas principais para fazer com que a extensão funcione:
Abra o aplicativo e defina um diretório (para salvar e carregar os scripts de usuários)
Set Userscripts Directory
e selecione o diretórioHabilite a extensão no Safari (e as permissões de concessão)
AA
no iPhone, extension-icon
no iPad, também onde você abre a interface popup
da extensão)Always Allow
os scripts de usuários para All Websites
Observação
O aplicativo não pode detectar se você ativou a extensão no Safari; portanto, o prompt do aplicativo não será alterado após ativar a extensão. Atualmente, a interface do aplicativo é usada apenas para definir ou alterar o diretório do Usuários Scripts.
Você pode selecionar uma pasta iCloud para sincronizar scripts entre macOS e iOS, mas observe que pode haver atrasos na sincronização e você pode encontrar arquivos despejados devido à otimização do iCloud, consulte o #424.
Existem duas maneiras principais de instalar um script de usuário na versão iOS:
.user.js
no safari, depois abra o popup
de extensão e você verá um prompt de instalação.user.js
diretamente no diretório do Usuários Scripts que você definiu acima Dica
Ambos funcionam igualmente bem na versão MacOS.
A versão iOS não inclui o editor de scripts fornecido na versão MacOS, mas você sempre pode editar arquivos de script no diretório definido diretamente no iOS. (Use qualquer aplicativo de editor de código de terceiros, suporte e edição de suporte no local)
Depois de instalar o UserScripts no MacOS, você não precisa selecionar um diretório de scripts do Usuários se não planeja sincronizar seus scripts de usuários entre vários dispositivos. Em vez disso, você pode optar por usar o diretório padrão, localizado em ~/User/Library/Containers/Userscripts/Data/Documents/scripts
- novamente, esse é o comportamento padrão (e automático). Você só precisa selecionar um novo local se deseja armazenar seus scripts de usuários em outro lugar, o que é especialmente útil se estiver usando um editor de código externo, como texto sublime ou vscode.
Consulte a página de guia oficial da Apple: use extensões Safari no seu Mac
Aqui está um clipe curto mostrando como criar/adicionar um Usuários -Cript facilmente no Safari usando esta extensão no macOS
settings
(representado por um Cog) exibe o modal de configurações (discutido abaixo)plus
permite que os usuários adicionem novos itensNew CSS
é um "Usuários -Cript" que espera o código CSSNew Javascript
é um Usuários Prototípico que espera o código JavaScriptNew Remote
permite que o usuário adicione um Usuário (ou estilo) hospedado remoto (ou estilo) inserindo o endereço da Web ( ex: https://www.k21p.com/example.user.js
)@version
@updateURL
Discard
- Ao editar, reverte todas as alterações não salvas que você fez em um UsuárioscriptSave
- ao editar, salva todas as alterações que você fez em um UsuárioscriptCommand + S
é o atalho do teclado para a ação() [] {} "" ''
4
porque o uso de 2
espaços é uma insanidade absoluta@match
(estrutura do padrão de correspondência), um URL de página que corresponde a um padrão nesta lista será ignorado para injeção de scriptUserScripts Safari atualmente suporta os seguintes metadados do Usuário:
@name
- Este será o nome que exibe na barra lateral e será usado como o nome do arquivo - você não pode usar o mesmo nome para vários arquivos do mesmo tipo@description
- Use isso para descrever o que o seu Usuárioscript faz - isso será exibido na barra lateral - há uma configuração para ocultar descrições@icon
- Isso não tem uma função com este gerenciador de usuários, mas o primeiro valor fornecido nos metadados será acessível no objeto GM_/GM.info
@match
- Padrões de correspondência de domínio - você pode usar várias instâncias desse campo se desejar múltiplas correspondências de domínio - consulte: Combine a estrutura de padrõeshttp/s
@exclude-match
- padrões de domínio onde você não deseja que o script seja executado@include
- Usado para combinar contra URLs para injeção, globs e expressões regulares são permitidas, leia mais aqui@exclude
- Funções de maneira semelhante à @include
, mas, em vez de injetar, uma correspondência contra o valor dessa chave impedirá a injeção@inject-into
- permite ao usuário escolher em qual contexto injetar o script emauto
(padrão), content
, page
GM
estão disponíveis apenas ao usar content
@run-at
@weight
@require
@version
@updateURL
, isso permitirá que o usuário atualize um Usuárioscript de uma fonte remota, se a versão em sua máquina estiver <
versão no URL de atualização@version
não faz nada por si só, ele precisa ser emparelhado com @updateURL
para atualização remota para funcionar corretamente@updateURL
>
a versão na máquina local, o arquivo será atualizado@updateURL
não faz nada por si só, ele precisa ser combinado com @version
para atualização remota para funcionar corretamente@downloadURL
@version
e @updateURL
)@version
e @updateURL
, se a versão local for <
a versão do arquivo que @updateURL
aponta, a extensão tentará atualizar o código do arquivo com o conteúdo do arquivo localizado no @downloadURL
@downloadURL
não faz nada por si só, precisa de @version
e @updateURL
para apresentar para funcionar corretamente@noframes
@grant
APIs
especiais (se houver) seu script usa, uma em cada linha @grant
, apenas esses métodos da API serão fornecidos.@grant
for fornecido, none
será assumido.none
e algo mais, none
terá precedência. Todos os scripts de usuários precisam de pelo menos 1 @match
ou @include
para executar!
Atualmente, o UserScripts suporta os seguintes métodos da API. Todos os métodos são assíncronos, a menos que indicado de outra forma. Os usuários devem @grant
esses métodos para usá -los em um Usuárioscript. Ao usar os métodos da API, só é possível injetar o escopo do script de conteúdo devido a preocupações com segurança.
Observação
A descrição da API a seguir se aplica à filial de desenvolvimento mais recente, pode ser necessário verificar a documentação da versão correspondente. Por favor, mude para a versão que deseja verificar através de Branches
ou Tags
na parte superior.
Por exemplo, para a versão v4.xx da App Store: https://github.com/quoid/userscripts/tree/release/4.xx
Para definições de tipo de API, consulte: types.d.ts
GM.addStyle(css)
css: String
Promise
, resolvida se for bem -sucedida, rejeitada com a mensagem de erro se falharGM.setValue(key, value)
key: String
value: Any
- qualquerPromise
, resolvida se for bem -sucedida, rejeitada com a mensagem de erro se falharGM.getValue(key, defaultValue)
key: String
defaultValue: Any
- opcionalPromise
, resolvida com o value
que foi definido ou defaultValue
fornecido ou undefined
se for bem -sucedido, rejeitado com a mensagem de erro se falharGM.deleteValue(key)
key: String
Promise
, resolvida se for bem -sucedida, rejeitada com a mensagem de erro se falharGM.listValues()
Promise
, resolvida com uma matriz dos nomes -chave dos valores atualmente definidos se forem bem -sucedidos, rejeitados com a mensagem de erro se falharGM.getTab()
Promise
, resolvida com Any
dados que sejam persistentes, desde que esta guia esteja aberta se for bem -sucedida, rejeitada com a mensagem de erro se falharGM.saveTab(tabObj)
tabObj: Any
- qualquerPromise
, resolvida se for bem -sucedida, rejeitada com a mensagem de erro se falharGM.openInTab(url, openInBackground)
url: String
openInBackground: Bool
- opcional, false
por padrãoPromise
, resolvida com os dados da guia para a guia acabados de abrir se forem bem -sucedidos, rejeitados com a mensagem de erro se falharGM.closeTab(tabId)
tabId: Int
- opcional, a caller tab
por padrãoPromise
, resolvida se for bem -sucedida, rejeitada com a mensagem de erro se falharGM.setClipboard(data, type)
data: String
type: String
- opcional, text/plain
por padrãoPromise
, resolvida com um valor Bool
indicando que é bem -sucedido ou falha, rejeitado com a mensagem de erro se falharGM.info
&& GM_info
@grant
scriptHandler: String
- Retorna Userscripts
version: String
- A versão do App UsersCriptsscriptMetaStr: String
- O Metablock para o script atualmente em execuçãoscript: Object
- Contém dados sobre o script atualmente em execuçãodescription: 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]
- Atualmente não é implementadorun-at: String
version: String
- o valor da versão do UsuárioscriptGM.xmlHttpRequest(details)
details: Object
details
aceita as seguintes propriedadesurl: String
- Necessáriomethod: String
- Opcional, GET
por padrãouser: String
- Opcionalpassword: String
- opcionalheaders: Object
- opcionaloverrideMimeType: String
- Opcionaltimeout: Int
- opcionalbinary: Bool
- Opcional (depreciado, use objetos de dados binários como Blob
, ArrayBuffer
, TypedArray
, etc.)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
(quando responseType
é text
)Promise
personalizada contém um abort
de propriedade adicional, resolvido com o objeto de resposta.const xhr = GM.xmlHttpRequest({...});
xhr.abort();
Para abortar o pedidoconst response = await xhr;
const response = await GM.xmlHttpRequest({...});
GM_xmlhttpRequest(details)
GM.xmlHttpRequest(details)
, exceto:abort
, que é uma Function
const foo = GM.xmlHttpRequest({...});
... foo.abort();
Para abortar o pedido Este é o diretório em que o aplicativo/extensão será lendo e gravará para. Este diretório é alterado abrindo o aplicativo contendo e clicando no respectivo botão "Alterar localização".
Notas do diretório de scripts
Se você encontrar um problema ao usar este aplicativo/extensão ou precisar de alguma assistência, abra um problema aqui no repositório. Ao fazê -lo, forneça o máximo de detalhes possível. Isso inclui as especificações do sistema de listagem e qual site e script você está tentando executar. Siga o modelo de problema!
"Recusou -se a executar um (s) erro (s) um script", o que devo fazer!?
Você está vendo esse erro por causa da política de segurança de conteúdo do site. Atualmente, não há como permitir que os scripts de conteúdo de extensão ignorem os CSPs no Safari.
Automaticamente, a extensão tentará contornar CSPs rígidos, mas se você ainda estiver enfrentando problemas, tentando definir o Usuários-Cript Metadata Key/val
// @inject-into auto
ou// @inject-into content
.Você pode ler mais sobre isso nesta edição.
Preciso usar o editor da extensão para criar novos usuários ou para editar existentes?
Você pode usar seu próprio editor para atualizar e gerenciar seus arquivos. Desde que você salve os arquivos no local de salvamento e eles sejam formatados corretamente, eles devem ser injetados. No entanto, você deve abrir o pop -up de extensão com antecedência. Isso significa que, se você criar um novo ou editar um Usuário existente com um editor externo e salvá -lo no local de salvamento, antes que a injeção ocorra corretamente, o pop -up de extensão deverá ser aberto e o pop -up deve carregar completamente.
Quais são os atalhos do teclado?
Enquanto estiver usando o editor incluído, clicar em
⌘ + s
salvará o arquivo. Enquanto trabalha no editor, clicar em⌘ + f
exibirá a barra de pesquisa eesc
oculta.
Quando uso @require
, onde estão os arquivos necessários armazenados?
Todos os arquivos necessários são salvos como arquivos JavaScript na pasta de contêineres de extensão no macOS 11.x. Essa pasta está localizada no local de salvamento padrão, em:
~/Library/Containers/Userscripts/Data/Documents/require/
.Se você mover os arquivos da pasta Requer ou editar manualmente o arquivo
manifest.json
, provavelmente quebrará a funcionalidade de aplicativo/extensão.
Contribuições de nível de código Por favor, consulte contribuindo.md
Além disso, qualquer questão marcada com "ajuda procurada" está buscando ativamente assistência. Responda a esses problemas com feedback, orientação ou ofertas de assistência de codificação.
Participar e interagir com quaisquer Issues
ou Discussions
existentes seria uma grande ajuda para o projeto e as comunidades de código aberto. Obrigado por suas contribuições.
A maneira mais rápida e fácil de apoiar o projeto é deixando uma revisão positiva na App Store se você aproveitar a extensão e desejar ver melhorias futuras. Vendo essas críticas, deixe -me saber que estou fazendo algo certo, ou errado, e me motiva a continuar trabalhando no projeto.
A segunda melhor maneira de ajudar é se inscrever nas novas versões de teste beta do aplicativo. Como essa extensão valoriza sua privacidade e não coleta nenhum dado dos usuários , é difícil avaliar como a extensão está sendo usada. Ao se inscrever para ser um testador beta, ele não apenas permite testar os próximos recursos, mas também me oferece a oportunidade de obter feedback direto de usuários reais.
Participe e teste a versão beta correspondente em lançamentos através do link público do Testflight.
O UserScripts não coleta nenhum dados de seus usuários nem monitora as atividades ou ações que você executa no aplicativo e extensão. Isso significa que tudo o que você faz com o aplicativo e a extensão é privado para você e nunca é compartilhado com os desenvolvedores ou terceiros. Como não há coleta de dados, não há retenção de dados de qualquer tipo.
Copyright (c) 2018-2024 Justin Wasack
Licenciado sob a licença Pública Geral da GNU v3.0 Licença para todos os aplicativos de código aberto. Uma licença comercial é necessária para todos os outros aplicativos.