Skip to content

Các hàm dựng sẵn bởi Bịp Device#


ExecAdbCmd#

Đây là hàm quan trọng nhất bởi 99% sự tương tác với thiết bị đều thông qua hàm này. ExecAdbCmd thực thi một lệnh ADB tới thiết bị

Cú pháp
await ExecAdbCmd(args);
Chi tiết
Tên Mô tả
args Mảng các tham số gửi tới ADB

Kết quả trả về: Object

Ví dụ
(async function(){
    const result = await ExecAdbCmd (["shell", "echo", "Hello BIP"]);
    Log(result);
    /* Kết quả trả về là một object như sau:
    {
        "error": null,              //Lỗi nêu có khi gọi adb,
        "dataOut": "Hello BIP\r\n", //Output từ stdout
        "errorOut": "",             //Output từ stderr
        "result": "Hello BIP\r\n"   //Tổng hợp từ cả stdout + stderr
    }
    */

    // Bạn cũng có thể truyền tham số vào hàm ExecAdbCmd như sau
    // const result = await ExecAdbCmd (["shell", "echo 'Hello BIP'"]);
    // const result = await ExecAdbCmd ("shell", "echo", "Hello BIP");
    // const result = await ExecAdbCmd ("shell", "echo 'Hello BIP'");
})();

ExecShell#

Cú pháp
(async function(){
    // Nếu bạn quá lười để gõ 
    // await ExecAdbCmd (["shell", "echo", "Hello BIP"]);
    // Hãy dùng ExecShell, kết quả trả về như ExecAdbCmd
    await ExecShell (["echo", "Hello BIP"]);

    // Hoặc
    // await ExecShell (["echo 'Hello BIP'"]);
    // await ExecShell ("echo", "Hello BIP");
    // await ExecShell ("echo 'Hello BIP'");
})();

ChangeInfo#

Thay đổi thông số thiết bị, tham số truyền vào là một object với chi tiết mô tả bên dưới

Cú pháp
await ChangeInfo (option);
Chi tiết: Các thuộc tính của {option}
Tham số Mô tả
brand Chỉ định brand nào sẽ dùng, VD: samsung, Xem các brand hỗ trợ. Mặc định là random, ngoài ra bạn cũng có thể tự thêm các device riêng và sử dụng như list device tích hợp của tool.
model Chỉ định model nào sẽ dùng, VD: SM-G930F, Xem các model hỗ trợ. Tham số này chỉ có ý nghĩa khi bạn chỉ định brand. Mặc định là random
version Chỉ định phiên bản android cụ thể. Mặc định là random
country Chỉ định country nào để fake SIM, VD: vn, Xem các country hỗ trợ. Mặc định là random
carrier Chỉ định nhà mạng nào để fake SIM, VD: Viettel, Xem các nhà mạng hỗ trợ. Tham số này chỉ có ý nghĩa khi bạn chỉ định country. Mặc định là random, bạn có thể tự thêm hoặc tùy chỉnh lại các nhà mạng.
wifiEnabled Bật tắt wifi sau khi change: true/false, mặc định là true (bật)
wipeGoogle Wipe data các package của google: true/false, mặc định là true
resetGoogle Wipe source của chplay và google service: true/false, mặc định là true, nếu là true, các app google sẽ đc reset về tại thời điểm cài ROM, update sẽ bị mất (CHPlay, GSF)
changeSim Fake thông tin SIM: true/false, mặc định là true
changeSdk Fake số SDK đúng theo phiên bản Android, chú ý có thể gây lỗi một số app: true/false, mặc định là false
changeSerial Fake số serial của máy: true/false, mặc định là false
changeLocation Fake GEO: true/false, mặc định là true
changeMacAddr Fake wifi mac: true/false, mặc định là true
changeBluetoothMacAddr Fake bluetooth mac: true/false, mặc định là true
changeTimezone Fake timezone: true/false, mặc định là true
customPackages Mảng các app tùy chỉnh để wipe trong khi change, VD: ["com.bip.device", "com.chay.khetlet"], Mặc định là mảng rỗng []
uninstallPackages Gỡ các app từ tùy chọn customPackages ở trên: true/false, mặc định là false
hideAdb Ẩn ADB: true/false, mặc định là false
factoryReset Factory reset máy: true/false, mặc định là false, xóa sạch app những vẫn giữ lại một số setting hệ thống (như wifi)
factoryResetByFormat true hoặc false. Wipe sạch luôn data, app và các setting đều bị reset, chỉ có ý nghĩa khi factoryReset set là true
apkDir Thư mục chứa file APK để install sau khi change.
override Hàm ChangeInfo sẽ tạo ra một tập các thông số để giả mạo một cách ngẫu nhiên hoặc theo chỉ định như brand, model... Bạn hoàn toàn có thể thay đổi một toàn bộ các thuộc tính mà ChangeInfo sẽ sử dụng, chi tiết dưới phần ví dụ
Ví dụ
(async function(){
    // Change random với các tham số mặc định
    await ChangeInfo ();

    // Change random ngoại trừ mac dùng thông số thật của máy
    await ChangeInfo ({
        changeMacAddr: false
    });

    // Change random nhưng fake model là Asus Zenfone Max Pro
    await ChangeInfo ({
        brand: "asus",
        model: "ASUS_X00TD"
    });

    // Change random nhưng fake model là Asus Zenfone Max Pro, mạng là Viettel - Việt Nam
    await ChangeInfo ({
        brand: "asus",
        model: "ASUS_X00TD",
        country: "vn",
        carrier: "Viettel"
    });

    // Change random info với model SM-G930F của samsung, wipe dữ liệu app "com.alphalbetlabs.deviceinfo",
    // đồng thời đặt sim code cố định là 45204
    await ChangeInfo ({
        wipeGoogle: true,
        customPackages: ["com.alphalbetlabs.deviceinfo"],
        brand: "samsung",
        model: "SM-G930F",
        override: {
            "network_numeric": "45204",
        }
    });
})();
Chú ý về override

Tùy chọn này tương đối phức tạp, nếu chỉ thay đổi một vài thông số cơ bản bạn có thể cứ thử, tuy nhiên các thông số khác đòi hỏi bạn cần có sự am hiểu nhất định nếu không có thể dẫn đến lỗi thiết bị. Việc sử dụng override trong option của hàm ChangeInfo giúp bạn thay đổi một vài thông số, hoặc tự xây dựng một tập các thiết bị để thay đổi toàn bộ các thông số cần thiết thay vì chỉ sử dụng các thiết bị được tích hợp sẵn trong Bịp Device. Các thông số mà bạn có thể override được liệt kê trong ví dụ dưới đây, bạn có thể dùng hoặc bỏ bất cứ thông số nào, ko bắt buộc phải chỉ định toàn bộ:

(async function(){
    await ChangeInfo ({
        wipe: true,
        customPackages: ["com.alphalbetlabs.deviceinfo"],
        override: {
            "network_numeric": "45204",

            "phone_number": "+1345412823985",
            "imsi": "346140278188672",
            "iccid": "891345017533893431878",
            "network_name": "LIME / Cable & Wirel.",
            "network_country": "ky",
            "meid": "9960206616805",
            "ssid": "Tên wifi",
            "android_id": "7e1b980c4823907b",
            "imei0": "996020661680524",
            "serial_number": "1fb7d51258a7afba",
            "description": "b2qsqw-user 11 RP1A.200720.012 F711USQU1AUG7 release-keys",
            "bootloader": "F711USQU1AUG7",
            "model": "SM-F711U",
            "manufacturer": "samsung",
            "brand": "samsung",
            "hardware": "qualcommsm8350",
            "baseband": "F711USQU1AUG7",
            "platform": "sm8350",
            "incremental": "F711USQU1AUG7",
            "product": "b2qsqw",
            "board": "sm8350",
            "code": "b2q",
            "date": "Thu Sep 24 13:47:30 UTC 2020",
            "date_utc": "1600955250",
            "display_id": "RP1A.200720.012.F711USQU1AUG7",
            "fingerprint": "samsung/b2qsqw/b2q:11/RP1A.200720.012/F711USQU1AUG7:user/release-keys",
            "build_id": "RP1A.200720.012",
            "release": "11", //phien ban android
            "security_patch": "2021-07-01",
            "build_flavor": "b2qsqw-user",
            "build_host": "SWDH86226",
            "gl_vendor": "",
            "gl_renderer": "",
            "timezone": "America/Cayman",
            "bssid": "cc:3a:61:d9:b2:0f",
            "latitude": "19.1840308727647",
            "longitude": "-80.213754421596",
            "mac_address": "10:5f:06:2e:42:68",
            "bluetooth_mac_addr": "51:f6:6b:e4:21:a6"
        }
    });
})();
Tip

Có vô số cách thiết lập tham số option để sử dụng hàm ChangeInfo, bạn có thể tự thử theo nhiều cách khác nhau để đạt được yêu cầu của mình.

ChangeSIMInfo#

Thay đổi thông tin sim cho thiết bị, tham số truyền vào là một object với chi tiết mô tả bên dưới

Cú pháp
await ChangeSIMInfo (info);
Chi tiết: Các thuộc tính của {info}
Tham số Mô tả
country Country iso code
carrier Tên nhà mạng
timezone Timezone id
netnum Mã nhà mạng
phone Số điện thoại
iccid iccid
imsi imsi
Ví dụ
(async function(){
    await ChangeSIMInfo ({
        country: "VN",
        carrier: "Viettel",
        timezone: "Asia/Ho_Chi_Minh",
        phone: "+84986993366",
        netnum: "45204",
        iccid: "8984015221935449600",
        imsi: "452046630912464"
    });
})();

CreateBackup#

Tạo file backup dữ liệu của bạn. Mặc định backup sẽ luôn có các package của Google, ngoài ra bạn có thể chỉ định thêm các package (app) tùy chỉnh. File backup được tạo ra có đuôi mở rộng là .bip

Cú pháp
await CreateBackup (option);
Chi tiết: Các thuộc tính của {option}
Tham số Mô tả
customPackages Mảng các app tùy chỉnh sẽ được backup.
fileName Tên file backup. Mặc định là data-{device}-{gmail}-{timestamp}.bip, b có thể đặt một số biến sau vào fileName, tool sẽ tự thay thế giá trị tương ứng. Các biến khả dụng: {TIME}, {ACCOUNT}, {DEVICE}
note Ghi chú cho file backup
excludes Mảng các mẫu để loại trừ khỏi phải backup, hữu ích khi bạn muốn loại bỏ một số dữ liệu để làm giảm dung lượng file back up.
extraInfo Lưu thêm bất cứ thông tin bổ sung nào bạn cần vào file backup, bạn có thể đọc lại các thông tin này bằng hàm GetbackupInfo
useExtSDCard Lưu file backup ra thẻ nhớ ngoài của điện thoại. true hoặc false
pullTo Pull file backup về thư mục chỉ định sau khi hoàn thành.
delAfterPull Xóa file backup khỏi thiết bị sau khi pull.
changeOption Nếu bạn muốn change luôn sau khi backup, truyền option này vào như tham số trong hàm ChangeInfo.

Kết quả trả về: Tên file backup, VD: /sdcard/[email protected]

Ví dụ
(async function(){
    //Tạo file backup mặc định, lưu trên /sdcard
    await CreateBackup();

    //Tạo file backup với 2 custom package
    await CreateBackup({
        customPackages: ["com.bip.device", "com.chay.khetlet"]
    });

    //Tạo file backup với 2 custom package, loại bỏ 1 số cache
    await CreateBackup({
        customPackages: ["com.bip.device", "com.chay.khetlet"],
        excludes: ["cache/*", "data/system/usagestats/*"],
    });

    //Tạo file backup với 2 custom package sau đó lưu về ổ D:\\MyBackup
    await CreateBackup({
        customPackages: ["com.bip.device", "com.chay.khetlet"],
        excludes: ["cache/*", "data/system/usagestats/*"],
        pullTo: "D:\\MyBackup",
        delAfterPull: true
    });

    //Tạo file backup với 2 custom package sau đó lưu về ổ D:\\MyBackup với tên file tùy chỉnh
    await CreateBackup({
        fileName: "{DEVICE}-backup-{ACCOUNT}-{TIME}.bip", //ví dụ: [email protected]_21.20.45.bip
        customPackages: ["com.bip.device", "com.chay.khetlet"],
        excludes: ["cache/*", "data/system/usagestats/*"],
        pullTo: "D:\\MyBackup",
        delAfterPull: true
    });

    //Tạo file backup với 2 custom package sau đó lưu về ổ D:\\MyBackup với 1 số thông tin bổ sung
    await CreateBackup({
        customPackages: ["com.bip.device", "com.chay.khetlet"],
        excludes: ["cache/*", "data/system/usagestats/*"],
        pullTo: "D:\\MyBackup",
        delAfterPull: true,
        extraInfo: {
            "cai-gi-cung-dc": "Tề thiên đại thánh đã ở đây",
            "nguoi-tao-file": "Đã tiêm covid"
        }
    });

    //Tạo file backup với 2 custom package sau đó lưu về ổ D:\\MyBackup và change info máy luôn.
    await CreateBackup({
        customPackages: ["com.bip.device", "com.chay.khetlet"],
        excludes: ["cache/*", "data/system/usagestats/*"],
        pullTo: "D:\\MyBackup",
        delAfterPull: true,
        changeOption: {
            wipeGoogle: true,
            customPackages: ["com.alphalbetlabs.deviceinfo"],
            brand: "samsung",
            model: "SM-G930F",
            override: {
                "network_numeric": "45204"
            }
        }
    });
})();

RestoreData#

Khôi phục lại dữ liệu từ file backup tạo bởi hàm CreateBackup.

Cú pháp
await RestoreData (option);
Chi tiết: Các thuộc tính của {option}
Tham số Mô tả
file Đường dẫn đến file backup, có thể là đường dẫn trên máy tính hoặc trên điện thoại.
isOnExtSdCard Chỉ dẫn cho tool biết nếu file này được lưu trên thẻ nhớ của điện thoại. true hoặc false
delBackup Xóa file backup khỏi thiết bị sau khi hoàn thành, mặc định là false.
Ví dụ
(async function(){
    //Restore từ file backup đã có sẵn trên thiết bị
    await RestoreData({
        file: "/sdcard/[email protected]",
        delBackup: true,
    });

    //Restore từ file backup từ máy tính
    await RestoreData({
        file: "D:\\MyBackup\\[email protected]",
        delBackup: true,
    });
})();

CreateROMBackup#

Tạo file backup toàn bộ ROM.

Cú pháp
await CreateROMBackup (option);
Chi tiết: Các thuộc tính của {option}
Tham số Mô tả
fileName Tên file backup. Mặc định là ROM-{device}-{gmail}-{timestamp}.bip, b có thể đặt một số biến sau vào fileName, tool sẽ tự thay thế giá trị tương ứng. Các biến khả dụng: {TIME}, {ACCOUNT}, {DEVICE}
note Ghi chú cho file backup
partitions Các phân vùng bạn có thể chọn: S: system, D: data, C: cache, R: recovery, B: boot
extraInfo Lưu thêm bất cứ thông tin bổ sung nào bạn cần vào file backup, bạn có thể đọc lại các thông tin này bằng hàm GetbackupInfo
useExtSDCard Lưu file backup ra thẻ nhớ ngoài của điện thoại. true hoặc false
pullTo Pull file backup về thư mục chỉ định sau khi hoàn thành.
compress true/false: Có nén dữ liệu hay không.
delAfterPull Xóa file backup khỏi thiết bị sau khi pull.
changeOption Nếu bạn muốn change luôn sau khi backup, truyền option này vào như tham số trong hàm ChangeInfo.

Kết quả trả về: Tên file backup, VD: /sdcard/[email protected]

Ví dụ
(async function(){
    //Tạo file backup mặc định, lưu trên /sdcard
    await CreateROMBackup();

    //Tạo file backup sau đó lưu về ổ D:\\MyBackup
    await CreateROMBackup({
        pullTo: "D:\\MyBackup",
        delAfterPull: true
    });

    //Tạo file backup sau đó lưu về ổ D:\\MyBackup với tên file tùy chỉnh
    await CreateROMBackup({
        fileName: `ROM-${await GetGoogleAccount()}-${Date.now()}.bip`,
        pullTo: "D:\\MyBackup",
        delAfterPull: true
    });

    //Tạo file backup sau đó lưu về ổ D:\\MyBackup với 1 số thông tin bổ sung và nén file backup
    await CreateROMBackup({
        compress: true,
        pullTo: "D:\\MyBackup",
        delAfterPull: true,
        extraInfo: {
            "cai-gi-cung-dc": "Tề thiên đại thánh đã ở đây",
            "nguoi-tao-file": "Sư phụ, đã tiêm covid"
        }
    });

    //Tạo file backup sau đó lưu về ổ D:\\MyBackup với tên file tùy chỉnh, đồng thời change máy luôn
    await CreateROMBackup({
        fileName: "ROM-{DEVICE}-{TIME}.bip", //ví dụ: ROM-starlte-2023-12-11_21.20.45.bip
        pullTo: "D:\\MyBackup",
        delAfterPull: true,
        changeOption: {
            wipeGoogle: true,
            customPackages: ["com.alphalbetlabs.deviceinfo"],
            brand: "samsung",
            model: "SM-G930F",
            override: {
                "network_numeric": "45204"
            }
        }
    });

    //Tạo file backup chỉ cho phân vùng Data, sau đó lưu về ổ D:\\MyBackup với tên file tùy chỉnh, đồng thời change máy luôn
    await CreateROMBackup({
        fileName: "ROM-{DEVICE}-{TIME}.bip", //ví dụ: ROM-starlte-2023-12-11_21.20.45.bip
        pullTo: "D:\\MyBackup",
        partitions: "D", //hoặc "SD" backup system và data, "SDCRB" backup all
        delAfterPull: true,
        changeOption: {
            wipeGoogle: true,
            customPackages: ["com.alphalbetlabs.deviceinfo"],
            brand: "samsung",
            model: "SM-G930F",
            override: {
                "network_numeric": "45204"
            }
        }
    });
})();

RestoreROM#

Khôi phục lại dữ liệu từ file backup tạo bởi hàm CreateROMBackup.

Cú pháp
await RestoreROM (option);
Chi tiết: Các thuộc tính của {option}
Tham số Mô tả
file Đường dẫn đến file backup, có thể là đường dẫn trên máy tính hoặc trên điện thoại.
isOnExtSdCard Chỉ dẫn cho tool biết nếu file này được lưu trên thẻ nhớ của điện thoại. true hoặc false
delBackup Xóa file backup khỏi thiết bị sau khi hoàn thành, mặc định là false.
Ví dụ
(async function(){
    //Restore từ file backup đã có sẵn trên thiết bị
    await RestoreROM({
        file: "/sdcard/[email protected]",
        delBackup: true,
    });

    //Restore từ file backup từ máy tính
    await RestoreROM({
        file: "D:\\MyBackup\\[email protected]",
        delBackup: true,
    });
})();

WipeApps#

Xóa dữ liệu của một hoặc nhiều app

Cú pháp
await WipeApps (apps);
Chi tiết: Các thuộc tính của {option}
Tham số Mô tả
apps Mảng các package
Ví dụ
1
2
3
(async function(){
    await WipeApps(["com.vlxx.shocks", "com.android.dialer"]);
})();

Log#

Hiện thông tin lên vùng logs của Studio hoặc trên cột status của thiết bị đang chạy script

Ví dụ
(async function(){
    Log("Hello Bip Device");
    Log("Hello", [1,2,3], {"Bip": "Device"});
    Log((await ExecShell("ls /sdcard"))?.result.trim());

    // 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
})();

Delay#

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

Cú pháp
await Delay(ms);
Chi tiết
Tham số Mô tả
ms Thời gian delay
Ví dụ
1
2
3
4
(async function(){
    await Delay(3000);
    Log("Chúc mừng bạn vừa phí 3s cuộc đời!");
})();

IsStopRequest#

Nếu script của bạn quá phức tạp, bạn nên cân nhắc đặt hàm này tại các vị trí phù hợp, mục đích để script của bạn có thể dừng một cách mượt hơn khi người dùng bấm nút Stop.

Ví dụ
(async function(){
    //.... rất là nhiều dòng code

    while(true) { //một vòng lặp vô tận
        if(IsStopRequest()) break;// Nếu có bấm nút stop script sẽ break khỏi vòng lặp trước khi chạy một tác vụ nặng
        await MotFunctionRatNangVaLau();
        await Delay(3000);
    }

    //.... rất là nhiều dòng code
})();

GetUserInput#

Hiện một bảng yêu cầu dữ liệu text từ người dùng

Cú pháp
await GetUserInput (title, description);
Chi tiết
Tham số Mô tả
title Tiêu đề bảng input
description Mô tả
Ví dụ
1
2
3
4
5
6
(async function(){
    const arg1 = await GetUserInput();
    Log(arg1);
    const arg2 = await GetUserInput("Nhập list mail", "Mỗi mail một dòng");
    Log(arg2);
})();

GetCurrentInfo#

Hiện thị các thông tin cơ bản hiện tại của thiết bị.

Cú pháp
await GetCurrentInfo ();
Ví dụ
(async function(){
    const info = await GetCurrentInfo();
    Log(info);
    /*{
        "real_serial": "29f1c10f09047ece",
        "fake_serial": "6cd32a2c",
        "android_id": "188681b0ded2cb7f",
        "imei": "987753800344237",
        "meid": "9877538003442",
        "hardware_serial": "09a4df905fe17022",
        "wifi_bssid": "fc:db:b3:18:23:16",
        "wifi_mac_addr": "98:f1:70:45:0b:b1",
        "bluetooth_mac_addr": "b0:72:bf:0d:f9:bf",
        "timezone": "Asia/Singapore",
        "wifi_ssid": "martin",
        "model": "SM-F721B",
        "brand": "samsung",
        "latitude": "2.1903635364332485",
        "longitude": "104.35435080337665",
        "phone_number": "+656601453260",
        "imsi": "525050919572715",
        "network_country": "sg",
        "network_numeric": "52505",
        "network_name": "Starhub"
    }*/
})();

GetBackupInfo#

Hiện thị các thông tin của file backup.

Cú pháp
await GetBackupInfo (file);
Chi tiết
Tham số Mô tả
file Đường dẫn đến file backup, có thể là đường dẫn trên máy tính hoặc trên điện thoại.
Ví dụ
(async function(){
    const info = await GetBackupInfo("/sdcard/[email protected]");
    // const info = await GetBackupInfo("D:\\MyBackup\\[email protected]");
    Log(info);
    /*{
        "googleAccount": "",
        "extraInfo": {
            "cai-gi-cung-dc": "Tề thiên đại thánh đã ở đây",
            "nguoi-tao-file": "Đã tiêm covid"
        },
        "android_id": "188681b0ded2cb7f",
        "imei": "987753800344237",
        "meid": "9877538003442",
        "hardware_serial": "09a4df905fe17022",
        "wifi_bssid": "fc:db:b3:18:23:16",
        "wifi_mac_addr": "98:f1:70:45:0b:b1",
        "bluetooth_mac_addr": "b0:72:bf:0d:f9:bf",
        "timezone": "Asia/Singapore",
        "wifi_ssid": "martin",
        "model": "SM-F721B",
        "brand": "samsung",
        "latitude": "2.1903635364332485",
        "longitude": "104.35435080337665",
        "phone_number": "+656601453260",
        "imsi": "525050919572715",
        "network_country": "sg",
        "network_numeric": "52505",
        "network_name": "Starhub"
    }*/
})();

SendKeyEvent#

Gửi key event đến thiết bị

Cú pháp
await SendKeyEvent ("key_code");
Chi tiết
Tham số Mô tả
key_code Xem list keys.
Ví dụ
1
2
3
4
(async function(){
    await SendKeyEvent("KEYCODE_HOME");
    // await SendKeyEvent(3);
})();

Swipe#

Vuốt

Cú pháp
await Swipe (x1, y1, x2, y2, dur);
Chi tiết
Tham số Mô tả
x1 Tọa độ x điểm bắt đầu
y1 Tọa độ y điểm bắt đầu
x2 Tọa độ x điểm kết thúc
y2 Tọa độ y điểm kết thúc
dur Thời gian vuốt tính bằng mili giây, càng lớn vuốt càng chậm, mặc định 50
Ví dụ
1
2
3
(async function(){
    await Swipe(500, 1500, 500, 100);
})();

SendText#

Gõ văn bản,

Cú pháp
await SendText (text, delayStart, delayEnd);
Chi tiết
Tham số Mô tả
text Văn bản cần gõ
delayStart Delay start (miliseconds)
delayEnd Delay end (miliseconds)
Ví dụ
1
2
3
4
(async function(){
    await SendText("Hello Bip Device");
    await SendText("Hello Bip Device", 50, 100); //gõ chậm lại chút
})();

SetClipboardText#

Set văn bản vào clipboard của điện thoại.

Cú pháp
await SetClipboardText (text);
Chi tiết
Tham số Mô tả
text Văn bản cần đặt
Ví dụ
1
2
3
(async function(){
    await SetClipboardText("Hê lô Bịp Đì vai!");
})();

GetClipboardText#

Get văn bản từ clipboard của điện thoại.

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

PasteText#

Paste văn bản, hỗ trợ ký tự unicode.

Cú pháp
await PasteText (text);
Chi tiết
Tham số Mô tả
text Văn bản cần dán
Ví dụ
1
2
3
(async function(){
    await PasteText("Hê lô Bịp Đì vai!");
})();

GetUIDump#

Chạy adb shell uiautomator dump và trả về kết quả

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

GetColorByPoints#

Trả về giá trị màu RGBA hiện tại trên màn hình của các tọa độ chỉ định. Hoặc bạn có thể sử dụng công cụ lấy mã màu tiện lợi hơn.

Cú pháp
await GetColorByPoints (p1, p2, ..., pn);
Chi tiết
Tham số Mô tả
p1 Tọa độ 1
pn Tọa độ n

Kết quả trả về: Mảng các tọa độ kèm màu sắc của tọa độ tương ứng

Ví dụ
(async function(){
    const colors = await GetColorByPoints({x: 100, y: 100}, {x: 200, y: 500});
    Log(colors);
    /*
    [
        {
            "x": 100,
            "y": 100,
            "r": 8,
            "g": 7,
            "b": 7,
            "a": 255
        },
        {
            "x": 200,
            "y": 500,
            "r": 182,
            "g": 17,
            "b": 13,
            "a": 255
        }
    ]
    */
})();

CheckColorConds#

Hàm này được xây dựng dựa trên hàm GetColorByPoints, kiểm tra trạng thái màu sắc các tọa độ trên màn hình. Bạn có thể sử dụng công cụ lấy mã màu nếu cần thiết.

Cú pháp
await CheckColorConds (type, c1, c2, ..., cn);
Chi tiết
Tham số Mô tả
type Kiểu thỏa mãn: all hoặc any
c1 Tọa độ kèm màu điểm thứ nhất
cn Tọa độ kèm màu điểm thứ n

Kết quả trả về: true/false tùy theo kết quả kiểm màu

Ví dụ
(async function(){
    //Tọa độ 10x10 phải có màu 11.21.32 VÀ 15x15 phải có màu 10.20.30
    const isMatched1 = await CheckColorConds("all", {x: 10, y: 10, r: 11, g: 21, b: 32}, {x: 15, y: 15, r:10, g:20, b:30});

    //Tọa độ 10x10 phải có màu 11.21.32 HOẶC 15x15 phải có màu 10.20.30
    const isMatched2 = await CheckColorConds("any", {x: 10, y: 10, r: 11, g: 21, b: 32}, {x: 15, y: 15, r:10, g:20, b:30});

    //Tọa độ 10x10 phải có màu 11.21.32 VÀ 15x15 KHÔNG phải màu 10.20.30 (có diff = true trong tham số)
    const isMatched3 = await CheckColorConds("all", {x: 10, y: 10, r: 11, g: 21, b: 32}, {diff: true, x: 15, y: 15, r:10, g:20, b:30});

    //Tọa độ 10x10 phải có màu 11.21.32 HOẶC 15x15 KHÔNG phải màu 10.20.30
    const isMatched4 = await CheckColorConds("any", {x: 10, y: 10, r: 11, g: 21, b: 32}, {diff: true, x: 15, y: 15, r:10, g:20, b:30});
})();

ScreenCap#

Chụp ảnh toàn bộ hoặc một phần màn hình. Nếu muốn chụp một phần, bạn có thể sử dụng công cụ này để lấy tọa độ.

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

Coordinates

Trả về dữ liệu ảnh dạng base64 hoặc chuỗi rỗng nếu thất bại.

Ví dụ
(async function(){
    //Chụp toàn màn hình
    const cap1 = await ScreenCap();

    //Chụp toàn màn hình với chất lượng 10%
    const cap2 = await ScreenCap(null, null, null, null, 0.1);

    //Chụp 1 phần màn hình với chất lượng 10%
    const cap3 = await ScreenCap(191, 1044, 1245, 1691, 0.1);
})();

SubImageSearch#

Tìm kiếm tọa độ mẫu ảnh trên màn hình, mẫu có thể tìm thấy ở một hoặc nhiều vị trí khác nhau trên màn hình. Bạn có thể công cụ cắt ảnh để lấy các mẫu ảnh từ màn hình điện thoại.

Cú pháp
await SubImageSearch (option);
Chi tiết tham số option
Tham số Mô tả
subImage Đường dẫn đến file ảnh con trên máy tính
crop Giới hạn vùng tìm kiễm mẫu subImage, nếu không chỉ định sẽ tìm toàn màn hình. Nếu có thể khoanh vùng tìm kiếm subImage sẽ tốt hơn do không phải tìm toàn màn hình, đỡ nhọc CPU.
all Trả về toàn bộ kết quả tìm thấy hay chỉ kết quả đầu tiên. Giá trị true/false, mặc định là false. Nếu không cần thiết phải tìm toàn bộ, hãy đặt là false để tool dừng tìm ngay khi thấy kết quả đầu tiên, đỡ nhọc CPU.

Kết quả trả về: Mảng các tọa độ tìm thấy, mảng rỗng nếu không tìm thấy

Ví dụ

Trong ví dụ minh họa dưới đây, chung ta sẽ tìm kiếm vị trí của mẫu ảnh CHPlay. SubImageSearch

(async function(){
    //Tìm tọa độ đầu tiên xuất hiện mẫu ảnh chplay.png trên màn hình
    const coors1 = await SubImageSearch({
        subImage: "D:\\bip-imgs\\chplay.png"
    });
    //KQ: [ [949, 1917, 1034, 1996] ] => [x1, y1, x2, y2] tọa độ góc trên bên trái và góc dưới bên phải của mẫu ảnh.

    //Tìm tất cả tọa độ xuất hiện mẫu ảnh chplay.png trên màn hình
    const coors2 = await SubImageSearch({
        subImage: "D:\\bip-imgs\\chplay.png",
        all: true
    });
    //KQ: [ [949, 1917, 1034, 1996], [1221, 1917, 1306, 1996] ]

    //Tìm tất cả tọa độ xuất hiện mẫu ảnh chplay.png xuất hiện trong khu vực ô vuông màu trắng trong hình minh họa phía trên
    //(Giả sử tôi biết chắc mẫu ảnh chỉ xuất hiện trong khu vực đó).
    const coors3 = await SubImageSearch({
        subImage: "D:\\bip-imgs\\chplay.png",
        crop: [940, 1908, 1052, 2024], //tọa độ góc top-left và right-bottom của khu vực đc khoanh vùng.
        all: true
    });
    //KQ: [ [949, 1917, 1034, 1996], [1221, 1917, 1306, 1996] ]
})();

GetFirstElementBySelector#

So với các hàm xử lý màu, hàm xử lý với selector tương đối nặng do phải chạy uidump, một số activity nặng của app như livestream của tiktok có thể sẽ ko thể chạy được do uidump bị lỗi. Hàm này cũng yêu cầu bạn có chút ít skill. Mục đích chính của hàm này để check xem một phần tử, đoạn text... có đang hiển thị trên màn hình hay không, ngoài ra có thể lấy tọa độ của qua thuộc tính bounds của phần tử đó để có thể tap (click)

Cú pháp
await GetFirstElementBySelector (selector, useLastDump = false);
Chi tiết
Tham số Mô tả
selector CSS selector
useLastDump Nếu element bạn cần chọn có thể dùng lại bản uidump đc tạo bởi lệnh get gần nhất trước đó, bạn có thể set tham số này là true, sẽ nhanh và nhẹ hơn

Kết quả trả về: Một DOM node hoặc null

Ví dụ

Sử dụng UIAutomator sẽ giúp bạn xác định được phần tử cần nhắm được dễ dàng hơn.

"UIAutomator"

Như ảnh minh họa phía trên, chúng ta có thể viết selector nhắm tới nút bàn phím màu đỏ của app gọi điện như sau

(async function(){
    const theKeypad = await GetFirstElementBySelector(`[resource-id="com.android.dialer:id/fab"]`);
    // const theKeypad = await GetFirstElementBySelector(`[bounds="[118,2343][1384,2539]"]`);
    // const theKeypad = await GetFirstElementBySelector(`[content-desc="key pad"][package="com.android.dialer"]`);
    // Hãy tìm hiều thêm về css selector để nâng cao kỹ năng
    Log(theKeypad.getAttribute("content-desc")); //In ra thuộc tính content-desc của node.
    //key pad 

    //Giả sử bạn cần lấy thông tin nút Recents như ảnh bên dưới
    //Do ta vừa get theKeypad ở trên và màn hình ko có biến động gì, nên bạn có thể set useLastDump=true
    //để tránh call lại uidump 1 lần nữa vừa nặng vừa ko cần thiết
    const recentLogs = await GetFirstElementBySelector(`[resource-id="com.android.dialer:id/call_log_tab"]`, true);

})();

"UIAutomator"

GetAllElementsBySelector#

Hàm này tương tự như hàm GetFirstElementBySelector, nhưng trả về tất cả các nodes (array) mà selector thỏa mãn.

BulkGetElements#

Để tránh phải gọi nhiều lần hàm GetFirstElementBySelector, bạn có thể dùng hàm này để get nhiều element cùng lúc cho các selector khác nhau.

Cú pháp
await BulkGetElements (selectors, useLastDump = false);
Chi tiết
Tham số Mô tả
selectors Một object chứa các selector
useLastDump Nếu có thể dùng lại bản uidump gần nhất hãy set tham số này là true, sẽ nhanh và nhẹ hơn
Ví dụ

Lấy lại hình ảnh minh họa ở trên "UIAutomator"

(async function(){
    const elms = await BulkGetElements({
        "bang-quay-so": `[resource-id="com.android.dialer:id/fab"]`,
        "lich-su-call": `[resource-id="com.android.dialer:id/call_log_tab"]`,
        "ko-ton-tai": `[resource-id="element-nay-ko-ton-tai"]`,
    });

    Log(elms["bang-quay-so"].getAttribute("content-desc")); //=> log ra "key pad"
    //elms["ko-ton-tai"] == null
})();

TapByCoordinates#

Tap (click) vào màn hình theo tọa độ.

Cú pháp
await TapByCoordinates (x1, y1, x2, y2);
Chi tiết
Tham số Mô tả
x1 Tọa độ x góc trên bên trái vùng click
y1 Tọa độ y góc trên bên trái vùng click
x2 Tọa độ x góc dưới bên phải vùng click
y2 Tọa độ y góc dưới bên phải vùng click

Coordinates

Ví dụ
1
2
3
4
5
6
7
(async function(){
    // Click random trong vùng tọa độ 100, 150, 300, 500.
    await TapByCoordinates(100, 150, 300, 500);

    // Click chính xác tọa độ 150, 250
    await TapByCoordinates(150, 250);
})();

TapElement#

Click vào một element dựa trên thuộc tính bounds của nó, element được lấy từ GetFirstElementBySelector hoặc GetAllElementsBySelector.

Cú pháp
await TapElement (element);
Chi tiết
Tham số Mô tả
element Một XML node
Ví dụ
1
2
3
4
5
6
7
8
9
(async function(){
    //Mở app quay số
    await OpenApp("com.android.dialer");
    await Delay(1000);

    //Click nút mở bàn phím
    const theKeypad = await GetFirstElementBySelector(`[resource-id="com.android.dialer:id/fab"]`);
    await TapElement(theKeypad);
})();

TapBySelector#

Get element theo selector truyền vào rồi click vào element đó (bản chất lại úp mặt vào hàm TapElement).

Cú pháp
await TapBySelector (selector, useLastDump);
Chi tiết
Tham số Mô tả
selector CSS selector
useLastDump Nếu element bạn cần chọn có thể dùng lại bản uidump gần nhất có thể set tham số này là true, sẽ nhanh và nhẹ hơn
Ví dụ
1
2
3
4
5
6
7
8
(async function(){
    //Mở app quay số
    await OpenApp("com.android.dialer");
    await Delay(1000);

    //Click nút mở bàn phím
    await TapBySelector(`[resource-id="com.android.dialer:id/fab"]`);
})();

TapMulti#

Tap nhiều tọa độ liên tiếp theo tập các tọa độ.

Cú pháp
await TapMulti (points);
Chi tiết
Tham số Mô tả
points Mảng các tọa độ, xem ví dụ
Ví dụ
1
2
3
4
5
6
7
8
(async function(){
    //tap liên tiếp 3 điểm trên màn hình, mỗi lần tap delay 50 mili giây.
    await TapMulti([
        {x: 100, y: 100, delay: 50},
        {x: 120, y: 130, delay: 50},
        {x: 120, y: 150, delay: 0} //lượt tap cuối k cần delay
    ]);
})();

TapByImage#

Xây dựng dựa trên SubImageSearch, Click vào vùng tọa độ xuất hiện mẫu ảnh.

Cú pháp
await TapByImage (imagePath, index, crop);
Chi tiết
Tham số Mô tả
imagePath Đường dẫn file ảnh con trên máy tính
index Chỉ định kết quả cần click nếu mẫu ảnh xuất hiện nhiều hơn một vị trí, bắt đầu từ 0, hoặc bạn có thể đặt rand để click ngẫu nhiên. Mặc định là 0
crop Khoanh vùng tìm kiếm vị trí ảnh mẫu. Xem thêm mô tả của hàm SubImageSearch
Ví dụ

Giả sử chúng ta sẽ thao tác trên hình minh họa của hàm SubImageSearch SubImageSearch

(async function(){
    //Click tọa độ mẫu chplay.png đầu tiên
    await TapByImage("D:\\bip-imgs\\chplay.png");
    // await TapByImage("D:\\bip-imgs\\chplay.png", 0);

    //Click tọa độ mẫu chplay.png thứ 2
    await TapByImage("D:\\bip-imgs\\chplay.png", 1);

    //Click ngẫu nhiên 1 trong 2 vị trí app CHPlay
    await TapByImage("D:\\bip-imgs\\chplay.png", "rand");

    //Click ngẫu nhiên 1 trong 2 vị trí app CHPlay trong khu vực chỉ định
    await TapByImage("D:\\bip-imgs\\chplay.png", "rand", [940, 1908, 1052, 2024]);
})();

ORCArea#

Hàm này sẽ cố gắng chụp một phần màn hình và xử lý phần ảnh đó để phân tích ra text nếu có thể. Hiện ORC chỉ hỗ trợ bảng chữ cái và số cơ bản, font chữ rõ ràng.

Cú pháp
await ORCArea(x1, y1, x2, y2);
Chi tiết
Tham số Mô tả
x1 Tọa độ x góc trên bên trái vùng cần chọn
y1 Tọa độ y góc trên bên trái vùng cần chọn
x2 Tọa độ x góc dưới bên phải vùng cần chọn
y2 Tọa độ y góc dưới bên phải vùng cần chọn

Coordinates

Ví dụ

Ví dụ dưới đây chúng ta sẽ ORC ở vùng tọa độ khoanh đỏ (0x1443 và 1440x1575). Bạn có thể sử dụng công cụ lấy tọa độ để xác định vị trí cần ORC.

"UIAutomator"

1
2
3
4
5
(async function(){
    const text = await ORCArea(0, 1443, 1440, 1575);
    Log(text);
    // => No one is on your speed dial yet
})();

HttpRequest#

Thực thi một HTTP request.

Cú pháp
await HttpRequest(url, data, 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)
headers Thêm extra header vào request (tùy chọn)

Kết quả trả về: object hoặc null nếu có lỗi xảy ra

Ví dụ
(async function(){
    const res = await HttpRequest("http://icanhazip.com");
    Log(res);
    /*{
        "status": 200,
        "headers": {
            "date": "Tue, 31 Oct 2023 12:05:33 GMT",
            "content-type": "text/plain",
            "content-length": "16",
            "connection": "close",
            "access-control-allow-origin": "*",
            "access-control-allow-methods": "GET",
            "set-cookie": [
                "__cf_bm=251B8hrwFFFRPb_Qkr_uBipLzSnyF7AkdwT_oFvQDeE-1698753933-0-AVX9/SUfVcfc6IIKA/7zrvO2QNHpuBijSAIScLZqunggCOfbHnaAeOKOedQ7GOMgMDsTppNdxi+z4l63LpbMJVg=; path=/; expires=Tue, 31-Oct-23 12:35:33 GMT; domain=.icanhazip.com; HttpOnly"
            ],
            "server": "cloudflare",
            "cf-ray": "81ebc45529968b6f-HKG",
            "alt-svc": "h3=\":443\"; ma=86400"
        },
        "body": "171.222.111.228\n"
    }*/

    //post data thông thường (application/x-www-form-urlencoded)
    const res = await HttpRequest("http://login.vl/account.php", {
        "username": "bip",
        "password": "abc123",
    });

    //post json hoặc raw data (truyền tham sô data là string thay vì object)
    const res = await HttpRequest("http://login.vl/json.php", JSON.stringify({
        "username": "bip",
        "password": "abc123",
    }), {
        "Content-Type": "application/json",
    }) ;
})();

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"
    });
})();

StartProcess#

Start một process trên máy tính và trả về kết quả

Cú pháp
await StartProcess(path, args);
Chi tiết
Tham số Mô tả
path Đường dẫn đến file thực thi
args Mạng các tham số

Kết quả trả về: null hoặc object

Ví dụ
1
2
3
4
5
6
7
8
(async function(){
    const result = await StartProcess("cmd", ["/C", "echo bip-device"]);
    Log(result);
    /*{
        "stdout": "bip-device\r\n",
        "stderr": ""
    }*/
})();

GetUserPackages#

Get các app cài bởi người dùng.

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

InstallApk#

Cài đặt app từ file apk

Cú pháp
await InstallApk(apkFile);
Chi tiết
Tham số Mô tả
apkFile Đường dẫn đến file apk trên máy tính
Ví dụ
1
2
3
(async function(){
    await InstallApk("D:\\pornhub.apk");
})();

UninstallApp#

Gỡ cài đặt app

Cú pháp
await UninstallApp(package);
Chi tiết
Tham số Mô tả
package Tên package cần gỡ
Ví dụ
1
2
3
(async function(){
    await UninstallApp("com.alphabetlabs.deviceinfo");
})();

AirplaneModeEnable#

AirplaneModeDisable#

Bật / tắt Airplane mode

Ví dụ
1
2
3
4
(async function(){
    await AirplaneModeEnable();
    await AirplaneModeDisable();
})();

MobileDataEnable#

MobileDataDisable#

Bật / tắt mạng 3G/4G...

Ví dụ
1
2
3
4
(async function(){
    await MobileDataEnable();
    await MobileDataDisable();
})();

WifiEnable#

WifiDisable#

Bật / tắt wifi

Ví dụ
1
2
3
4
(async function(){
    await WifiEnable();
    await WifiDisable();
})();

WaitForWifiState#

Chờ wifi cho đến khi có state chỉ định

Cú pháp
await WaitForWifiState(state, timeout);
Chi tiết
Tham số Mô tả
state CONNECTED hoặc DISCONNECTED
timeout tính bằng giây, mặc định là 120s
Ví dụ
1
2
3
4
5
6
7
8
9
(async function(){
    await WifiDisable();
    await WaitForWifiState("DISCONNECTED");
    Log("wifi disconnected");

    await WifiEnable();
    await WaitForWifiState("CONNECTED");
    Log("wifi connected");
})();

WaitForBootCompleted#

Chờ cho đến khi máy khởi động xong hoàn toàn.

Cú pháp
await WaitForBootCompleted();
Ví dụ
1
2
3
4
5
(async function(){
    await ChangeInfo();
    await WaitForBootCompleted();
    Log("Máy đã khởi động xong!");
})();

GetScreenSize#

Trả về screen size

Cú pháp
await GetScreenSize();
Ví dụ
1
2
3
4
5
6
7
(async function(){
    Log(await GetScreenSize());
    /*{
        "width": 1440,
        "height": 2960
    }*/
})();

OpenApp#

CloseApp#

Mở / đóng ứng dụng

Ví dụ
1
2
3
4
5
(async function(){
    await OpenApp("com.android.dialer");
    await Delay(3000);
    await CloseApp("com.android.dialer");
})();

SetProxy#

Set proxy cho thiết bị, lưu ý hàm này chỉ set global setting qua ADB, và chỉ có tác dụng với browser, bạn nên tham khảo các hàm SetHTTPProxySetSocks5Proxy.

Cú pháp
await SetProxy (proxy);
Chi tiết
Tham số Mô tả
proxy proxy server
Ví dụ
1
2
3
(async function(){
    await SetProxy("1.2.3.4:6969");
})();

GetProxy#

Lấy proxy hiện tại đã set bởi SetProxy

Ví dụ
1
2
3
(async function(){
    Log(await GetProxy());
})();

UnsetProxy#

Bỏ set proxy đã set bởi SetProxy

Ví dụ
1
2
3
(async function(){
   await UnsetProxy();
})();

SetSocks5Proxy#

Set socks5 proxy cho thiết bị bằng app SocksDroid

Cú pháp
await SetSocks5Proxy (server, user, pw, fakeRtcIP);
Chi tiết
Tham số Mô tả
server proxy server
user user (tùy chọn)
pw password (tùy chọn)
fakeRtcIP fakeRtcIP (tùy chọn)
Ví dụ
1
2
3
4
(async function(){
    await SetSocks5Proxy("127.0.0.1:1080");
    // await SetSocks5Proxy("127.0.0.1:1080", "", "", "172.32.54.111"); //fake webrtc
})();

SetHTTPProxy#

Set http proxy cho thiết bị bằng app TunProxy

Cú pháp
await SetHTTPProxy (server);
Chi tiết
Tham số Mô tả
server proxy server
Ví dụ
1
2
3
(async function(){
    await SetHTTPProxy("127.0.0.1:1080");
})();

KillAllBipVPN#

Kill tất cả vpn đang chạy bởi SocksDroid hoặc TunProxy

Cú pháp
await KillAllBipVPN ();
Ví dụ
1
2
3
(async function(){
    await KillAllBipVPN();
})();

SetLocation#

Giả mạo tọa độ GPS

Cú pháp
await SetLocation (location);
location là một object với các thuộc tính sau
Tham số Mô tả
provider Một trong các giá trị: gps, network, passive, fused. Mặc định là gps
latitude Vĩ độ
longitude Kinh độ
accuracy Độ chính xác tọa độ (tính bằng mét)
altitude Độ cao (tính bằng mét)
verticalAccuracy Độ chính xác độ cao nêu có (tính bằng mét)
speed Tốc độ di chuyển (tính bằng mét/giây)
speedAccuracy Độ chính xác của speed (tính bằng mét/giây)
bearing Hướng di chuyển, tính bằng độ (0-360)
bearingAccuracy Độ chính xác của bearing

Bất cứ thông số nào không chỉ định, thông số thật sẽ được áp dụng, chỉ định bằng null để xóa bỏ thông số thật.

Ví dụ
(async function(){
    // Fake 3 thông số latitude, longitude và accuracy, các thông số khác đặt theo thông số thật
    await SetLocation({
        latitude: 21.020756,
        longitude: 105.833988,
        accuracy: 10.5
    });

    // Fake 3 thông số latitude, longitude và accuracy, xóa bỏ hết các thông số còn lại
    await SetLocation({
        latitude: 21.020756,
        longitude: 105.833988,
        accuracy: 10.5,
        altitude: null,
        verticalAccuracy: null,
        speed: null,
        bearing: null,
        speedAccuracy: null,
        bearingAccuracy: null,
    });

    // Fake hết các thông số
    await SetLocation({
        provider: "gps",
        latitude: 21.020756,
        longitude: 105.833988,
        accuracy: 10.5,
        altitude: 10,
        verticalAccuracy: 5,
        speed: 10,
        speedAccuracy: 1,
        bearing: 20,
        bearingAccuracy: 1,
    });
})();

MoveByLocations#

Giả lập di chuyển theo chuỗi tọa độ. Xem demo

Cú pháp
await MoveByLocations (locations, delay);
Tham số
Tham số Mô tả
locations Mảng các object location như trên hàm SetLocation
delay Khoảng trễ giữa các lần nhảy tọa độ, tính bằng giây
Ví dụ
(async function(){
    //Di chuyển vòng quanh Hồ Văn Chương: https://maps.app.goo.gl/fRAVBWRBFRk6jTWv8
    //Delay mặc đinh được set là 1s, b có thể tùy chỉnh giữa 2 tọa độ bất kỳ bằng cách thêm tham số delay vào location object
    await MoveByLocations([
        {"provider":"gps","latitude":21.020799,"longitude":105.833976,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.021035,"longitude":105.83407,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.021275,"longitude":105.83411,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.0215,"longitude":105.83407,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},

        //delay lâu hơn chút
        {"delay": 5, "provider":"gps","latitude":21.021711,"longitude":105.834041,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},

        {"provider":"gps","latitude":21.021986,"longitude":105.834019,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.022149,"longitude":105.833834,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.022277,"longitude":105.83352,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.022284,"longitude":105.833276,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.022109,"longitude":105.833,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.021929,"longitude":105.832976,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.021711,"longitude":105.832978,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.021435,"longitude":105.833078,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.021218,"longitude":105.833188,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.021045,"longitude":105.833255,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.020802,"longitude":105.833367,"altitude":0,"speed":10,"accuracy":10,"verticalAccuracy":5},
        {"provider":"gps","latitude":21.020614,"longitude":105.833598,"altitude":0,"speed":0,"accuracy":10,"verticalAccuracy":5}
    ], 1); //delay 1s giữa các lần nhảy
})();

ResetLocation#

Đặt lại vị trí mặc định, (nếu thiết bị có fake GEO khi change thì về tọa độ fake).

Cú pháp
await ResetLocation ();
Ví dụ
1
2
3
(async function(){
    await ResetLocation();
})();

OpenUrl#

Mở một url bằng trình duyệt mặc định trên thiết bị

Cú pháp
await OpenUrl (url);
Chi tiết
Tham số Mô tả
url url cần mở
Ví dụ
1
2
3
(async function(){
    await OpenUrl("https://google.com");
})();

GetGoogleAccount#

Lấy địa chỉ mail của tài khoản google nếu có

Ví dụ
1
2
3
(async function(){
    Log(await GetGoogleAccount());
})();

GetComputerUniqueId#

Trả về mã unique của máy tính đang chạy tool, bạn có thể cần nếu là một coder muốn bán bản quyền script của bạn.

Ví dụ
1
2
3
4
(async function(){
    const uniqueId = GetComputerUniqueId();
    Log(uniqueId)
})();

Hashes#

Các hàm băm lấy mã hash

Ví dụ
(async function(){
    const input = "Rau lang + cu chuoi";
    LogWarn("input:", input);
    Log("MD5:", MD5(input));
    Log("SHA1:", SHA1(input));
    Log("SHA224:", SHA224(input));
    Log("SHA256:", SHA256(input));
    Log("SHA384:", SHA384(input));
    Log("SHA512:", SHA512(input));
    LogSuccess("Xong nồi cám lợn!");
})();

AES#

Mã hóa và giải mã bằng thuật toán aes, mode là aes-128-ecb.

Ví dụ
(async function(){
    const bi_mat_vung_kin = "Khong mot ai biet";
    const pass = "chi_minh_minh_biet";

    const encrypted = EncryptAes(bi_mat_vung_kin, pass);
    const decrypted = DecryptAes(encrypted, pass);

    Log("Cả làng đã biết:", bi_mat_vung_kin);
    Log("Mã hóa:", encrypted);
    Log("Giải mã:", decrypted);
})();

Base64#

Mã hóa và giải mã base64, nếu không tin tool bạn có thể sử dụng btoa hoặc atob cũng được.

Ví dụ
1
2
3
4
5
6
7
(async function(){
    const encrypted = Base64Encode("Hello BIP");
    const decrypted = Base64Decode(encrypted);

    Log("Mã hóa:", encrypted);
    Log("Giải mã:", decrypted);
})();

RandomArray#

Trả về ngẫu nhiên một phần tử từ mảng.

Cú pháp
RandomArray (arr);
Chi tiết
Tham số Mô tả
arr Mảng dữ liệu
Ví dụ
1
2
3
4
5
6
(async function(){
    const arr = ["hoa", "hồng", "có", "lông"];
    Log(RandomArray(arr));
    Log(RandomArray(arr));
    Log(RandomArray(arr));
})();

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
})();

GetCurrentDir#

Trả về thư mục gốc của tool.

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

WriteFile#

Ghi dữ liệu vào file trên máy tính, nếu file đã tồn tại dữ liệu sẽ bị ghi đè.

Cú pháp
WriteFile (file, data);
Chi tiết
Tham số Mô tả
file Đường dẫn file cần lưu
data Dữ liệu ghi
Ví dụ
1
2
3
(async function(){
    WriteFile("D:\\test.txt", "Hello BIP");
})();

AppendFile#

Ghi dữ liệu vào file trên máy tính, nếu file đã tồn tại dữ liệu mới sẽ được ghi nối thêm.

Cú pháp
AppendFile (file, data, newLine);
Chi tiết
Tham số Mô tả
file Đường dẫn file cần ghi
data Dữ liệu ghi
newLine Thêm dòng mới sau khi ghi dữ liệu, giá trị true hoặc false, mặc định là false
Ví dụ
1
2
3
4
(async function(){
    AppendFile("D:\\test.txt", "Hello BIP 1", true);
    AppendFile("D:\\test.txt", "Hello BIP 2");
})();

ReadFile#

Đọc file trên máy tính

Cú pháp
ReadFile (file);
Chi tiết
Tham số Mô tả
file Đường dẫn file cần đọc
Ví dụ
1
2
3
(async function(){
    Log(ReadFile("D:\\test.txt"));
})();

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 (file);
Chi tiết
Tham số Mô tả
file Đường dẫn file cần đọc
Ví dụ
1
2
3
(async function(){
    Log(ReadFileAsLines("D:\\test.txt"));
})();

ReadDir#

List tất cả các file hoặc thư mục con trong một thư mục trên máy tính

Cú pháp
ReadDir (dir);
Chi tiết
Tham số Mô tả
dir Đường dẫn thư mục cần đọc

Kết quả trả về: Mảng các file/folder trong thư mục dir

Ví dụ
1
2
3
(async function(){
    Log(ReadDir("D:\\"));
})();

MkDir#

Tạo thư mục trên máy tính

Cú pháp
MkDir (dir);
Chi tiết
Tham số Mô tả
dir Đường dẫn thư mục cần tạo
Ví dụ
1
2
3
(async function(){
    MkDir("D:\\MyBackup");
})();

PathExists#

Check xem đường dẫn (file/folder) có tồn tại

Cú pháp
PathExists (path);
Chi tiết
Tham số Mô tả
path Đường dẫn thư mục/file cần check
Ví dụ
1
2
3
4
5
6
(async function(){
    if(PathExists("D:\\MyBackup"))
        Log("OK");
    else
        Log("Không tồn tại");
})();

MoveFile#

Di chuyển hoặc ĐỔI TÊN file

Cú pháp
MoveFile (oldPath, newPath);
Chi tiết
Tham số Mô tả
oldPath File nguồn
newPath File đích
Ví dụ
1
2
3
4
(async function(){
    MoveFile("D:\\test.txt", "D:\\test_2.txt");
    MoveFile("D:\\test2.txt", "E:\\test.txt");
})();

Rename#

Như MoveFile

CopyFile#

Sao chép file

Cú pháp
CopyFile (src, dest);
Chi tiết
Tham số Mô tả
src File nguồn
dest File đích
Ví dụ
1
2
3
(async function(){
    CopyFile("D:\\test.txt", "D:\\test_3.txt");
})();

Remove#

Xóa file / thư mục

Cú pháp
Remove (path);
Chi tiết
Tham số Mô tả
path Đường dẫn file/folder cần xóa
Ví dụ
1
2
3
(async function(){
    Remove("D:\\TaiLieuHoc\\ToanCaoCap\\TuTuongMac-Lenin\\Co-giao-thao");
})();

Stat#

Xem thông số file / folder

Cú pháp
Stat (path);
Chi tiết
Tham số Mô tả
path Đường dẫn file/folder cần xóa
Ví dụ
1
2
3
4
(async function(){
    const info = Stat("D:\\TaiLieuHoc\\ToanCaoCap\\TuTuongMac-Lenin\\Co-giao-thao");
    Log(info);
})();

PushToAlbum#

Upload ảnh/video vào album của điện thoại.

Cú pháp
await PushToAlbum (path);
Chi tiết
Tham số Mô tả
path Đường dẫn file/folder của ảnh/video cần upload
Ví dụ
1
2
3
4
5
6
7
(async function(){
    //push một file ảnh
    await PushToAlbum("D:\\Avatar\\supper_cute.jpg");

    //push tất cả file có trong một thư mục
    await PushToAlbum("D:\\Avatar");
})();

GetIndex#

Lấy thứ tự của device trong list device trên tool, bắt đầu từ 0.

Ví dụ
1
2
3
(async function(){
    Log(GetIndex());
})();

GetSerial#

Lấy serial device.

Ví dụ
1
2
3
(async function(){
    Log(GetSerial());
})();

SetNote1#

SetNote2#

GetNote1#

GetNote2#

Trên tool, mỗi device có 2 ô note 1 và note 2 để bạn có thể tùy chỉnh đặt bất cứ thông tin nào cho tiện theo dõi. Khi thiết bị được load lên list, nếu có note, chúng sẽ được hiển thị. Bạn cũng có thể thay đổi trực tiếp note trên tool.

Ví dụ

1
2
3
4
5
6
(async function(){
    SetNote1("note1");
    Log(GetNote1());
    SetNote2("note2");
    Log(GetNote2());
})();
"Note 1/2"

GetBuiltInBrands#

Trả về các brand được tích hợp sẵn có thể dùng cho hàm ChangeInfo

Ví dụ
1
2
3
(async function(){
    Log(GetBuiltInBrands());
})();

GetBuiltInModels#

Trả về các model của một brand được tích hợp sẵn có thể dùng cho hàm ChangeInfo

Ví dụ
1
2
3
(async function(){
    Log(GetBuiltInModels("samsung"));
})();

GetBuiltInCountries#

Trả về các country được tích hợp sẵn có thể dùng cho hàm ChangeInfo

Ví dụ
1
2
3
(async function(){
    Log(GetBuiltInCountries());
})();

GetBuiltInCarriers#

Trả về các nhà mạng của một country được tích hợp sẵn có thể dùng cho hàm ChangeInfo

Ví dụ
1
2
3
(async function(){
    Log(GetBuiltInCarriers("vn"));
})();

EvalLocalScript#

Hai hàm Eval dưới đây giúp bạn chia nhỏ script để dễ dàng quản lý, cũng như có thể chia sẻ với người khác. script có thể là file js thuần hoặc mã hóa bằng nút Encrypt trên studio

Load script (đã mã hóa hoặc không) từ file trên máy tính và chạy.

Cú pháp
await EvalLocalScript (file);
Chi tiết
Tham số Mô tả
file File .js hoặc .bs
Ví dụ
1
2
3
4
5
6
7
8
9
(async function(){
    Log("Begin...");
    // Rất là vừa vừa dòng code
    //....
    await EvalLocalScript("D:\\my-script\\xxx.js");
    //....
    // Tiếp tục vài dòng code
    Log("Done");
})();

EvalRemoteScript#

Load script (đã mã hóa hoặc không) từ url và chạy.

Cú pháp
await EvalRemoteScript (url);
Chi tiết
Tham số Mô tả
url Địa chỉ url đến file .js hoặc .bs
Ví dụ
1
2
3
4
5
6
7
8
9
(async function(){
    Log("Begin...");
    // Rất là vừa vừa dòng code
    //....
    await EvalRemoteScript(`http://god-of-code.vl/dich-vu.js?rand=${Date.now()}`); //them rand vào querystring để tránh bị cache
    //....
    // Tiếp tục vài dòng code
    Log("Done");
})();

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 team ngay.