Editor Sumber Sumber Terbuka untuk Safari
Userscripts tersedia untuk iOS (iPadOS) dan macOS. Untuk semua versi, instalasi dilakukan melalui App Store Apple. Pada macOS, versi sebelum 4.x
tersedia untuk diunduh dan diinstal langsung dari repositori, tetapi karena perubahan dalam cara Apple memungkinkan pengembang untuk mendistribusikan aplikasi yang dibangun dengan WebExtension API, yang tidak lagi menjadi opsi.
Untuk menjalankan Userscripts di iOS Anda harus di iOS 15.1 atau lebih tinggi.
Untuk menjalankan Userscripts di macOS, Anda harus menjalankan macOS 12 atau lebih tinggi, bersama dengan Safari 14.1 atau lebih tinggi.
Tautan App Store
Kemajuan Pembangunan
Direkomendasikan untuk membaca dokumentasi ini dan, jika Anda punya waktu, tonton ikhtisar video berikut untuk membiasakan diri dengan aplikasi dan ekstensi.
Setelah aplikasi diunduh dan diinstal, langkah -langkah berikut harus diambil:
Setelah menginstal aplikasi iOS, Anda memerlukan dua langkah utama untuk membuat ekstensi berfungsi:
Buka aplikasi dan atur direktori (untuk menyimpan dan memuat UserScripts)
Set Userscripts Directory
dan pilih DirektoriAktifkan perpanjangan di Safari (dan hibah izin)
AA
di iPhone, extension-icon
di iPad, juga di mana Anda membuka antarmuka popup
ekstensi)Always Allow
Userscript untuk All Websites
Catatan
Aplikasi tidak dapat mendeteksi apakah Anda telah mengaktifkan ekstensi di Safari, oleh karena itu, prompt aplikasi tidak akan berubah setelah Anda mengaktifkan ekstensi. Saat ini antarmuka aplikasi hanya digunakan untuk mengatur atau mengubah direktori Userscripts.
Anda dapat memilih folder iCloud untuk menyinkronkan skrip antara macOS dan iOS, tetapi harap dicatat bahwa mungkin ada penundaan sinkronisasi, dan Anda dapat menemukan file yang diusir karena optimasi iCloud, silakan merujuk ke #424.
Ada dua cara utama untuk menginstal skrip pengguna dari versi iOS:
.user.js
di Safari, lalu buka popup
ekstensi dan Anda akan melihat prompt instalasi.user.js
langsung ke direktori Userscripts yang Anda tetapkan di atas Tip
Kedua pekerjaan di atas sama -sama baik dalam versi MacOS.
Versi iOS tidak termasuk editor skrip yang disediakan dalam versi MacOS, tetapi Anda selalu dapat mengedit file skrip di direktori yang Anda atur langsung di iOS. (Gunakan aplikasi editor kode pihak ketiga mana pun, dukungan dan pengeditan di tempat))
Setelah menginstal UserScripts di MacOS, Anda tidak perlu memilih Direktori Userscripts jika Anda tidak berencana untuk menyinkronkan UserScript Anda di antara beberapa perangkat. Sebaliknya Anda dapat memilih untuk menggunakan direktori default, yang terletak di ~/User/Library/Containers/Userscripts/Data/Documents/scripts
- sekali lagi, ini adalah perilaku default (dan otomatis). Anda hanya perlu memilih lokasi baru jika Anda ingin menyimpan skrip pengguna Anda di tempat lain, yang sangat berguna jika Anda menggunakan editor kode eksternal seperti teks luhur atau vscode.
Lihat Panduan Resmi Apple Halaman: Gunakan ekstensi safari di Mac Anda
Berikut klip pendek yang menunjukkan cara dengan mudah membuat/menambahkan Userscript di Safari menggunakan ekstensi ini di macOS
settings
(diwakili oleh COG) menampilkan modal Pengaturan (dibahas di bawah)plus
memungkinkan pengguna untuk menambahkan item baruNew CSS
adalah "naskah pengguna" yang mengharapkan kode CSSNew Javascript
adalah Userscript Prototipikal yang Mengharapkan Kode JavaScriptNew Remote
memungkinkan pengguna untuk menambahkan UserScript yang dihosting dari jarak jauh (atau gaya) dengan memasukkan alamat web ( mis: https://www.k21p.com/example.user.js
)@version
@updateURL
Discard
- Saat mengedit, mengembalikan perubahan yang belum disimpan yang Anda buat ke UserscriptSave
- Saat mengedit, menyimpan semua perubahan yang telah Anda buat ke UserscriptCommand + S
adalah pintasan keyboard untuk tindakan tersebut() [] {} "" ''
4
karena menggunakan 2
spasi adalah kegilaan absolut@match
yang terpisah koma (Struktur Pola Pencocokan), URL Halaman yang cocok dengan pola dalam daftar ini akan diabaikan untuk injeksi skripUserscripts Safari saat ini mendukung metadata Userscript berikut:
@name
- Ini akan menjadi nama yang ditampilkan di bilah sisi dan digunakan sebagai nama file - Anda tidak dapat menggunakan nama yang sama untuk beberapa file dari jenis yang sama@description
- Gunakan ini untuk menggambarkan apa yang dilakukan UserScript Anda - ini akan ditampilkan di bilah sisi - ada pengaturan untuk menyembunyikan deskripsi@icon
- Ini tidak memiliki fungsi dengan manajer pengguna ini, tetapi nilai pertama yang diberikan dalam metadata akan dapat diakses di objek GM_/GM.info
@match
- Pola Pencocokan Domain - Anda dapat menggunakan beberapa contoh bidang ini jika Anda ingin beberapa kecocokan domain - silakan merujuk ke: Struktur Pola Pencocokanhttp/s
@exclude-match
- Pola Domain di mana Anda tidak ingin skrip untuk dijalankan@include
- Digunakan untuk mencocokkan dengan URL untuk injeksi, Globs dan ekspresi reguler diizinkan, baca lebih lanjut di sini@exclude
- berfungsi dengan cara yang sama seperti @include
tetapi bukannya menyuntikkan, kecocokan dengan nilai kunci ini akan mencegah injeksi@inject-into
- memungkinkan pengguna untuk memilih konteks mana untuk menyuntikkan skripauto
(default), content
, page
GM
hanya tersedia saat menggunakan content
@run-at
@weight
@require
@version
@updateURL
, ini akan memungkinkan pengguna untuk memperbarui skrip pengguna dari sumber jarak jauh, jika versi pada mesin mereka adalah <
versi di URL pembaruan@version
tidak melakukan apa pun dengan sendirinya, itu perlu dipasangkan dengan @updateURL
untuk pembaruan jarak jauh agar berfungsi dengan benar@updateURL
>
Versi pada mesin lokal, file akan diperbarui@updateURL
tidak melakukan apa pun dengan sendirinya, itu perlu dipasangkan dengan @version
untuk pembaruan jarak jauh agar berfungsi dengan benar@downloadURL
@version
dan @updateURL
)@version
dan @updateURL
, jika versi lokal adalah <
versi file yang ditunjuk oleh @updateURL
, ekstensi akan mencoba memperbarui kode file dengan konten file yang terletak di @downloadURL
@downloadURL
tidak melakukan apa pun dengan sendirinya, diperlukan @version
dan @updateURL
untuk hadir agar berfungsi dengan benar@noframes
@grant
APIs
Khusus mana yang digunakan skrip Anda, satu pada setiap baris @grant
, hanya metode API yang akan disediakan.@grant
yang disediakan, none
yang akan diasumsikan.none
dan sesuatu yang lain, none
yang lebih diutamakan. Semua Userscripts membutuhkan setidaknya 1 @match
atau @include
untuk dijalankan!
Userscripts saat ini mendukung metode API berikut. Semua metode tidak sinkron kecuali dinyatakan lain. Pengguna harus @grant
metode ini untuk menggunakannya dalam naskah pengguna. Saat menggunakan metode API, hanya mungkin untuk menyuntikkan ke dalam ruang lingkup skrip konten karena masalah keamanan.
Catatan
Deskripsi API berikut berlaku untuk cabang pengembangan terbaru, Anda mungkin perlu memeriksa dokumentasi untuk versi yang sesuai. Silakan beralih ke versi yang ingin Anda periksa melalui Branches
atau Tags
di bagian atas.
Misalnya, untuk versi V4.xx dari App Store: https://github.com/quoid/userscripts/tree/release/4.xx
Untuk definisi tipe API, silakan merujuk ke: types.d.ts
GM.addStyle(css)
css: String
Promise
, diselesaikan jika berhasil, ditolak dengan pesan kesalahan jika gagalGM.setValue(key, value)
key: String
value: Any
- apapun yang bisa diserialisasi jsonPromise
, diselesaikan jika berhasil, ditolak dengan pesan kesalahan jika gagalGM.getValue(key, defaultValue)
key: String
defaultValue: Any
- opsionalPromise
, diselesaikan dengan value
yang ditetapkan atau defaultValue
yang disediakan atau undefined
jika berhasil, ditolak dengan pesan kesalahan jika gagalGM.deleteValue(key)
key: String
Promise
, diselesaikan jika berhasil, ditolak dengan pesan kesalahan jika gagalGM.listValues()
Promise
, diselesaikan dengan array dari nama -nama kunci yang saat ini menetapkan nilai jika berhasil, ditolak dengan pesan kesalahan jika gagalGM.getTab()
Promise
, diselesaikan dengan data Any
yang persisten selama tab ini terbuka jika berhasil, ditolak dengan pesan kesalahan jika gagalGM.saveTab(tabObj)
tabObj: Any
- apa saja yang bisa diserialisasi jsonPromise
, diselesaikan jika berhasil, ditolak dengan pesan kesalahan jika gagalGM.openInTab(url, openInBackground)
url: String
openInBackground: Bool
- opsional, false
secara defaultPromise
, diselesaikan dengan data tab untuk tab yang baru saja dibuka jika berhasil, ditolak dengan pesan kesalahan jika gagalGM.closeTab(tabId)
tabId: Int
- opsional, caller tab
secara defaultPromise
, diselesaikan jika berhasil, ditolak dengan pesan kesalahan jika gagalGM.setClipboard(data, type)
data: String
type: String
- Opsional, text/plain
secara defaultPromise
, diselesaikan dengan nilai Bool
yang menunjukkan berhasil atau gagal, ditolak dengan pesan kesalahan jika gagalGM.info
&& GM_info
@grant
scriptHandler: String
- Mengembalikan Userscripts
version: String
- Versi Aplikasi UserscriptsscriptMetaStr: String
- Metablock untuk skrip yang sedang berjalan saat iniscript: Object
- Berisi data tentang skrip yang sedang berjalan saat inidescription: 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]
- Saat ini tidak diterapkanrun-at: String
version: String
- Nilai Versi UserscriptGM.xmlHttpRequest(details)
details: Object
details
menerima properti berikuturl: String
- Diperlukanmethod: String
- Opsional, GET
secara defaultuser: String
- Opsionalpassword: String
- Opsionalheaders: Object
- OpsionaloverrideMimeType: String
- Opsionaltimeout: Int
- opsionalbinary: Bool
- Opsional (sudah usang, gunakan objek data biner seperti Blob
, ArrayBuffer
, TypedArray
, dll. Sebaliknya.)data: String | Blob | ArrayBuffer | TypedArray | DataView | FormData | URLSearchParams
- OpsionalresponseType: String
- OpsionalXMLHttpRequests
onabort: Function
- opsionalonerror: Function
- Opsionalonload: Function
- Opsionalonloadend: Function
- Opsionalonloadstart: Function
- Opsionalonprogress: Function
- Opsionalonreadystatechange: Function
- Opsionalontimeout: Function
- OpsionalreadyState
response
responseHeaders
responseType
responseURL
status
statusText
timeout
responseText
(ketika responseType
adalah text
)Promise
kustom berisi abort
properti tambahan, diselesaikan dengan objek respons.const xhr = GM.xmlHttpRequest({...});
xhr.abort();
untuk membatalkan permintaanconst response = await xhr;
const response = await GM.xmlHttpRequest({...});
GM_xmlhttpRequest(details)
GM.xmlHttpRequest(details)
, kecuali:abort
, yang merupakan Function
const foo = GM.xmlHttpRequest({...});
... foo.abort();
untuk membatalkan permintaan Ini adalah direktori tempat aplikasi/ekstensi akan dibaca dan ditulis. Direktori ini diubah dengan membuka aplikasi yang berisi dan mengklik tombol "Ubah lokasi" masing -masing.
Catatan Direktori Script
Jika Anda mengalami masalah saat menggunakan aplikasi/ekstensi ini atau membutuhkan bantuan, buka masalah di sini di repositori. Saat melakukannya, berikan detail sebanyak mungkin. Ini termasuk spesifikasi sistem pencatatan dan situs web dan skrip apa yang Anda coba jalankan. Silakan ikuti templat masalah!
"Menolak untuk menjalankan skrip" kesalahan, apa yang harus saya lakukan!?
Anda melihat kesalahan ini karena kebijakan keamanan konten situs web. Saat ini tidak ada cara untuk memungkinkan skrip konten ekstensi untuk memotong CSP di Safari.
Secara otomatis, ekstensi akan berusaha untuk menghindari CSP yang ketat, tetapi jika Anda masih mengalami masalah, mencoba mengatur Key Metadata Userscript/val
// @inject-into auto
atau// @inject-into content
.Anda dapat membaca lebih lanjut tentang ini dalam masalah ini.
Apakah saya perlu menggunakan editor ekstensi untuk membuat pengguna pengguna baru atau untuk mengedit yang ada?
Anda dapat menggunakan editor Anda sendiri untuk memperbarui dan mengelola file Anda. Selama Anda menyimpan file ke lokasi Simpan, dan mereka diformat dengan benar, mereka harus disuntikkan. Namun, Anda harus membuka popup ekstensi sebelumnya. Itu berarti, jika Anda membuat yang baru atau mengedit skrip pengguna yang ada dengan editor eksternal dan menyimpannya ke lokasi Simpan, sebelum injeksi akan terjadi dengan benar, popup ekstensi harus dibuka dan popup harus memuat sepenuhnya.
Apa saja pintasan keyboard?
Saat menggunakan editor yang disertakan, mengklik
⌘ + s
akan menyimpan file. Saat bekerja editor, mengklik⌘ + f
akan memunculkan bilah pencarian danesc
akan menyembunyikannya.
Ketika saya menggunakan @require
, di mana file yang diperlukan disimpan?
Semua file yang diperlukan disimpan sebagai file JavaScript di folder wadah ekstensi di macOS 11.x. Folder itu terletak di lokasi penyimpanan default, di:
~/Library/Containers/Userscripts/Data/Documents/require/
.Jika Anda memindahkan file dari folder yang memerlukan atau mengedit file
manifest.json
secara manual, Anda kemungkinan akan merusak fungsionalitas aplikasi/ekstensi.
Kontribusi Level Kode Silakan merujuk ke Contributing.md
Selanjutnya, masalah apa pun yang ditandai "bantuan yang diinginkan" secara aktif mencari bantuan. Harap tanggapi masalah -masalah tersebut dengan umpan balik, panduan, atau penawaran bantuan pengkodean.
Berpartisipasi dan berinteraksi dengan Issues
atau Discussions
yang ada akan sangat membantu proyek dan komunitas open source. Terima kasih atas kontribusi Anda.
Cara tercepat dan termudah untuk mendukung proyek adalah dengan meninggalkan ulasan positif di App Store jika Anda menikmati ekstensi dan ingin melihat peningkatan di masa depan. Melihat ulasan ini beri tahu saya bahwa saya melakukan sesuatu yang benar, atau salah, dan memotivasi saya untuk terus mengerjakan proyek.
Cara terbaik kedua untuk membantu adalah mendaftar untuk menguji versi beta versi baru. Karena ekstensi ini menghargai privasi Anda, dan tidak mengumpulkan data dari pengguna , sulit untuk mengukur bagaimana ekstensi digunakan. Dengan mendaftar untuk menjadi penguji beta, tetapi juga tidak hanya memungkinkan Anda untuk menguji fitur yang akan datang, tetapi juga memberi saya kesempatan untuk mendapatkan umpan balik langsung dari pengguna nyata.
Silakan bergabung dan uji versi beta yang sesuai dalam rilis melalui tautan publik TestFlight.
Userscripts tidak mengumpulkan data apa pun dari penggunanya atau memantau aktivitas atau tindakan yang Anda lakukan dalam aplikasi dan ekstensi. Ini berarti semua yang Anda lakukan dengan aplikasi dan ekstensi adalah pribadi untuk Anda dan tidak pernah dibagikan dengan pengembang atau pihak ketiga. Karena tidak ada pengumpulan data, tidak ada retensi data dalam bentuk apa pun.
Hak Cipta (C) 2018-2024 Justin Wasack
Lisensi di bawah Lisensi Lisensi Publik GNU V3.0 untuk semua aplikasi open source. Lisensi komersial diperlukan untuk semua aplikasi lainnya.