Hướng dẫn viết Userscript

Tạo mới Userscript

Userscript luôn chứa một Metadata Block, được đặt ở phần đầu script. Đây là nơi khai báo các thông tin như tên, phiên bản, giới hạn sử dụng…

Định dạng chuẩn của một Metadata Block.

1
2
3
4
5
// ==UserScript==
// @key1 value1
// @key2 value2
// @keyX valueX
// ==/UserScript==

Việc hỗ trợ khóa (key) Metadata cũng khác nhau tùy tiện ích quản lý, nên mình chỉ giới thiệu các khóa phổ biến, dựa trên Greasemonkey, và một số khóa quan trọng trong các tiện ích quản lý thông dụng.

Mục lục

Các khóa Metadata

@name

Tên của Userscript, bạn nên sử dụng tiếng Anh hoặc viết không dấu, và không ký tự đặc biệt, vì nó cũng được dùng làm tên tệp. Ví dụ:

1
// @name JS CSS beautify

@namespace

Tên bổ sung, nó được kết hợp với @name để tạo thành cặp khóa định danh cho Userscript đó, nếu bạn tạo ra một Userscript mới mà cặp khóa này trùng nhau, tiện ích quản lý sẽ xem nó như một bản cập nhật và thay thế nó. Vì @namespace không có nghĩa nên tác giả thường dùng để đăng URL website, một số tiện ích quản lý cũng dùng khóa này để xác định Trang chủ của script. Ví dụ:

1
// @namespace http://baivong.github.io/

@description

Giới thiệu thông tin sơ lược. Ví dụ:

1
// @description Beautify and syntax highlighting for source code javascript, json, css.

@version

Phiên bản hiện tại. Giá trị này được tiện ích quản lý sử dụng để cập nhật Userscript. Xem thêm quy chuẩn Semantic Versioning để hiểu cách viết phiên bản. Ví dụ:

1
// @version 2.3.2

@icon

URL icon, ảnh đại diện cho Userscript. Ví dụ:

1
// @icon http://i39.servimg.com/u/f39/18/83/32/63/usersc10.png

@author

Tên tác giả. Ví dụ:

1
// @author Zzbaivong

@license

Tên hoặc URL đến giấy phép sử dụng script. Truy cập Choose a License để biết thêm thông tin và cách lựa chọn. Ví dụ:

1
// @license MIT

@include

Giới hạn địa chỉ trang web mà script sẽ chạy, có thể dùng biểu thức chính quy (Regular Expressions). Có thể dùng nhiều lần. Ví dụ:

1
2
// @include /^https?://*/*.js$/
// @include /^https?://*/*.css$/

@match

Chức năng tương tự @include nhưng được đặt quy tắc nghiêm ngặt hơn trong cách sử dụng dấu *, không được dùng biểu thức chính quy. Xem chi tiết về Match Patterns. Ví dụ:

1
2
3
4
// @match http://*/*.js
// @match https://*/*.js
// @match http://*/*.css
// @match https://*/*.css

@exclude

Cách dùng tương tự @include nhưng có vai trò ngược lại, nó loại trừ địa chỉ trang web mà script sẽ chạy. Ví dụ:

1
2
// @exclude /^https?://*/*.json$/
// @exclude /^https?://*/*.less$/

@downloadURL

URL để cập nhật Userscript. Nếu không đặt giá trị cho khóa này, tiện ích quản lý sẽ dùng URL lúc bạn tải về để làm URL cập nhật. Ví dụ:

1
// @downloadURL https://greasyfork.org/scripts/16111-javascript-css-beautify/code/Javascript-css%20beautify.user.js

@updateURL

URL để kiểm tra thông tin cập nhật, có đuôi .meta.js, thông thường chỉ chứa Metadata Block. Nếu thông tin @version trong này mới hơn thì tiện ích quản lý sẽ tiến hành cập nhật Userscript. Ví dụ:

1
// @updateURL https://greasyfork.org/scripts/16111-javascript-css-beautify/code/Javascript-css%20beautify.meta.js

@supportURL

URL dẫn đến trang hỗ trợ, báo lỗi. Ví dụ:

1
// @supportURL https://github.com/baivong/Userscript/issues

@require

URL của thư viện javascript cần sử dụng, có thể dùng nhiều lần. Ví dụ:

1
2
3
// @require https://openuserjs.org/src/libs/baivong/beautify-js.min.js
// @require https://openuserjs.org/src/libs/baivong/beautify-css.min.js
// @require https://openuserjs.org/src/libs/baivong/highlight-css-js.min.js

@resource

Bổ sung thêm tài nguyên để sử dụng, có thể dùng nhiều lần. Bạn có thể truy cập thông qua API GM_getResourceText hoặc GM_getResourceURL. Ví dụ:

1
// @resource devsLogo http://i56.servimg.com/u/f56/18/59/49/93/lg110.png

@run-at

Thời điểm chạy Userscript so với trang web. Bao gồm 3 giá trị document-start, document-enddocument-idle. Ví dụ:

1
// @run-at document-idle

@noframes

Ngăn không cho Userscript chạy trong thẻ nhúng như iframe. Nó không có đối số, chỉ là dùng hoặc không dùng. Nên sử dụng khóa này để tránh lỗi hiệu suất, nhất là với các trang có quảng cáo nhúng. Ví dụ:

1
// @noframes

@grant

Yêu cầu cấp quyền sử dụng API đặc biệt với tiện ích quản lý, không có nó, tiện ích quản lý có thể đưa ra thông tin sai, gây lỗi. Nếu bạn không yêu cầu quyền API đặc biệt hãy đặt giá trị none. Ví dụ:

1
2
// @grant GM_addStyle
// @grant GM_getResourceText

@connect

Đây là khóa bổ sung khi yêu cầu API GM_xmlhttpRequest, nó xác định tên miền chứa dữ liệu cần lấy, có thể dùng nhiều lần. Bao gồm các giá trị: domain (cũng sẽ bao gồm toàn bộ sub-domain), sub-domain, IP address, localhost, self (trang mà script đang chạy), * (tất cả). Ví dụ:

1
2
// @connect baivong.github.io
// @connect localhost

Chú ý

Một Metadata Block tối thiểu phải có 3 khóa @name, @namespace, @grant (có tiện ích quản lý yêu cầu thêm @match, @id).
Tài nguyên từ @require@resource chỉ được tải về một lần vào máy người dùng và sử dụng, đến khi có bản cập nhật thì nó mới tải lại.

Sau khi tạo Metadata Block, bạn đã có thể bắt đầu viết code cho nó bằng javascript ở bên dưới, sử dụng thêm API nếu cần thiết. Tuy nhiên, mức độ hỗ trợ API của mỗi tiện ích quản lý đều có vài điểm khác biệt, trong bài này mình chỉ hướng dẫn cách tạo Userscript cơ bản với javascript. Nếu bạn muốn viết nâng cao hơn thì nên tìm xem các tài liệu API của tiện ích quản lý mà bạn sử dụng. Ví dụ:

1
2
3
4
5
6
7
// ==UserScript==
// @name reverse
// @namespace Zzbaivong
// @grant none
// ==/UserScript==
document.body.style.transform = "rotate(180deg)";

Bạn có thể cài trực tiếp Userscript vào trình duyệt nhân Chromium, tuy nhiên nó chỉ cho phép các khóa @name, @namespace, @description, @version, @match, @include, @exclude và một số API (không bắt buộc dùng @grant) GM_log, GM_openInTab, GM_addStyle, GM_xmlhttpRequest (chỉ trong cùng nguồn, tương đương @connect self). Ví dụ:

1
2
3
4
5
// ==UserScript==
// @match http://github.com/*
// ==/UserScript==
GM_openInTab("https://github.com/baivong/Userscript");
Chia sẻ