Tuesday, February 25, 2020

Tự động Pick-lock tướng LOL tốc độ bàn thờ chỉ bằng trình duyệt web


Thấy trên giang hồ dạo này xuất hiện khá nhiều yêu cầu về tool hỗ trợ pick tướng nhanh, nên tại hạ đây cũng bỏ tí thời gian ra để nghiên cứu. Tuy không phải là một game thủ Liên Minh Huyền Thoại, nhưng cũng đã từng chơi qua nó. Sau khi hoàn tất bài viết này, càng thích nó hơn, không phải là game hay, mà là công nghệ tạo ra nó.

Bài toán của chúng ta không đơn thuần như tiêu đề, mà là: tự động chấp nhận trận đấu và pick-lock tướng siêu nhanh chỉ bằng trình duyệt web! Trên thực tế, bài viết này nhằm mục đích giúp các vị tìm hiểu về League Client và cách sử dụng API.

1. Cách thực hiện:

Đầu tiên, bạn hãy mở League Client lên, và để đó. Tiếp theo là truy cập vào thư mục chứa LCU, trên Windows có thể click phải vào process LeagueClient.exe và chọn "Open file location" (trong Task Manager).
..?/..?/LeagueClient/               ; Garena..?/Riot Games/League of Legends/; Riot
Tại đây, bạn sẽ thấy có một file tên là lockfile, mở nó sẽ thấy nội dung có dạng như sau:
LeagueClient:01234:56789:abcdef123456ABCDEF123456:https
  • Xem dấu hai chấm như là điểm ngăn cách, ta sẽ được 5 phần (từ trái qua).
  • Phần thứ ba chính là port (cổng của kết nối).
  • Phần thứ tư là pass (mật khẩu xác thực).
  • Về giao thức kết nối thì mặc định là HTTPS luôn.
Truy cập và lấy ID tướng: Mở trình duyệt web và nhập dòng sau vào thanh địa chỉ rồi nhấn enter:
https://127.0.0.1:PORT/lol-champions/v1/owned-champions-minimal
Chỗ PORT thay bằng port của bạn. Sau đó, có một hộp thoại yêu cầu đăng nhập hiện ra:
Phần tên người dùng cứ để là riot, còn mật khẩu thì nhập đoạn pass lúc nãy vào. Nếu đăng nhập thành công, trình duyệt sẽ hiện ra một đoạn JSON dài sòng sọc như sau:
"active": true,
    "alias": "Annie",
    "banVoPath": "/lol-game-data/assets/v1/champion-ban-vo/1.ogg",
    ...
Đây chính là dữ liệu về tất cả tướng mà bạn có thể chơi được (bao gồm tướng đã mua và miễn phí). Hãy mở thanh tìm kiếm trong trang (nhấn Ctrl+F) và nhập "name":"tên_tướng. Thay tên_tướng bằng tướng bạn muốn tìm, yasuo chẳng hạn.
..."id":157,"name":"Yasuo","ownership"...
Nếu tìm kiếm trùng khớp, ta sẽ thấy trước đoạn tô đậm sẽ là ID của tướng, ghi lại ID của một vài tướng mà bạn muốn chọn.

2. Viết code

Mở console ngay tại tab lúc nãy để nhập code, nếu bạn sử dụng Chrome hay CocCoc trên Windows thì có thể nhấn tổ hợp phím Ctrl+Shift+J. Tạo hàm request đơn giản với fetch, nhập code sau vào console và nhấn enter:
var request = async (method, url, body = undefined) => {
    const data = await fetch(url, {
        method: method,
        body: body,
        headers: {'Content-type': 'application/json; charset=UTF-8'}
    }).then(res => res.text())
      .then(txt => JSON.parse(txt.length ? txt : '{}'));
    return data;
};
  • Có thể bỏ qua tham số body (cho phương thức GET).
  • Dùng với await để đồng bộ.
Hàm kiểm tra có phải đang chờ chấp nhận trận đấu:
var isInProgress = async () => (await request(
    'GET', '/lol-matchmaking/v1/ready-check')).state === 'InProgress';
<< Giải thích: console Khi tìm thấy trận, thuộc tính state sẽ mang giá trị là InProgress.

Hàm chấp nhận trận đấu:
var acceptMatch = async () => await request(
 'POST', '/lol-matchmaking/v1/ready-check/accept');
Hàm lấy action ID:
var getActionId = async () => {
    var {localPlayerCellId, actions} =
        await request('GET', '/lol-champ-select/v1/session');
    if (!actions) return -1;
    return actions[0].filter(v =>
        v.actorCellId === localPlayerCellId)[0].id;
};
<< Giải thích:<< console Trả về -1 nếu không phải đang chọn tướng. Dùng filter để lọc ra id của chính mình.

Hàm pick và hàm lock:
var pick = async (id, championId) => Object.keys(await request(
    'PATCH', `/lol-champ-select/v1/session/actions/${id}`,
    JSON.stringify({championId}))).length === 0;
var lock = async (id) => await request(
    'POST', `/lol-champ-select/v1/session/actions/${id}/complete`);
  • Tham số id lấy từ hàm getActionId.
  • Khi chọn tướng thành công thì ta được đoạn JSON rỗng.
Và cuối cùng là hàm auto chấp nhận trận dấu và pick-lock:
var start = (championIds = [157]) => {
    var inv = setInterval(async () => {
        var id;
        if (await isInProgress()) {
            await acceptMatch();
        } else if ((id = await getActionId()) > -1) {
            for (var i=0; i<championIds.length; i++)
                if (await pick(id, championIds[i])) break;
            await lock(id);
            clearInterval(inv);
        }
    }, 250);
};
Tham số championIds là mảng ID tướng, phòng trường hợp có người chọn tướng đó trước bạn, mặc định là Yasuo. Dùng setInterval để check liên tục, vì ta không có event nào cả.

Test

Chỉ cần gọi hàm start và truyền vào một mảng ID của tướng:
start([157, 10, 1]);
Yasuo, Kayle và Annie, hãy đảm bảo rằng bạn có thể chọn được ít nhất 1 trong 3 tướng này.
Hoặc thay bằng ID của các tướng khác. Vậy là đã xong hết mọi thứ, hãy tạo một trận phòng tập hoặc đấu thường rồi bắt đầu và buông chuột.
OK vậy là đã xong bạn có thể theo dõi và cập nhật code tại repo này: https://github.com/nomi-san/yasuo

3. Một số câu hỏi thường gặp (FAQ)

- Tỉ lệ thành công là bao nhiêu?:
100%, nếu mất kết nối thì là 0%.
- Có bị khóa tài khoản không?
Không, đây đơn thuần chỉ là "mượn tay mượn chân" của client thôi.
- Tôi có thể làm gì sau khi đọc bài viết này?
Nếu bạn thực sự hiểu được ẩn ý trong đây thì không cần phải xem câu hỏi này. Đơn giản là viết được "tool".
- Tại sao một số tool ở cuối bài không hoạt động trên Windows 7?
Chắc bạn dùng Windows 7 quá cũ rồi, thử cài thêm cái nàycái này nữa.
- Garena khởi động LMHT như thế nào?
Vẫn là truyền tham số vào LeagueClient.exe thôi, thử xem các tham số của LeagueClient bằng lệnh trong phần Tìm cổng kết nối đến LCU. Bạn sẽ có thấy một đoạn token của Garena sinh ra, hạn dùng của nó là 3p sau khi tắt League Client.
- Có thể custom pass và port của LCU không?
Không thành vấn đề, thêm 2 tham số này vào khi thực thi LeagueClient (đối với máy chủ Garena thì copy tham số lấy được từ câu hỏi ở trên):
--remoting-auth-token=abcdef123456fedcba654321 --app-port=1234
- Tôi có thể đóng hết tất cả League Client của một quán net không?
Có thể, nếu bạn truy cập được máy chủ và tìm được IP cục bộ của các máy tính cùng port của League Client đang chạy. Sau đó chỉ cần một thiết bị có thể truy cập mạng của quán net và gửi POST request:
https://riot:PASS@LAN_IP:PORT/process-control/v1/process/quit
Tự động Pick-lock tướng LOL tốc độ bàn thờ chỉ bằng trình duyệt web
4/ 5 stars - "Tự động Pick-lock tướng LOL tốc độ bàn thờ chỉ bằng trình duyệt web" Thấy trên giang hồ dạo này xuất hiện khá nhiều yêu cầu về tool hỗ trợ pick tướng nhanh, nên tại hạ đây cũng bỏ tí thời gian ra để nghiên ...
Previous Post
Next Post

post written by: