Skip to content

Các hàm dựng sẵn

Chú ý

Hầu hết các hàm dựng sẵn đều là các async function hoặc function trả về kết quả là một Promise, vì vậy việc đặt script của bạn trong một async function là cần thiết. Đa số các hàm bắt buộc có từ khóa await ở trước!

(async function(){
    /*Code của bạn ở đây*/
})();

Các hàm tiện ích#

Log#

Hiện thông tin lên vùng LOG của Studio hoặc trên cột Status của profile đang chạy script.

Cú pháp
await Log(message1, message2, message3, ...);
Ví dụ
(async function(){
    Log("Hello Bip Profile");
    Log("Hello", [1,2,3], {"Bip": "Profile"});

    // Nếu bạn là người thích làm màu thì có thể sử dụng các hàm log mở rộng
    // LogSuccess
    // LogInfo
    // LogWarn
    // LogError
})();

Exit#

Đóng trình duyệt ngay lập tức.

Cú pháp
Exit ();

Delay#

Delay một khoảng tính bằng mili giây.

Cú pháp
await Delay(ms1, ms2);
Chi tiết
Tham số Mô tả
ms1 Thời gian delay tính bằng mili giây
ms2 Nếu ms2 được chỉ định, hàm này sẽ delay một khoảng ngẫu nhiên giữa ms1ms2
Ví dụ
1
2
3
4
5
6
(async function(){
    Log("Khoan! Dừng khoảng chừng 2 giây!");
    await Delay(2000);
    Log("Chia sẻ cái tool này cho Bịp đi các ngài ++!");
    // await Delay(6000, 9000);//delay random 6-9s
})();

RandomInt#

Tạo một số nguyên ngẫu nhiên.

Cú pháp
RandomInt (min, max);
Chi tiết
Tham số Mô tả
min Số đầu khoảng
max Số cuối khoảng
Ví dụ
1
2
3
4
(async function(){
    Log(RandomInt(0, 9));
    //chú ý: kết quả có thể là cả 0 hoặc 9 chữ k phải chỉ 1 -> 8
})();

RandomArray#

Lấy ngẫu nhiên một phần tử trong một mảng.

Cú pháp
RandomArray (array);
Các tham số
Tham số Mô tả
array Mảng cần lấy ngẫu nhiên

Ví dụ

1
2
3
4
5
(async function(){
    // const r = RandomArray(["a", "b", "c"]);
    const r = RandomArray([1,2,3,4]);
    Log(r)
})()

Base64Encode#

Mã hóa base64.

Cú pháp
Base64Encode (input);
Chi tiết
Tham số Mô tả
input Dữ liệu đầu vào
Ví dụ
1
2
3
(async function(){
    Log(Base64Encode("Bịp Profile"));
})();

Base64Decode#

Giải mã base64.

Cú pháp
Base64Decode (input);
Chi tiết
Tham số Mô tả
input Dữ liệu đầu vào
Ví dụ
1
2
3
(async function(){
    Log(Base64Decode("QuG7i3AgUHJvZmlsZQ=="));
})();

GenerateXpath#

Tạo xpath. Có thể kết hợp với các hàm ClickByXpath, SetByXpath hoặc bất cứ thứ gì liên quan đến xpath.

Cú pháp
GenerateXpath (tag, attr, value, index);
Chi tiết
Tham số Mô tả
tag Tag name của phần tử.
attr Thuộc tính của phần tử.
value Giá trị của attr.
index Vị trí phần tử.
Ví dụ
//Nhắm vào một link có thuộc tính href = "http://google.com"
GenerateXpath("a", "href", "http://google.com");

//Nhắm vào một link có thuộc tính href bắt đầu với "http://google"
GenerateXpath("a", "href", "http://google%");

//Nhắm vào một link có thuộc tính href kết thúc với "google.com"
GenerateXpath("a", "href", "%google.com");

//Nhắm vào một link có thuộc tính href chứa cụm từ "google"
GenerateXpath("a", "href", "%google%");

HttpRequest#

Thực thi một HTTP request.

Cú pháp
await HttpRequest(url, data, timeout, headers);
Chi tiết
Tham số Mô tả
url Target url
data Dữ liệu để gửi đi bằng method POST (tùy chọn)
timeout Thời gian tối đa đợi request, quá thời gian sẽ báo lỗi timed out, nhập 0 để đợi mãi hoặc đến khi lỗi
headers Thêm extra header vào request (tùy chọn)

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{
    "status": 200, //http response code
    "headers": "raw response header",
    "body": "response body",
    "error": "", //lỗi trong trường hợp phát sinh
}
Ví dụ
(async function(){
    const res = await HttpRequest("http://icanhazip.com");
    Log(res);
    /*{
        "status": 200,
        "headers": "access-control-allow-methods: GET\r\naccess-control-allow-origin: *\r\nalt-svc: h3=\":443\"; ma=86400\r\ncf-ray: 8b528debe896855c-HKG\r\ncontent-length: 39\r\ncontent-type: text/plain\r\ndate: Sun, 18 Aug 2024 14:22:09 GMT\r\nserver: cloudflare\r\nvary: Accept-Encoding\r\n",
        "body": "12.34.56.78\n"
    }
    */

    //post data thông thường (application/x-www-form-urlencoded)
    const res = await HttpRequest("https://httpbin.org/anything", {
        "username": "bip",
        "password": "abc123",
    });

    //post json hoặc raw data (truyền tham số data là string thay vì object)
    const res = await HttpRequest("https://httpbin.org/anything", JSON.stringify({
        "username": "bip",
        "password": "abc123",
    }), 0) ;
})();

GetScriptInputs#

Lấy dữ liệu đầu vào của người dùng theo yêu cầu, nếu script của bạn được chia sẻ trên market script, bạn có thể yêu cầu người dùng nhập vào một số dữ liệu khi đăng tải script của bạn.

Cú pháp
GetScriptInputs();
Ví dụ
1
2
3
4
5
(async function(){
    // Giả sử bạn yêu cầu người dùng nhập input có một trường là file
    const input = GetScriptInputs();
    Log(input.file);
})();

GetAppVersion#

Lấy phiên bản ứng dụng đang chạy của Bịp Profile.

Cú pháp
GetAppVersion();

GetProfileInfo#

Lấy thông tin của profile đang chạy.

Cú pháp
GetProfileInfo();
Ví dụ
1
2
3
4
(async function(){
    const profile = GetProfileInfo();
    Log(profile);
})();

GetWindowSize#

Lấy kích thước cửa sổ trình duyệt.

Cú pháp
await GetWindowSize();
Ví dụ
1
2
3
4
5
(async function(){
    const size = await GetWindowSize();
    Log(size);
    //{"width":1366,"height":736}
})();

GetBrowserSize#

Lấy kích thước phần hiển thị nội dung (content) của trang web.

Cú pháp
await GetBrowserSize();
Ví dụ
1
2
3
4
5
(async function(){
    const size = await GetBrowserSize();
    Log(size);
    //{"width":1350,"height":640}
})();

GetUrl#

Lấy URL hiện tại.

Cú pháp
await GetUrl();
Ví dụ
1
2
3
4
5
(async function(){
    const url = await GetUrl();
    Log(url);
    //https://google.com/
})();

GetHtml#

Lấy mã HTML của trang web đang hiển thị.

Cú pháp
await GetHtml();
Ví dụ
1
2
3
4
(async function(){
    const html = await GetHtml();
    Log("Mã html có độ dài", html.length);
})();

TabCount#

Trả về số lượng tab / popup đang mở.

Cú pháp
await TabCount();
Ví dụ
1
2
3
4
(async function(){
    const tabs = await TabCount();
    Log(tabs);
})();

GetUserAgent#

Lấy user agent hiện tại.

Cú pháp
GetUserAgent();
Ví dụ
1
2
3
4
(async function(){
    const ua = GetUserAgent();
    Log(ua);
})();

IsMobile#

Trả về kết browser đang chạy chế độ mobile hay desktop.

Cú pháp
IsMobile()
Ví dụ
1
2
3
4
(async function(){
    const isMobile = IsMobile();
    Log(isMobile);
})();

IsHideBrowser#

Trả về kết browser đang chạy chế độ ẩn hay hiện.

Cú pháp
IsHideBrowser()
Ví dụ
1
2
3
4
(async function(){
    const hide = IsHideBrowser();
    Log(hide);
})();

IsLoading#

Trả về kết browser hãy còn đang tải trang web hay không.

Cú pháp
await IsLoading()
Ví dụ
1
2
3
4
(async function(){
    const loading = await IsLoading();
    Log(loading);
})();

WaitForLoading#

Đợi trang web cho đến khi tải xong

Cú pháp
await WaitForLoading(timeout)
Chi tiết
Tham số Mô tả
timeout Thời gian đợi tối đa tính bằng giây, quá thời gian sẽ bỏ qua không đợi nữa, bỏ qua tham số này để đợi đến khi xong
Ví dụ
1
2
3
4
5
6
(async function(){
    Log("Bắt đầu tải google");
    await Navigate("https://google.com");
    const loaded = await WaitForLoading(30);
    Log(loaded ? "Đã tải xong" : "Hãy còn đang tải tiếp");
})();

WaitForElmtBySelector#

Đợi một phần từ trên trang web thỏa mãn điều kiện chỉ định. Ví dụ trước khi tương tác như click một nút bấm, gõ văn bản trên một ô text, bạn có thể sử dụng hàm này để đảm bảo mục tiêu đã xuất hiện.

Cú pháp
await WaitForElmtBySelector(selector, state, timeout = 60, frameSearch="", frameSearchType="")
Chi tiết
Tham số Mô tả
selector Một CSS selector.
state Trạng thái cần đợi, xem ví dụ minh họa.
timeout Thời gian chờ tối đa, mặc định 60 giây.
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector

Kết quả trả về

true nếu state thỏa mãn, false nếu có lỗi hoặc hết timeout.

Ví dụ
(async function(){
    //chờ ô text có name = q xuất hiện
    await WaitForElmtBySelector('textarea[name="q"]', {exists: true});

    //chờ phần tử div có id là countdown biết mất.
    await WaitForElmtBySelector('div#countdown', {exists: false});

    //chờ một button có id là skip xuất hiện thuộc tính disabled (tương tự với trường hợp chờ cho thuộc tính biết mất)
    await WaitForElmtBySelector('button#skip', {attr: "disabled", exists: true});

    //chờ một thẻ span với id là test có thuộc tính desc = hello-bipprofile
    await WaitForElmtBySelector('span#test', {attr: "desc", equals: "hello-bipprofile"});

    //chờ một thẻ span với id là test có thuộc tính desc có chứa lo-bip
    await WaitForElmtBySelector('span#test', {attr: "desc", contains: "lo-bip"});

    //chờ một thẻ span với id là test có thuộc tính desc bắt đầu với hello
    await WaitForElmtBySelector('span#test', {attr: "desc", startsWith: "hello"});

    //chờ một thẻ span với id là test có thuộc tính desc kết thúc với bipprofile
    await WaitForElmtBySelector('span#test', {attr: "desc", endsWith: "bipprofile"});
})();

WaitForElmtByXpath#

Hàm này giống hệt WaitForElmtBySelector nhưng thay selector bằng xpath

ImapFetch#

Đọc mail bằng IMAP (được xây dựng trên thư viện ImapFlow). Bạn cần đảm bảo tài khoản email đã được bật IMAP!

Cú pháp
await ImapFetch(user, pass, option)
Chi tiết
Tham số Mô tả
user Username bao gồm cả @xxx.xx (VD: [email protected])
pass Mật khẩu đăng nhập imap
option.server Tùy chọn imap server, với gmail, hotmail và yahoo hàm có thể tự nhận diện, còn lại bạn phải chỉ định rõ.
option.proxy Đặt proxy (proxy cần có chất lượng tốt để không bị chặn)
option.search Xem chi tiết tại đây.
option.mailbox Chỉ định hòm thư sẽ tìm, mặc định là INBOX
option.markAsRead Tự động đánh dấu các thư tìm thấy là đã đọc

Kết quả trả về

Thông tin mail đầu tiên, mới nhất khớp yêu cầu tìm kiếm, có dạng như sau:

{
    "uid": 1411,
    "from": {
        "address": "[email protected]",
        "name": "Bịp Automation"
    },
    "to": {
        "address": "[email protected]",
        "name": ""
    },
    "date": "2024-09-07T05:14:16.000Z",
    "html": "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"><div dir=\"ltr\">test</div>\n",
    "text": "test\n"
}

Ví dụ
(async function(){
    //Tìm email mới nhất trong hòm thư INBOX
    const mail1 = await ImapFetch("[email protected]", "123456"); // Log(mail1)

    //Tìm email mới nhất trong hòm thư INBOX mà trạng thái là chưa đọc và được gửi trong vòng 1 giờ đổ lại đây.
    //Đồng thời đánh dấu thành đã đọc
    const mail2 = await ImapFetch("[email protected]", "123456", {
        search: {
            seen: false,
            since: new Date(Date.now()-3600000) //hiện tại trừ đi 3600000 miliseconds (~3600s = 1h)
        },
        markAsRead: true
    }); // Log(mail2)

    //Tìm email mới nhất mà địa chỉ email người gửi có chứa [email protected]
    const mail3 = await ImapFetch("[email protected]", "123456", {
        search: {
            from: "[email protected]"
        }
    }); // Log(mail3)

    //Tìm email mới nhất mà nội dung có chứa "Your OTP is"
    const mail4 = await ImapFetch("[email protected]", "123456", {
        search: {
            body: "Your OTP is"
        }
    }); // Log(mail4)


    //Tìm email mới nhất trong hòm thư SPAM của một server mail khác
    const mail5 = await ImapFetch("[email protected]", "123456", {
        mailbox: 'Junk', //tìm trong mục SPAM
        search: "*",
        server: {
            host: "imap.bipprofile.com",
            port: 993,
            secure: true,
        }
    }); // Log(mail5)
})();

Típ

Các loại mail gmail, yahoo, hotmail (outlook) có thể được tự động nhận diện IMAP server, các loại mail khác bạn cần chỉ định server.

Bạn có thể kết hợp nhiều điều kiện tìm kiếm cùng nhau, sao cho nhắm đúng mail cần tìm nhất, tránh việc phổ tìm quá rộng khiến hàm chạy chậm do phải tải quá nhiều mail. Các trường dữ liệu có thể sử dụng để tìm kiếm được mô tả chi tiết tại đây.

Nếu bạn không chắc máy chủ imap của mình có những nhãn hòm thư nào, hãy dùng hàm ImapGetMailboxes bên dưới!

ImapGetMailboxes#

Lấy danh sách mailbox khả dụng.

Cú pháp
await ImapGetMailboxes(user, pass, server)
Chi tiết
Tham số Mô tả
user Username bao gồm cả @xxx.xx (VD: [email protected])
pass Mật khẩu đăng nhập imap
server Tùy chọn imap server, với gmail, hotmail và yahoo hàm có thể tự nhận diện, còn lại bạn phải chỉ định rõ.

Kết quả trả về

Danh sách các nhãn hòm thư dạng mảng như ví dụ minh họa dưới đây:

["INBOX","Sent","Drafts","Junk","Deleted","Lưu trữ","Notes","Outbox"]

Ví dụ
1
2
3
4
(async function(){
    const boxes = await ImapGetMailboxes("[email protected]", "123456");
    Log(boxes);
})();

OpenAIGenText#

Tạo văn bản bằng Open AI.

Cú pháp
await OpenAIGenText(apiKey, prompt, model)
Chi tiết
Tham số Mô tả
apiKey OpenAI API Key của bạn
prompt Nội dung yêu cầu
model Chỉ định model, mặc định là gpt-4o-mini
Ví dụ
(async function(){
    const res = await OpenAIGenText("THAY_OPENAI_API_KEY_CUA_BAN_VAO_DAY", "Tiểu sử Nguyễn Ái Quốc");
    if(res.error) LogError(res);
    else Log(res.content)
    /*{
        "content": "Nguyễn Ái Quốc, tên thật là Nguyễn Sinh Cung, sinh ngày 19 tháng 5 năm 1890 tại làng Hoàng Trù, huyện Nam Đàn, tỉnh Nghệ An, Việt Nam. Ông là một nhân vật lịch sử quan trọng trong cuộc đấu tranh giành độc lập cho Việt Nam và là người sáng lập Đảng Cộng sản Việt Nam.
        Nguyễn Ái Quốc đã rời quê hương từ sớm để tìm kiếm một con đường giải phóng dân tộc. Ông đã sống và hoạt động ở nhiều nước khác nhau, bao gồm Pháp, Trung Quốc và Liên Xô. Trong thời gian ở Pháp, ông đã tham gia vào các phong trào cách mạng và viết nhiều bài báo, tài liệu kêu gọi độc lập cho Việt Nam.
        Năm 1930, ông đóng vai trò quan trọng trong việc thành lập Đảng Cộng sản Việt Nam, đánh dấu sự chuyển mình cho phong trào cách mạng Việt Nam. Ông cũng là người đại diện cho Việt Nam tại Hội nghị Bonn và thành lập Mặt trận Việt Minh vào năm 1941.
        Nguyễn Ái Quốc đã lãnh đạo cuộc Tổng khởi nghĩa tháng Tám năm 1945, dẫn đến việc thành lập nước Việt Nam Dân chủ Cộng hoà vào ngày 2 tháng 9 năm 1945, và ông trở thành Chủ tịch đầu tiên của nước này. Dưới sự lãnh đạo của ông, Việt Nam đã trải qua nhiều thử thách, bao gồm cuộc chiến tranh chống thực dân Pháp và chiến tranh đế quốc Mỹ khốn nạn.
        Ông mất ngày 2 tháng 9 năm 1969, để lại một di sản vĩ đại đối với đất nước và dân tộc Việt Nam. Tên gọi Nguyễn Ái Quốc không chỉ là một cái tên, mà còn là biểu tượng cho tinh thần đấu tranh, lòng yêu nước và sự hy sinh vì sự nghiệp giải phóng dân tộc."
    }
    */
})();

OpenAIGenImage#

Tạo ảnh bằng Open AI với model dall-e-3.

Cú pháp
await OpenAIGenImage(apiKey, prompt, type, size, quality, style)
Chi tiết
Tham số Mô tả
apiKey OpenAI API Key của bạn
prompt Nội dung mô tả về hình ảnh bạn muốn tạo
type Kiểu dữ liệu trả về, url hoặc b64_json, mặc định là url, lưu ý khi bạn chọn là url thì url của ảnh chỉ tồn tại trong vòng 60 phút!
size Kích thước ảnh, rộng x cao, chỉ sử dụng một trong các giá trị sau: 1024x1024, 1024x1792, 1792x1024, mặc định là 1024x1024
quality Chất lượng ảnh, standard hoặc hd, mặc định là standard
style Style ảnh, vivid hoặc natural, mặc định là vivid
Ví dụ
(async function(){
    const res = await OpenAIGenImage("THAY_OPENAI_API_KEY_CUA_BAN_VAO_DAY", "cute Doraemon");
    if(res.error) LogError(res);
    else Log(res)

    /* Kết quả minh họa
    {
        "created": 1725805782,
        "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-q3XdZ77JOR7...",
        "revised_prompt": "An adorable, round..."
    }

    //await OpenAIGenImage("THAY_OPENAI_API_KEY_CUA_BAN_VAO_DAY", "cute Doraemon", "b64_json");
    {
        "created": 1725805782,
        "b64_json": "iVBOR...",
        "revised_prompt": "An adorable, round..."
    }

    //Trường hợp có lỗi xảy ra
    {
        "error": {
            "code": "content_policy_violation",
            "message": "Your request was rejected as a result of our safety system. Your prompt may contain text that is not allowed by our safety system.",
            "param": null,
            "type": "invalid_request_error"
        }
    }
    */
})();

CallOpenAIApi#

Gửi request đến OpenAI API server. Bạn có thể thực thi bất cứ API nào theo tài liệu của OpenAI. Về cơ bản OpenAIGenTextOpenAIGenImage đều được xây dựng dựa trên hàm này.

Cú pháp
await CallOpenAIApi(apiKey, path, params)
Chi tiết
Tham số Mô tả
apiKey OpenAI API Key của bạn
path Đường dẫn đến hàm API
params Các tham số theo yêu cầu dạng JSON
Ví dụ
(async function(){
    const text = await CallOpenAIApi("THAY_OPENAI_API_KEY_CUA_BAN_VAO_DAY", "/chat/completions", {
        model: "gpt-4o-mini",
        messages: [
            {
                role: "user",
                content: "Tiểu sử Nguyễn Ái Quốc"
            }
        ]
    });

    const image = await CallOpenAIApi("THAY_OPENAI_API_KEY_CUA_BAN_VAO_DAY", "/images/generations", {
        model: "dall-e-3",
        n: 1,
        prompt: "cute Doraemon",
        size: "1024x1024"
    });
})();

CatchRequestHeaders#

Bắt header của một request được gửi đi.

Cú pháp
await CatchRequestHeaders(filter, timeout)
Chi tiết
Tham số Mô tả
filter Bộ lọc request, xem ví dụ minh họa
timeout Thời gian tối đa chờ, mặc định là 60s
Ví dụ
(async function(){
    const headers = await CatchRequestHeaders({
        urls: ["https://bipprofile.io/api/test"],
        types: ["xmlhttprequest"]
    });

    Log(headers); //{header1: value1, header2: value2, ...}

    /*
    urls có thể là 1 hoặc nhiều url.
    types có thể là một hoặc nhiều type với các giá trị sau:
        "main_frame"
        "sub_frame"
        "stylesheet"
        "script"
        "image"
        "font"
        "object"
        "xmlhttprequest"
        "ping"
        "csp_report"
        "media"
        "websocket"
        "webbundle"
        "other"
    */
})();

Tương tác bàn phím#

SendKeyPress#

Giả lập sự kiện keypress.

Cú pháp
await SendKeyPress (keyCode, modifiers)
Chi tiết
Tham số Mô tả
keyCode Key Code
modifiers Các giá trị hợp lệ: WITH_ALT, WITH_CTRL, WITH_COMMAND, WITH_SHIFT
Ví dụ
1
2
3
4
5
(async function(){
    await SendKeyPress (K_KEYA); //press A
    await SendKeyPress (K_KEYV, WITH_CTRL); //press Ctrl + V
    await SendKeyPress (K_KEYV, WITH_CTRL | WITH_SHIFT); //press Ctrl + Shift + V
})();

SendKeyDown#

Giả lập sự kiện keydown.

Cú pháp
await SendKeyDown (keyCode, modifiers)
Chi tiết
Tham số Mô tả
keyCode Key Code
modifiers Các giá trị hợp lệ: WITH_ALT, WITH_CTRL, WITH_COMMAND, WITH_SHIFT
Ví dụ
1
2
3
(async function(){
    await SendKeyDown (K_KEYA); //keydown A
})();

SendKeyUp#

Giả lập sự kiện keyup.

Cú pháp
await SendKeyUp (keyCode, modifiers)
Chi tiết
Tham số Mô tả
keyCode Key Code
modifiers Các giá trị hợp lệ: WITH_ALT, WITH_CTRL, WITH_COMMAND, WITH_SHIFT
Ví dụ
1
2
3
(async function(){
    await SendKeyUp (K_KEYA); //keydown A
})();

SendKeyChar#

Giả lập sự kiện keychar.

Cú pháp
await SendKeyChar (keyCode)
Chi tiết
Tham số Mô tả
keyCode Key Code
Ví dụ
1
2
3
4
(async function(){
    await SendKeyChar (K_KEYA);
    await SendKeyChar ("a");
})();

Typing#

Giả lập gõ văn bản.

Cú pháp
await Typing (text[, speed1, speed2])
Chi tiết
Tham số Mô tả
text Văn bản cần gõ.
speed1 - speed2 Khoảng thời gian delay giữa các lần gõ để trông giống người (in miliseconds).
Ví dụ
1
2
3
4
5
6
7
(async function(){
    //Gõ nhanh
    await Typing ("Xin chào Bịp Profile");

    //Gõ chậm như người
    await Typing ("Xin chào Bịp Profile", 300, 500);
})();

Tương tác chuột#

Tất cả các hàm click dưới đây đều giả lập một đường di chuột di chuyển (mousemove) đến mục tiêu trước khi thực hiện click!

ClickByCoordinates#

Click vào một tọa độ chỉ định trên trang web.

Cú pháp
await ClickByCoordinates (x1, y1, x2, y2, nClick=1)
Chi tiết
Tham số Mô tả
x1 Tọa độ x góc trái trên
y1 Tọa độ y góc trái trên
x2 Tọa độ x góc phải dưới
y2 Tọa độ y góc phải dưới
nClick Số lượt click, mặc định là 1

Coordinates

Ví dụ
1
2
3
4
(async function(){
    await ClickByCoordinates(100, 100, 200, 200);
    await ClickByCoordinates(100, 100, 200, 200, 2);//double click
})();
Tip

Bạn có thể dễ dàng tạo lệnh này bằng cách sử dụng May Extension!

ClickBySelector#

Click và một phần tử trên trang web theo CSS selector.

Cú pháp
await ClickBySelector (selector, index=0, nClick = 1, frameSearch="", frameSearchType="")
Chi tiết
Tham số Mô tả
selector Một CSS selector.
index Thứ tự phần tử sẽ sử dụng nếu css selector khớp nhiều hơn một phần tử. 0 là phần tử đầu tiên, hoặc nhập random để chọn ngẫu nhiên một phần tử.
nClick Số click, mặc định là 1
frameSearch Nếu phần tử nằm trong một thẻ iframe, bạn cần xác định frame đó dựa thuộc tính src hoặc một đường dẫn đến frame đó.
frameSearchType Kiểu xác định frame, gồm có các giá trị: "src-starts", "src-ends", "src-equals", "src-contains", "src-regex", "frame-path", mặc định là "src-contains".
Ví dụ
(async function(){
    //click vào một liên kết có chứa bipprofile.io
    await ClickBySelector("a[href*='bipprofile.io']");

    //click vào một button với id là submit, bên trong một iframe có thuộc tính src bắt đầu với https://bipprofile.io
    await ClickBySelector("button#submit", 0, 1, "https://bipprofile.io", "src-starts");

    //click vào một button với id là submit, bên trong một iframe có thuộc tính src chính xác bằng https://bipprofile.io/contact.html
    await ClickBySelector("button#submit", 0, 1, "https://bipprofile.io/contact.html", "src-equals");

    //click vào một button với id là submit, bên trong một iframe có thuộc tính src kết thúc bằng /contact.html
    await ClickBySelector("button#submit", 0, 1, "/contact.html", "src-ends");

    //click vào một button với id là submit, bên trong một iframe có thuộc tính src có chứa bipprofile.io
    await ClickBySelector("button#submit", 0, 1, "bipprofile.io", "src-contains");

    //click vào một button với id là submit, bên trong một iframe có thuộc tính src khớp regex bip[a-z]+\.io
    await ClickBySelector("button#submit", 0, 1, "bip[a-z]+\.io", "src-regex");

    //click vào một button với id là submit, bên trong iframe đầu tiên trong site
    await ClickBySelector("button#submit", 0, 1, "0", "frame-path");

    //click vào một button với id là submit, bên trong iframe thứ 2 của iframe đầu tiên trong site
    await ClickBySelector("button#submit", 0, 1, "0>1", "frame-path");
})();
Tip

Bạn có thể dễ dàng tạo lệnh này bằng cách sử dụng May Extension!

ClickById#

Click vào một phần tử theo ID.

Cú pháp
await ClickById (id, nClick=1, frameSearch="", frameSearchType="")
Chi tiết
Tham số Mô tả
id ID của phần tử.
nClick Xem ClickBySelector
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
Ví dụ
1
2
3
4
5
6
(async function(){
    await ClickById("load-more-button");

    //same with
    //await ClickBySelector("#load-more-button");
})();

ClickByTag#

Click vào một phần tử theo tag.

Cú pháp
await ClickByTag (tag, index, nClick=1, frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
tag Tên tag của phần tử.
index Xem ClickBySelector
nClick Xem ClickBySelector
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
Ví dụ
1
2
3
4
5
(async function(){
    await ClickByTag("iframe");     //click thẻ iframe đầu tiên
    await ClickByTag("iframe", 1);  //click thẻ iframe thứ 2
    await ClickByTag("div", "random", 2);  //double click ngẫu nhiên một thẻ div
})();

ClickByClass#

Click vào một phần tử theo class.

Cú pháp
await ClickByClass (class, index, nClick=1, frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
class Tên class của phần tử.
index Xem ClickBySelector
nClick Xem ClickBySelector
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
Ví dụ
1
2
3
4
5
(async function(){
    await ClickByClass("skip-button");  //click phần tử đầu tiên có class là "skip-button"
    await ClickByClass("skip-button", 1); //click phần tử thứ 2 có class là "skip-button"
    await ClickByClass("skip-button", "random"); //click ngẫu nhiên một phần tử có class là "skip-button"
})();

ClickByXpath#

Click vào một phần tử theo xpath.

Cú pháp
await ClickByXpath (xpath, nClick=1, frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
xpath xpath của phần tử, bạn có thể dùng công cụ devtool của chrome hoặc sử dụng hàm GenerateXpath để lấy xpath.
nClick Xem ClickBySelector
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
Ví dụ
1
2
3
4
(async function(){
    await ClickByXpath("/html/body/div/div[1]/div/ul/li[6]/a/div[1]/span");
    await ClickByXpath(GenerateXpath("a", "href", "https://bipprofile.io%"));
})();

Click ngẫu nhiên một liên kết trên site.

Cú pháp
await ClickRandomLink (frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
Ví dụ
1
2
3
4
5
6
(async function(){
    await ClickRandomLink();
    //same with
    //await ClickByTag("a", "random");
    //await ClickBySelector("a", "random");
})();

Click ngẫu nhiên một internal link trên site.

Cú pháp
await ClickRandomInternalLink (frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
Ví dụ
1
2
3
(async function(){
    await ClickRandomInternalLink();
})();

Click ngẫu nhiên một external link trên site.

Cú pháp
await ClickRandomExternalLink (frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
Ví dụ
1
2
3
(async function(){
    await ClickRandomExternalLink();
})();

SendMouseMove#

Giả lập mouse move.

Cú pháp
await SendMouseMove (x, y);
Chi tiết
Tham số Mô tả
x Tọa độ x.
y Tọa độ y.
Ví dụ
1
2
3
(async function(){
    await SendMouseMove (100, 200);
})();

SendMouseWheel#

Giả lập cuộn chuột bằng con lăn.

Cú pháp
await SendMouseWheel (deltaX, deltaY);
Chi tiết
Tham số Mô tả
deltaX Mức cuộn ngang
deltaY Mức cuộn dọc
Ví dụ
1
2
3
4
5
(async function(){
    await SendMouseWheel(0, -120); //xuống 120px
    await Delay(3000);
    await SendMouseWheel(0, 120); //rồi lại phải lên 120px
})();

MoveMouse#

Giả lập di chuyển chuột giữa hai điểm.

Cú pháp
await MoveMouse (startPoint, endPoint, modifiers = 0, button = "none");
Chi tiết
Tham số Mô tả
startPoint Tọa độ điểm đầu.
endPoint Tọa độ điểm cuối.
modifiers Các phím modifier: WITH_ALT, WITH_CTRL, WITH_COMMAND, WITH_SHIFT.
button Nút chuột được nhấn: none, left, right, middle.
Ví dụ
1
2
3
4
5
6
7
(async function(){
    await WaitForLoading();
    await MoveMouse({X: 0, Y: 0}, {X: 300, Y: 300});
    await MoveMouse({X: 300, Y: 300}, {X: 0, Y: 300});
    await MoveMouse({X: 0, Y: 300}, {X: 300, Y: 0});
    await MoveMouse({X: 300, Y: 0}, {X: 0, Y: 0});
})();

MoveMouseToArea#

Di chuyển chuột tới một ví trị ngẫu nhiên trong vùng được chọn.

Cú pháp
await MoveMouseToArea (x1, y1, x2, y2, modifiers = 0, button = "none");
Chi tiết
Tham số Mô tả
x1 Tọa độ x góc trái bên trên
y1 Tọa độ y góc trái bên trên
x2 Tọa độ x góc phải bên dưới
y2 Tọa độ y góc phải bên dưới
modifiers Xem MoveMouse
button Xem MoveMouse

Coordinates

Ví dụ
1
2
3
4
5
(async function(){
    await WaitForLoading();
    await MoveMouseToArea(0, 0, 300, 300);
    await MoveMouseToArea(0, 0, 300, 300);
})();

MoveMouseToAnyWhere#

Di chuyển chuột đến một vị trí ngẫu nhiên trong site.

Cú pháp
await MoveMouseToAnyWhere (modifiers = 0, button = "none");
Chi tiết
Tham số Mô tả
modifiers Xem MoveMouse
button Xem MoveMouse
Ví dụ
1
2
3
4
5
(async function(){
    await WaitForLoading();
    await MoveMouseToAnyWhere();
    await MoveMouseToAnyWhere();
})();

MoveMouseToElmBySelector#

Di chuyển chuột tới một phần tử được xác định bằng CSS selector.

Cú pháp
await MoveMouseToElmBySelector (selector, index=0, frameSearch="", frameSearchType="", modifiers = 0, button = "none");
Chi tiết
Tham số Mô tả
selector Một CSS selector
index Xem ClickBySelector
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
modifiers Xem MoveMouse
button Xem MoveMouse
Ví dụ
1
2
3
4
5
6
(async function(){
    //test với link https://google.com/
    await WaitForLoading();
    //move mouse to the search text box
    await MoveMouseToElmBySelector ('textarea[title="Search"]');
})();

DragMouse#

Thao tác kéo thả (drag) giữa hai điểm.

Cú pháp
await DragMouse (startPoint, endPoint, speed = 0.5, button = "left", modifiers = 0);
Chi tiết
Tham số Mô tả
startPoint Tọa độ điểm đầu.
endPoint Tọa độ điểm cuối.
speed Tốc độ kéo thả.
button Xem MoveMouse
modifiers Xem MoveMouse
Ví dụ
(async function(){
    //Drag từ điểm 0,0 đến 300,300
    await DragMouse({X: 0, Y: 0}, {X: 300, Y: 300});

    //Drag từ điểm 0,0 đến 300,300 với tốc độ chậm hơn
    await DragMouse({X: 0, Y: 0}, {X: 300, Y: 300}, 10);

    //Drag từ điểm 0,0 đến 300,300 với tốc độ chậm hơn bằng chuột phải
    await DragMouse({X: 0, Y: 0}, {X: 300, Y: 300}, 10, "right");

    //Drag từ điểm 0,0 đến 300,300 với tốc độ chậm hơn bằng chuột phải có bấm giữ phím Ctrl + Shift
    await DragMouse({X: 0, Y: 0}, {X: 300, Y: 300}, 10, "right", WITH_CTRL | WITH_SHIFT);
})();

Tương tác khác#

Điều hướng trình duyệt đến một URL.

Cú pháp
await Navigate (url, referrer);
Chi tiết
Tham số Mô tả
url Link trang web cần tải.
referrer Giả mạo link referrer (tùy chọn).
Ví dụ
1
2
3
4
5
(async function(){
    await Navigate("https://google.com/");
    await WaitForLoading();
    await Navigate("https://bipprofile.io/", "https://google.com/");
})();

CapturePage#

Chụp ảnh phần đang hiển thị trên trình duyệt của trang web và trả về dữ liệu dạng mã hóa base64.

Cú pháp
await CapturePage (quality);
Chi tiết
Tham số Mô tả
quality Chất lượng ảnh, từ 0-100, mặc định là 80.
Ví dụ
1
2
3
4
(async function(){
    const imgBase64 = await CapturePage();
    const betterImgBase64 = await CapturePage(100);
})();

CaptureArea#

Chụp ảnh một phần đang hiển thị của trang web và trả về dữ liệu dạng mã hóa base64.

Cú pháp
await CaptureArea (x1, y1, x2, y2, quality);
Chi tiết
Tham số Mô tả
x1 Tọa độ x góc trái bên trên
y1 Tọa độ y góc trái bên trên
x2 Tọa độ x góc phải bên dưới
y2 Tọa độ y góc phải bên dưới
quality Chất lượng ảnh, từ 0-100, mặc định là 80.

Coordinates

Ví dụ
1
2
3
4
(async function(){
    const imgBase64 = await CaptureArea(0, 0, 300, 500);
    const betterImgBase64 = await CaptureArea(0, 0, 300, 500, 100);
})();
Tip

Bạn có thể dễ dàng tạo lệnh này bằng cách sử dụng May Extension!

CaptureElement#

Chụp ảnh một phần tử hiển thị trên trang web và trả về dữ liệu dạng mã hóa base64.

Cú pháp
await CaptureElement (selector, quality, frameSearch, frameSearchType);
Chi tiết
Tham số Mô tả
selector CSS selector của phần tử
quality Chất lượng ảnh, từ 0-100, mặc định là 80.
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
Ví dụ
1
2
3
4
(async function(){
    const captcha = await CaptureElement("#image_captcha");
    const avatar = await CaptureElement("#profile img.avatar");
})();

GetElementPosBySelector#

Lấy tọa độ của một phần tử bằng CSS selector.

Cú pháp
await GetElementPosBySelector (selector, frameSearch, frameSearchType);
Chi tiết
Tham số Mô tả
selector CSS selector của phần tử
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
Ví dụ
1
2
3
4
(async function(){
    const pos = await GetElementPosBySelector("#image_captcha");
    //eg: {x1: 100, y1: 100, x2: 200, y2: 200}
})();
Tip

Bạn có thể dễ dàng tạo lệnh này bằng cách sử dụng May Extension!

SetFilesToElement#

Đặt file được chọn cho các thẻ file input, thường dùng khi bạn cần upload.

Cú pháp
await SetFilesToElement (selector, files, frameSearch, frameSearchType);
Chi tiết
Tham số Mô tả
selector CSS selector của phần tử
files Mảng các đường dẫn đến file.
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
Ví dụ
1
2
3
4
(async function(){
    //test trên link https://ps.uci.edu/~franklin/doc/file_upload.html
    await SetFilesToElement("html>body>form>input", ["D:\\test_file.txt"]);
})();
Tip

Bạn có thể dễ dàng tạo lệnh này bằng cách sử dụng May Extension!

ScrollTo#

Cuộn trang web đến vị trí xác định.

Cú pháp
await ScrollTo (x, y, smooth = false);
Chi tiết
Tham số Mô tả
x tọa độ x.
y tọa độ y.
smooth Cuộn từ từ hay tốc biến.
Ví dụ
1
2
3
4
(async function(){
    await ScrollTo(0, 1000);
    await ScrollTo(0, 0, true);
})();

ResizeTo#

Thay đổi kích thước trình duyệt.

Cú pháp
await ResizeTo (width, height);
Chi tiết
Tham số Mô tả
width Chiều rộng.
height Chiều cao.
Ví dụ
1
2
3
(async function(){
    await ResizeTo (600, 500);
})();

MoveTo#

Di chuyển cửa số trình duyệt đến một vị trí xác định trên màn hình.

Cú pháp
await MoveTo (x, y);
Chi tiết
Tham số Mô tả
x Tọa độ x.
y Tọa độ y.
Ví dụ
1
2
3
(async function(){
    await MoveTo (100, 150);
})();

TabFocus#

Kích hoạt một tab hoặc popup khi trình duyệt mở nhiều hơn một tab. Sau khi gọi hàm TabFocus, tất các hàm sau đó sẽ được chạy trên tab vừa được focus.

Cú pháp
await TabFocus (target);
Chi tiết
Tham số Mô tả
target Có thể là số thứ tự của tab (bắt đầu từ 1) hoặc là một mẫu text xuất hiện trong URL.
Ví dụ
(async function(){
    await WaitForLoading();
    await EvalScript('open("https://google.com")');
    await EvalScript('open("https://facebook.com")');
    await Delay(2000);
    await EvalScript('document.write("this is main tab")');
    await TabFocus(2); //focus to the 2nd tab
    await Delay(1000);
    await EvalScript('document.write("this 2nd tab")');
    await TabFocus("facebook.com"); //focus to the tab which has url contains "facebook.com"
    await Delay(1000);
    await EvalScript('document.write("this facebook tab")');

    //focus to the first tab that does not contains facebook.com
    await TabFocus("!facebook.com");
})();

EvalScript#

Thực thi mã javascript trên trang web, kết quả trả về là các dữ liệu nguyên thủy (number, string) hoặc các object đơn giản.

Cú pháp
await EvalScript (jsCode, frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
jsCode Mã javascript.
frameSearch Xem ClickBySelector
frameSearchType Xem ClickBySelector
Ví dụ
1
2
3
4
5
6
7
8
(async function(){
    await WaitForLoading();
    const r1 = await EvalScript ('"bip" + "profile"');
    //r1 =  {"result":"bipprofile"}

    const r2 = await EvalScript ('null[0]');
    //r2 = {"error":"TypeError: Cannot read properties of null (reading '0')"}
})();

EvalScriptWithPromise#

Tương tự như EvalScript nhưng nếu đoạn mã bạn cần thực thì là một async function hoặc function trả về là một Promise thì hãy sử dụng hàm này.

Cú pháp
await EvalScriptWithPromise (jsCode, frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
jsCode The javascript code to execute.
frameSearch See ClickBySelector
frameSearchType See ClickBySelector
Ví dụ
(async function(){
    await WaitForLoading();
    const r1 = await EvalScript ('"bip" + "profile"');
    //r1 =  {"result":"bipprofile"}

    const r2 = await EvalScriptWithPromise ('Promise.resolve("bipprofile")');
    //r2 =  {"result":"bipprofile"}

    const r3 = await EvalScriptWithPromise ('Promise.noSuchFunc("bipprofile")');
    //r3 =  {"error":"TypeError: Promise.noSuchFunc is not a function"}
})();

SetBySelector#

Đặt giá trị cho một thuộc tính của phần tử theo ID.

Cú pháp
await SetBySelector (selector, attr, value, index, frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
selector ID của phần tử.
attr Thuộc tính cần đặt giá trị.
value Giá trị.
index Thứ tự phần tử sẽ sử dụng nếu css selector khớp nhiều hơn một phần tử. 0 là phần tử đầu tiên, hoặc nhập random để chọn ngẫu nhiên, all đế áp dựng cho tất cả.
frameSearch Nếu phần tử nằm trong một thẻ iframe, bạn cần xác định frame đó.
frameSearchType Kiểu xác định frame, gồm có các giá trị: "src-starts", "src-ends", "src-equals", "src-contains", "src-regex", "frame-path", mặc định là "src-contains".
Ví dụ
(async function(){
    await WaitForLoading();
    await SetBySelector("#email", "value", "[email protected]");
    await SetBySelector(".address", "value", "mars", "all");

    //đặt giá trị là "[email protected]" cho thẻ input có id là email, bên trong một iframe có thuộc tính src bắt đầu với https://bipprofile.io
    await SetBySelector("input#email", "value", "[email protected]", 0, "https://bipprofile.io", "src-starts");

    //đặt giá trị là "[email protected]" cho thẻ input có id là email, bên trong một iframe có thuộc tính src chính xác bằng https://bipprofile.io/contact.html
    await SetBySelector("input#email", "value", "[email protected]", 0, "https://bipprofile.io/contact.html", "src-equals");

    //đặt giá trị là "[email protected]" cho thẻ input có id là email, bên trong một iframe có thuộc tính src kết thúc bằng /contact.html
    await SetBySelector("input#email", "value", "[email protected]", 0, "/contact.html", "src-ends");

    //đặt giá trị là "[email protected]" cho thẻ input có id là email, bên trong một iframe có thuộc tính src có chứa bipprofile.io
    await SetBySelector("input#email", "value", "[email protected]", 0, "bipprofile.io", "src-contains");

    //đặt giá trị là "[email protected]" cho thẻ input có id là email, bên trong một iframe có thuộc tính src khớp regex bip[a-z]+\.io
    await SetBySelector("input#email", "value", "[email protected]", 0, "bip[a-z]+\.io", "src-regex");

    //đặt giá trị là "[email protected]" cho thẻ input có id là email, bên trong iframe đầu tiên trong site
    await SetBySelector("input#email", "value", "[email protected]", 0, "0", "frame-path");

    //đặt giá trị là "[email protected]" cho thẻ input có id là email, bên trong iframe thứ 2 của iframe đầu tiên trong site
    await SetBySelector("input#email", "value", "[email protected]", 0, "0>1", "frame-path");
})();

SetById#

Đặt giá trị cho một thuộc tính của phần tử theo ID.

Cú pháp
await SetById (id, attr, value, frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
id ID của phần tử.
attr Thuộc tính cần đặt giá trị.
value Giá trị.
frameSearch Xem SetBySelector
frameSearchType Xem SetBySelector
Ví dụ
1
2
3
4
(async function(){
    await WaitForLoading();
    await SetById("email", "value", "[email protected]");
})();

SetByClass#

Đặt giá trị cho một thuộc tính của phần tử theo class.

Cú pháp
await SetByClass (class, attr, value, index, frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
class tên class của phần tử.
attr Thuộc tính cần đặt giá trị.
value Giá trị.
index Xem SetBySelector
frameSearch Xem SetBySelector
frameSearchType Xem SetBySelector
Ví dụ
1
2
3
4
5
(async function(){
    await WaitForLoading();
    await SetBySelector("#email", "value", "[email protected]");
    await SetBySelector(".address", "value", "mars", "all");
})();

SetByTag#

Đặt giá trị cho một thuộc tính của phần tử theo tên tag.

Cú pháp
await SetByTag (tag, attr, value, index, frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
tag Tag name of the element.
attr The attribute you want to set.
value The value you want to set.
index Xem SetBySelector
frameSearch Xem SetBySelector
frameSearchType Xem SetBySelector
Ví dụ
1
2
3
4
5
6
7
(async function(){
    await WaitForLoading();
    await SetByTag("input", "value", "text value");
    await SetByTag("input", "value", "text value", 2);
    await SetByTag("input", "value", "text value", "random");
    await SetByTag("input", "value", "text value", "all");
})();

SetByXpath#

Đặt giá trị cho một thuộc tính của phần tử theo tên xpath.

Cú pháp
await SetByXpath (xpath, attr, value, frameSearch="", frameSearchType="");
Chi tiết
Tham số Mô tả
xpath Xpath of the element.
attr The attribute you want to set.
value The value you want to set.
frameSearch Xem SetBySelector
frameSearchType Xem SetBySelector
Ví dụ
1
2
3
4
(async function(){
    await WaitForLoading();
    await SetByXpath ('//input[@type="email"]', 'value', '[email protected]');
})();

Xử lý captcha#

_2CaptchaSolve#

Giải captcha bằng dịch vụ của 2Captcha. Nếu bạn sử dụng một dịch vụ khác tương tự hoặc có khả năng tương thích với 2captcha, bạn có thể ghi đè API máy chủ vào biến _2CaptchaServer.

Cú pháp
await _2CaptchaSolve (params, timeout);
Chi tiết
Tham số Mô tả
params Các tham số theo tài liệu của 2Captcha.
timeout Thời gian chờ tối đa tính bằng giây.
Ví dụ
(async function(){
    //_2CaptchaServer = "http://a-similar-2captcha.com";
    const captBase64 = await CaptureElement("#CAPTCHA_IMAGE");
    const result = await _2CaptchaSolve({
        'key' : '2CAPTCHA_API_KEY', //replace with your 2Captcha API Key
        'method' : 'base64',
        'json' : 1,
        'body': captBase64
    });
    Log("Result is:", result.request);
    //Example Result: {status:1, request: VMXKDG, captchaId: 1241352612}
})();

_2CaptchaReportBad#

Nếu bạn tin rằng captcha giải không đúng, bạn có thể báo cáo để được hoàn tiền, tuy nhiên đừng lạm dụng vì nó có thể vi phạm chính sách của bên cung cấp nếu bạn cố tính báo cáo sai.

Cú pháp
await _2CaptchaReportBad (key, captchaId);
Chi tiết
Tham số Mô tả
key 2Captcha API Key.
captchaId ID của captcha trả về bởi _2CaptchaSolve.
Ví dụ
(async function(){
    //_2CaptchaServer = "http://a-similar-2captcha.com";
    const captBase64 = await CaptureElement("#CAPTCHA_IMAGE");
    const result = await _2CaptchaSolve({
        'key' : '2CAPTCHA_API_KEY', //replace with your 2Captcha API Key
        'method' : 'base64',
        'json' : 1,
        'body': captBase64
    });

    //submit captcha và bị xịt...
    await _2CaptchaReportBad('2CAPTCHA_API_KEY', result.captchaId);
})();

ACSolve#

Giải captcha bằng dịch vụ của anti-captcha. Nếu bạn sử dụng một dịch vụ khác tương tự hoặc có khả năng tương thích với anti-captcha, bạn có thể ghi đè API máy chủ vào biến AntiCaptchaServer.

Cú pháp
await ACSolve (params, timeout);
Chi tiết
Tham số Mô tả
params tham số theo tài liệu của anti-captcha.
timeout Timeout in seconds.
Ví dụ
(async function(){
    //AntiCaptchaServer = "http://a-similar-anti-captcha.com";

    //Giải image captcha
    const captBase64 = await CaptureElement("#CAPTCHA_IMAGE");
    const result = await ACSolve({
        "clientKey":"Your anti-captcha API Key",
        "task":
        {
            "type":"ImageToTextTask",
            "body":captBase64,
            "phrase":false,
            "case":false,
            "numeric":false,
            "math":0,
            "minLength":0,
            "maxLength":0
        }
    }, 150);

    /* Example result
    {
        "taskId":1234567,
        "errorId":0,
        "status":"ready",
        "solution":
            {
                "text":"deditur",
                "url":"http:\/\/61.39.233.233\/1\/147220556452507.jpg"
            },
        "cost":"0.000700",
        "ip":"46.98.54.221",
        "createTime":1472205564,
        "endTime":1472205570,
        "solveCount":"0"
    }
    */

   //Giải Google ReCAPTCHA
    const result2 = await ACSolve({
        "clientKey": "Your anti-captcha API Key",
        "task":
        {
            "type":"NoCaptchaTaskProxyless",
            "websiteURL":"https://bipprofile.com",
            "websiteKey":"6LdPp08UAAAAADi4dE6frVDXCv2CgESTpcscb_LS"
        }
    }, 600);
})();

ACReportIncorrectImage#

Nếu bạn tin rằng captcha giải không đúng, bạn có thể báo cáo để được hoàn tiền, tuy nhiên đừng lạm dụng vì nó có thể vi phạm chính sách của bên cung cấp nếu bạn cố tính báo cáo sai.

Cú pháp
await ACReportIncorrectImage(key, taskId);
Chi tiết
Tham số Mô tả
key anti-captcha API Key.
taskId taskId trả về bởi ACSolve.
Ví dụ
(async function(){
    //AntiCaptchaServer = "http://a-similar-anti-captcha.com";
    const captBase64 = await CaptureElement("#CAPTCHA_IMAGE");
    const result = await ACSolve({
        "clientKey":"Your anti-captcha API Key",
        "task":
        {
            "type":"ImageToTextTask",
            "body":captBase64,
            "phrase":false,
            "case":false,
            "numeric":false,
            "math":0,
            "minLength":0,
            "maxLength":0
        }
    }, 150);

    //do something | submit captcha...
    if("bị xịt")
    {
        ACReportIncorrectImage("Your anti-captcha API Key", result.taskId);
    }
})();

ACReportIncorrectRecaptcha#

Tương tự như ACReportIncorrectImage nhưng sử dụng cho với ReCAPTCHA.

SolveRecaptcha#

Đây là hàm giải ReCAPTCHA, được xây dựng dựa trên _2CaptchaSolveACSolve. Nếu captcha được giải thành công, bạn có thể tiếp tục với các hành động tiếp theo như click nút Submit, Continue... Ngoài ra bạn có thể dùng hàm TryToCallRecaptchaCallBack để kích hoạt hàm callback (nếu có) trên site khi captcha đã được giải.

Cú pháp
await SolveRecaptcha (service, apiKey, timeout = 300, overrideApiServer = null);
Chi tiết
Tham số Mô tả
service Giá trị hợp lệ: 2captcha or anti-captcha
apiKey API Key của 2captcha hoặc anti-captcha
timeout Thời gian chờ tối đa tính bằng giây
overrideApiServer Ghi đè API endpoint gốc nếu bạn dùng một dịch vụ tương tự
Ví dụ
(async function(){
    //test on https://www.google.com/recaptcha/api2/demo
    await WaitForLoading ();
    const result = await SolveRecaptcha("2captcha", "YOUR_API_KEY");
    //const result = await SolveRecaptcha("anti-captcha", "YOUR_API_KEY");
    await ClickBySelector('#recaptcha-demo-submit'); //click submit button
    //await TryToCallRecaptchaCallBack(result.request);

    /*
    Example of result value:

    2captcha: {"status":1,"request":"THE_RESPONSE_RESULT","captchaId":"71006265012"}

    anti-captcha: 
    {
        "errorId":0,
        "status":"ready",
        "solution":{
            "gRecaptchaResponse":"THE_RESPONSE_RESULT",
            "cookies":{
                "_GRECAPTCHA":"COOKIES..."
            }
        },
        "cost":"0.00200",
        "ip":"1.2.3.4",
        "createTime":1658115990,
        "endTime":1658116074,
        "solveCount":0,
        "taskId":685667638
    }
    */
})();

SolvehCaptcha#

Tương tự như SolveRecaptcha nhưng sử dụng cho với hCaptcha.

Cú pháp
await SolvehCaptcha (service, apiKey, timeout = 300, overrideApiServer = null);
Chi tiết
Tham số Mô tả
service Giá trị hợp lệ: 2captcha or anti-captcha
apiKey API Key của 2captcha hoặc anti-captcha
timeout Thời gian chờ tối đa tính bằng giây
overrideApiServer Ghi đè API endpoint gốc nếu bạn dùng một dịch vụ tương tự
Ví dụ
1
2
3
4
5
6
7
(async function(){
    //test on https://accounts.hcaptcha.com/demo
    await WaitForLoading ();
    const result = await SolvehCaptcha("2captcha", "YOUR_API_KEY");
    //const result = await SolvehCaptcha("anti-captcha", "YOUR_API_KEY");
    await ClickById('hcaptcha-demo-submit'); //click submit button
})()

SolveImageCaptcha#

Tương tự như SolveRecaptcha nhưng sử dụng cho các loại captcha ảnh.

Cú pháp
await SolveImageCaptcha (imgSelector, resultSelector, service, apiKey, timeout = 300, overrideApiServer = null);
Chi tiết
Tham số Mô tả
imgSelector CSS selector của ảnh captcha.
resultSelector CSS selector ô text để nhập kết quả.
service Giá trị hợp lệ: 2captcha or anti-captcha
apiKey API Key của 2captcha hoặc anti-captcha
timeout Thời gian chờ tối đa tính bằng giây
overrideApiServer Ghi đè API endpoint gốc nếu bạn dùng một dịch vụ tương tự
Ví dụ
(async function(){
    //test on https://captcha.com/demos/features/captcha-demo.aspx
    await WaitForLoading ();
    const result = await SolveImageCaptcha("#demoCaptcha_CaptchaImage", "#captchaCode", "2captcha", "YOUR_API_KEY")
    // const result = await SolveImageCaptcha("#demoCaptcha_CaptchaImage", "#captchaCode", "anti-captcha", "YOUR_API_KEY")
    await ClickBySelector ("#validateCaptchaButton");

    /*
    Example of result value:

    2captcha: {"status":1,"request":"bw8t","captchaId":"71014870176"}

    anti-captcha: 
    {
        "errorId":0,
        "status":"ready",
        "solution":{
            "text":"BW8T",
            "url":"http://209.212.146.170/80/165820017899645.jpg"
        },
        "cost":"0.00070",
        "ip":"1.2.3.4",
        "createTime":1658200178,
        "endTime":1658200181,
        "solveCount":0,
        "taskId":701277528
    }
    */
})()

TryToCallRecaptchaCallBack#

Cố gắng tìm và thực thi hàm callback (nếu có) sau khi giải xong ReCAPTCHA.

Cú pháp
TryToCallRecaptchaCallBack (result);
Chi tiết
Tham số Mô tả
result Kết quả giải ReCAPTCHA.
Ví dụ
(async function(){
    const result = await ACSolve({
        "clientKey": "Your anti-captcha API Key",
        "task":
        {
            "type":"NoCaptchaTaskProxyless",
            "websiteURL":"https://bipprofile.io",
            "websiteKey":"6LdPp08UAAAAADi4dE6frVDXCv2CgESTpcscb_LS"
        }
    }, 600);
    await TryToCallRecaptchaCallBack(result.solution.gRecaptchaResponse);
})()

Xử lý file#

GetCurrentDir#

Lấy thư mục gốc của tool

Cú pháp
GetCurrentDir ();
Ví dụ
1
2
3
4
(async function(){
    const root = GetCurrentDir();
    Log("Tool đang chạy trong:", root);
})();

GetHomeDir#

Lấy thư mục home của user trên máy tính.

Cú pháp
GetHomeDir ();
Ví dụ
1
2
3
4
(async function(){
    const home = GetHomeDir();
    Log("Home dir:", home);
})();

GetDownloadDir#

Lấy thư mục lưu các tệp download về của profile.

Cú pháp
GetDownloadDir ();
Ví dụ
1
2
3
4
(async function(){
    const dl = GetDownloadDir();
    Log("Download dir:", dl);
})();

ReadFileAsString#

Đọc file và trả về dữ liệu dạng text.

Cú pháp
ReadFileAsString (path);
Chi tiết
Tham số Mô tả
path Đường dẫn đến file.

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{result: "FILE_CONTENT"}
hoặc
{error: "ERROR_MESSAGE"}
Ví dụ
1
2
3
4
5
6
(async function(){
    const read = ReadFileAsString("D:\\my-proxies.txt");
    Log("Result is:", read.result);
    //{result: "1.1.1.1:6969"}
    //{error: "file does not exists"}
})();

ReadFileAsLines#

Đọc file text và trả về dữ liệu các dòng dưới dạng mảng (array).

Cú pháp
ReadFileAsLines (path);
Chi tiết
Tham số Mô tả
path Đường dẫn đến file.

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{result: STRING_ARRAY}
hoặc
{error: "ERROR_MESSAGE"}
Ví dụ
1
2
3
4
5
6
(async function(){
    const read = ReadFileAsLines("D:\\my-proxies.txt");
    Log("Result is:", read.result);
    //{result: ["1.1.1.1:6969", "1.1.1.1:6970"]}
    //{error: "file does not exists"}
})();

ReadFileAsBytes#

Đọc file và trả về dữ liệu dạng binary.

Cú pháp
ReadFileAsBytes (path);
Chi tiết
Tham số Mô tả
path Đường dẫn đến file.

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{result: ArrayBuffer}
hoặc
{error: "ERROR_MESSAGE"}
Ví dụ
1
2
3
4
5
6
(async function(){
    const read = ReadFileAsBytes("D:\\my-proxies.txt");
    Log("Result is:", read.result);
    //{result: ArrayBuffer}
    //{error: "file does not exists"}
})();

WriteFile#

Ghi dữ liệu vào file.

Cú pháp
WriteFile (path, data, append);
Chi tiết
Tham số Mô tả
path Đường dẫn đến file.
data Dữ liệu text hoặc binary.
append Ghi nối hoặc ghi đè dữ liệu, true hoặc false.

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{result: true}
hoặc
{error: "ERROR_MESSAGE"}
Ví dụ
1
2
3
4
(async function(){
    WriteFile("D:\\bipprofile.txt", "vi tuong lai");
    WriteFile("D:\\bipprofile.txt", " MMO Viet", true); //ghi nối thêm vào file
})();

TouchFile#

Sờ soạng vào file.

Cú pháp
TouchFile (path);
Chi tiết
Tham số Mô tả
path Đường dẫn đến file.

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{result: true}
hoặc
{error: "ERROR_MESSAGE"}
Ví dụ
1
2
3
(async function(){
    TouchFile("D:\\bipprofile.txt");
})();

PathExists#

Kiểm tra một đường dẫn (file hoặc thư mục) có tồn tại hay không.

Cú pháp
PathExists (path);
Chi tiết
Tham số Mô tả
path Đường dẫn.
Ví dụ
1
2
3
4
5
(async function(){
    const exists = PathExists("D:\\bipprofile.txt");
    if(exists) Log("File tồn tại");
    else Log("File KHÔNG tồn tại");
})();

GetFileInfo#

Lấy thông tin file.

Cú pháp
GetFileInfo (path);
Chi tiết
Tham số Mô tả
path Đường dẫn.

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{
    "result": {
        "creationTime": 1724735412.946547,
        "isDirectory": false,
        "isSymbolicLink": false,
        "lastAccessed": 1724735417.776545,
        "lastModified": 1724735417.776545,
        "size": 21
    }
}

hoặc
{error: "ERROR_MESSAGE"}
Ví dụ
1
2
3
4
(async function(){
    const info = GetFileInfo("D:\\bipprofile.txt");
    Log(info);
})();

CopyFileOrDir#

Copy file hoặc thư mục.

Cú pháp
CopyFileOrDir (src, dst);
Chi tiết
Tham số Mô tả
src Đường dẫn nguồn.
dst Đường dẫn đích.

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{result: true}
hoặc
{error: "ERROR_MESSAGE"}
Ví dụ
1
2
3
(async function(){
    CopyFileOrDir("D:\\bipprofile.txt", "D:\\bipprofile2.txt");
})();

MoveFileOrDir#

Move file hoặc thư mục.

Cú pháp
MoveFileOrDir (src, dst);
Chi tiết
Tham số Mô tả
src Đường dẫn nguồn.
dst Đường dẫn đích.

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{result: true}
hoặc
{error: "ERROR_MESSAGE"}
Ví dụ
1
2
3
(async function(){
    MoveFileOrDir("D:\\bipprofile.txt", "E:\\bipprofile.txt");
})();

DelFileOrDir#

Xóa file hoặc thư mục.

Cú pháp
DelFileOrDir (path);
Chi tiết
Tham số Mô tả
path Đường dẫn.

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{result: true}
hoặc
{error: "ERROR_MESSAGE"}
Ví dụ
1
2
3
(async function(){
    DelFileOrDir("D:\\bipprofile.txt");
})();

MkDir#

Tạo thư mục.

Cú pháp
MkDir (path);
Chi tiết
Tham số Mô tả
path Đường dẫn.

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{result: true}
hoặc
{error: "ERROR_MESSAGE"}
Ví dụ
1
2
3
(async function(){
    MkDir("D:\\new-folder");
})();

ReadDir#

Trả về danh sách các file trong một thư mục.

Cú pháp
ReadDir (path);
Chi tiết
Tham số Mô tả
path Đường dẫn.

Kết quả trả về

Một object với các thuộc tính được minh họa như sau

{
    "result": [
        "full_path_to_file1",
        "full_path_to_file2",
        "full_path_to_a_dir"
    ]
}

hoặc
{error: "ERROR_MESSAGE"}
Ví dụ
1
2
3
4
(async function(){
    const list = ReadDir("D:\\new-folder");
    Log(list);
})();

Cookies#

GetCookies#

Lấy một số hoặc toàn bộ cookie theo bộ lọc. Nếu không chỉ định bộ lọc, toàn bộ cookie sẽ được trả về.

Cú pháp
await GetCookies (filter);
Chi tiết: filter là một object với các thuộc tính sau
Thuộc tính Mô tả
domain Domain của cookie.
url URL của cookie.
path Đường dẫn trong URL của cookie.
name Tên cookie.
Ví dụ
1
2
3
4
5
6
7
(async function(){
    const allCookies = await GetCookies();
    Log("all:", allCookies );

    const googleCookies = await GetCookies({domain: "google.com"});
    Log("google:", googleCookies);
})()

GetCookie#

Lấy một cookie theo tên

Cú pháp
await GetCookie (name, url);
Chi tiết: filter là một object với các thuộc tính sau
Thuộc tính Mô tả
name Tên cookie.
url URL của cookie.
Ví dụ
(async function(){
    const cookie = await GetCookie("PHPSESSID", "https://myhttpheader.com/");
    Log(cookie );
    /* Kết quả minh họa
    {
        "domain": "myhttpheader.com",
        "hostOnly": true,
        "httpOnly": false,
        "name": "PHPSESSID",
        "path": "/",
        "sameSite": "unspecified",
        "secure": true,
        "session": true,
        "storeId": "0",
        "value": "d353f7f28ed8c7947749934e6633174b"
    }
    */
})()

SetCookie#

Set một cookie.

Cú pháp
await SetCookie (cookie);
Chi tiết: cookie là một object với các thuộc tính sau
Thuộc tính Mô tả
name Tên cookie (Bắt buộc).
value Giá trị cookie (Bắt buộc).
url URL của cookie (Bắt buộc).
expires Thời hạn của cookie theo Unix timestamp.
path Đường dẫn trong URL của cookie.
domain Domain của cookie.
httpOnly HttpOnly.
sameSite same-site status.
secure Secure.
Ví dụ
(async function(){
    await SetCookie({
        "name": "BIP_PROFILE",
        "value": "DINH_NOC_KICH_TRAN_BAY_PHAP_PHOI",
        "url": "https://bipprofile.io",
        "expires": Date.now()/1000 + 86400*3 //3 ngày
    });
    const cookie = await GetCookie("BIP_PROFILE", "https://bipprofile.io");
    Log(cookie);
})()

DeleteCookies#

Xóa một hoặc nhiều cookie.

Cú pháp
await DeleteCookies (name, domain, url);
Chi tiết: cookie là một object với các thuộc tính sau
Thuộc tính Mô tả
name Tên cookie (Bắt buộc).
url URL của cookie (Nếu không chỉ định, bắt buộc chỉ định domain).
domain Domain của cookie (Nếu không chỉ định, bắt buộc chỉ định url).
Ví dụ
(async function(){
    await SetCookie({
        "name": "BIP_PROFILE",
        "value": "DINH_NOC_KICH_TRAN_BAY_PHAP_PHOI",
        "url": "https://bipprofile.io",
        "expires": Date.now()/1000 + 86400*3 //3 ngày
    });
    Log("Trước khi xóa:", await GetCookie("BIP_PROFILE", "https://bipprofile.io"));

    await DeleteCookies("BIP_PROFILE", "bipprofile.io");
    Log("Sau khi xóa:", await GetCookie("BIP_PROFILE", "https://bipprofile.io")); //null
})()

ClearCookies#

Xóa sạch cookie trình duyệt.

Cú pháp
await ClearCookies ();
Ví dụ
1
2
3
4
5
(async function(){
    Log("Trước khi xóa:", await GetCookies());
    await ClearCookies();
    Log("Sau khi xóa:", await GetCookies());
})()

Shell#

LaunchProcess#

Khởi chạy một process ngoài.

Cú pháp
await LaunchProcess (cmd, args, wait);
Chi tiết
Tham số Mô tả
cmd Đường dẫn đến file thực thi.
args Các tham số.
wait Đợi đến khi process thoát, true hoặc false.
Ví dụ
1
2
3
4
5
(async function(){
    await LaunchProcess("notepad");
    const l = await LaunchProcess("cmd", ["/C", "echo", "Hello Bip Profile"], true);
    Log(l);//Kết quả từ stdout và stdout
})()

Keycode Table#

Sử dụng cho các hàm: SendKeyPress, SendKeyDown, SendKeyUp, SendKeyChar.

Click để hiện bảng mã
Tham số Mô tả
K_BACKSPACE Backspace
K_TAB Tab
K_ENTER Enter
K_SHIFT Shift
K_CONTROL Control
K_ALT Alt
K_PAUSE Pause
K_CAPSLOCK CapsLock
K_ESCAPE Escape
K_SPACE Space
K_PAGEUP PageUp
K_PAGEDOWN PageDown
K_END End
K_HOME Home
K_ARROWLEFT ArrowLeft
K_ARROWUP ArrowUp
K_ARROWRIGHT ArrowRight
K_ARROWDOWN ArrowDown
K_PRINTSCREEN PrintScreen
K_INSERT Insert
K_DELETE Delete
K_DIGIT0 Digit0 (0)
K_DIGIT1 Digit1 (1)
K_DIGIT2 Digit2 (2)
K_DIGIT3 Digit3 (3)
K_DIGIT4 Digit4 (4)
K_DIGIT5 Digit5 (5)
K_DIGIT6 Digit6 (6)
K_DIGIT7 Digit7 (7)
K_DIGIT8 Digit8 (8)
K_DIGIT9 Digit9 (9)
K_KEYA KeyA (A)
K_KEYB KeyB (B)
K_KEYC KeyC (C)
K_KEYD KeyD (D)
K_KEYE KeyE (E)
K_KEYF KeyF (F)
K_KEYG KeyG (G)
K_KEYH KeyH (H)
K_KEYI KeyI (I)
K_KEYJ KeyJ (J)
K_KEYK KeyK (K)
K_KEYL KeyL (L)
K_KEYM KeyM (M)
K_KEYN KeyN (N)
K_KEYO KeyO (O)
K_KEYP KeyP (P)
K_KEYQ KeyQ (Q)
K_KEYR KeyR (R)
K_KEYS KeyS (S)
K_KEYT KeyT (T)
K_KEYU KeyU (U)
K_KEYV KeyV (V)
K_KEYW KeyW (W)
K_KEYX KeyX (X)
K_KEYY KeyY (Y)
K_KEYZ KeyZ (Z)
K_METALEFT MetaLeft (Meta)
K_METARIGHT MetaRight (Meta)
K_CONTEXTMENU ContextMenu
K_NUMPAD0 Numpad0 (0)
K_NUMPAD1 Numpad1 (1)
K_NUMPAD2 Numpad2 (2)
K_NUMPAD3 Numpad3 (3)
K_NUMPAD4 Numpad4 (4)
K_NUMPAD5 Numpad5 (5)
K_NUMPAD6 Numpad6 (6)
K_NUMPAD7 Numpad7 (7)
K_NUMPAD8 Numpad8 (8)
K_NUMPAD9 Numpad9 (9)
K_NUMPADMULTIPLY NumpadMultiply (*)
K_NUMPADADD NumpadAdd (+)
K_NUMPADSUBTRACT NumpadSubtract (-)
K_NUMPADDECIMAL NumpadDecimal (.)
K_NUMPADDIVIDE NumpadDivide (/)
K_F1 F1
K_F2 F2
K_F3 F3
K_F4 F4
K_F5 F5
K_F6 F6
K_F7 F7
K_F8 F8
K_F9 F9
K_F10 F10
K_F11 F11
K_F12 F12
K_NUMLOCK NumLock
K_SCROLLLOCK ScrollLock
K_AUDIOVOLUMEMUTE AudioVolumeMute
K_AUDIOVOLUMEDOWN AudioVolumeDown
K_AUDIOVOLUMEUP AudioVolumeUp
K_MEDIATRACKNEXT MediaTrackNext
K_MEDIATRACKPREVIOUS MediaTrackPrevious
K_MEDIASTOP MediaStop
K_MEDIAPLAYPAUSE MediaPlayPause
K_LAUNCHMAIL LaunchMail
K_LAUNCHMEDIAPLAYER LaunchMediaPlayer
K_LAUNCHAPPLICATION1 LaunchApplication1
K_LAUNCHAPPLICATION2 LaunchApplication2
K_SEMICOLON Semicolon (;)
K_EQUAL Equal (=)
K_COMMA Comma (,)
K_MINUS Minus (-)
K_PERIOD Period (.)
K_SLASH Slash (/)
K_BACKQUOTE Backquote (`)
K_BRACKETLEFT BracketLeft ([)
K_BACKSLASH Backslash (\)
K_BRACKETRIGHT BracketRight (])
K_QUOTE Quote (')

Cần hỗ trợ?

Nếu bạn gặp bất cứ khó khăn gì, hoặc muốn yêu cầu thêm hàm mới, hãy liên hệ với chúng tôi!.