Hướng dẫn lấy session & API game Đu quay
Tài liệu nội bộ: cách lấy sid (session) của app Litmatch từ máy ảo Android và từ iPhone, kèm danh sách API của game Đu quay đã nghiên cứu được. Dùng cho mục đích tìm hiểu cơ chế và thu thập dữ liệu trên tài khoản của chính mình.
1. Lấy session bằng tool ANDROID / LDPLAYER
Không cần mitmproxy, không cần mở game. Script get_session.py đọc thẳng dữ liệu app trong máy ảo đã root qua adb, rồi gọi 1 request thật để xác minh sid còn sống.
Yêu cầu
- LDPlayer9 đang chạy và đã bật Root (Settings → Other → Root → ON).
- App Litmatch (
com.litatom.apphoặccom.litatom.lite) đã đăng nhập trong máy ảo. adbcó sẵn (đi kèm LDPlayer:C:\LDPlayer\LDPlayer9\adb.exe) và Python 3.10+.
Các bước
-
Kết nối adb tới máy ảo.
adb server đôi khi bật trước khi máy ảo boot xong nên không tự thấy device. Chạy lệnh connect (cổng mặc định của LDPlayer là 5555):
"C:\LDPlayer\LDPlayer9\adb.exe" connect 127.0.0.1:5555 "C:\LDPlayer\LDPlayer9\adb.exe" devices
Thấy một dòng kết thúc bằng
devicelà được. Nếu làofflinehoặc trống, khởi động lại máy ảo rồi connect lại. -
Chạy script lấy session.
Trong thư mục dự án:
python get_session.py
Script sẽ: đọc
sid+uuid+ thông tin thiết bị → thửsidtừ mới đến cũ, gọi APIget_round_infođể kiểm tra → ghisession.json. -
Đọc kết quả.
Output mẫu:
device : 127.0.0.1:5555 package: com.litatom.app sid : session.v2.XXXXXXXXXX uuid : XXXXXXXXXXXXXXXX thiết bị: GFE4J / Android SDK 28 / app 7.75.2 vòng hiện tại: 1353 → đã ghi session.json
Dòng “vòng hiện tại” chứng tỏ
sidhợp lệ. Filesession.jsonđược các script khác (collect_history.py,daily_worker.py) tự đọc.
Các cờ hữu ích
| Cờ | Tác dụng |
|---|---|
--print | Chỉ in ra màn hình, không ghi file. |
--no-verify | Bỏ qua bước gọi API kiểm tra (ghi luôn sid mới nhất). |
--device <serial> | Chỉ định device khi có nhiều máy ảo. |
--package <pkg> | Ép package (mặc định thử com.litatom.lite rồi com.litatom.app). |
--adb <path> | Đường dẫn adb thủ công (hoặc đặt biến môi trường LD_ADB). |
--out <file> | Đổi file output (mặc định session.json). |
Xử lý lỗi thường gặp
adb connect 127.0.0.1:5555.
--no-verify để ghi file mà không kiểm tra.
2. Lấy session trên iPhone MITMPROXY
iOS không cho đọc thẳng dữ liệu app nếu không jailbreak. Cách khả thi nhất là bắt traffic: dựng mitmproxy trên PC làm proxy, iPhone đi qua proxy đó, rồi đọc sid trong query của request game. Game Đu quay chạy trong WebView nên không có SSL pinning → bắt sạch.
mitmproxy (pip install mitmproxy). Biết IP LAN của PC — ví dụ tài liệu này dùng 192.168.1.16, bạn thay bằng IP máy mình (ipconfig → dòng IPv4).
-
Mở cổng 8080 trên tường lửa Windows (làm 1 lần).
Mở PowerShell bằng Run as Administrator:
New-NetFirewallRule -DisplayName "mitmproxy 8080" -Direction Inbound ` -Protocol TCP -LocalPort 8080 -Action Allow -RemoteAddress LocalSubnet
LocalSubnetchỉ cho phép máy trong mạng nhà kết nối, an toàn hơn mở toàn bộ. -
Chạy mitmweb trên PC.
Mở terminal (thư mục nào cũng được) và chạy:
mitmweb --listen-host 0.0.0.0 -p 8080
Trình duyệt tự mở giao diện tại
http://127.0.0.1:8081. Để nguyên terminal này chạy, đừng tắt.--listen-host 0.0.0.0để iPhone ngoài máy kết nối vào được. -
Trỏ proxy trên iPhone.
Cài đặt → Wi-Fi → bấm (i) cạnh mạng đang dùng → kéo xuống Định cấu hình proxy → Thủ công:
- Máy chủ:
192.168.1.16(IP PC của bạn) - Cổng:
8080 - Xác thực: tắt → Lưu
- Máy chủ:
-
Cài chứng chỉ CA của mitmproxy.
Mở Safari (bắt buộc Safari), vào
http://mitm.it.- Thấy trang có nút tải cho iOS → proxy đã chạy đúng. Nếu báo “traffic is not passing through mitmproxy” → xem lại bước 1 và 3.
- Bấm iOS → Get mitmproxy-ca-cert.pem → Cho phép.
- Cài đặt → dòng “Đã tải về hồ sơ” trên cùng → Cài đặt → nhập mật mã → Cài đặt.
-
Bật tin cậy chứng chỉ (bước hay bị quên nhất).
Cài đặt → Cài đặt chung → Giới thiệu → Cài đặt tin cậy chứng nhận → bật công tắc mitmproxy. Thiếu bước này thì HTTPS sẽ lỗi, không bắt được gì.
-
Mở game và lấy sid.
Mở Litmatch → vào Đu quay. Trong giao diện mitmweb, gõ
multiplayer_boxvào ô Search để lọc. Bấm một request, mở tab Request — phần query chứa các giá trị cần lấy:sid = session.v2.XXXXXXXXXX uuid = XXXXXXXXXXXXXXXX platform = ios ← chú ý: KHÁC android version = 7.xx.x model = iPhone... os = (phiên bản iOS)
-
Dọn dẹp (quan trọng về bảo mật).
- iPhone: tắt proxy (Định cấu hình proxy → Tắt); tắt tin cậy chứng chỉ ở bước 5; xoá profile trong Cài đặt chung → Quản lý VPN & thiết bị.
- PC: Ctrl+C tắt mitmweb; gỡ rule tường lửa:
Remove-NetFirewallRule -DisplayName "mitmproxy 8080"
get_session.py hiện ghi cứng platform=android, User-Agent Android và header X-Requested-With theo package Android. Nếu dùng sid lấy từ iPhone, nên dùng đúng các tham số (platform, model, os) bắt được từ iPhone — có thể cần sửa build_query để đọc platform từ session.json. Ngoài ra, chưa rõ Litmatch có cho một tài khoản chạy 2 session song song không; đăng nhập máy này có thể làm sid máy kia hết hạn.
Thay thế: bắt trực tiếp trên iPhone
Không muốn dùng PC thì cài app bắt traffic ngay trên iPhone: Proxyman, Stream hoặc HTTP Catcher. Vẫn phải cài + tin cậy chứng chỉ CA của app đó (tương tự bước 4–5) rồi lọc host litatom.com.
3. API đã biết của Litmatch GAME ĐU QUAY
Kết quả mỗi vòng 100% do server quyết. Game là H5 (WebView) chỉ poll API rồi vẽ; đây là vòng chung nhiều người (round_times là bộ đếm toàn server). Base URL:
https://www.litatom.com/api/sns/v1/lit/multiplayer_box/
Danh sách endpoint
| Endpoint | Vai trò / trả về |
|---|---|
get_result | Kết quả 1 vòng: result_id (1–8 = cửa thắng) + fileid + top_three (3 người thắng lớn). |
get_round_info | Trạng thái vòng hiện tại: round_times, mốc start/end/end_bet/now, status, số vòng mỗi cửa chưa ra. |
get_result_record | Lịch sử: mảng 10 fileid cửa thắng gần nhất (xếp mới → cũ, không phân trang). |
get_box_resource | Bảng cửa: goods_id → tên → odds → probability. |
last_bet_record | Feed cược realtime của người khác (avatar “bets on”). |
top_bet_goods | Các cửa đang được đặt nhiều nhất. |
Xác thực & query params
Auth = sid đặt trong query string (không có Bearer/Cookie). Bộ query dùng chung cho mọi endpoint:
| Param | Ví dụ | Ghi chú |
|---|---|---|
sid | session.v2.<digits> | Token xác thực, từ máy ảo/capture. |
uuid | <device uuid> | Khác với android_id. |
platform | android / ios | Theo thiết bị lấy sid. |
model | 23078RKD5C | Model thiết bị. |
os | 28 | SDK Android / phiên bản iOS. |
version | 7.70.2 | Version app. |
game_version | 1.0.5 | Version game H5. |
loc / lang | EN / en | Ngôn ngữ. |
base_url | https://www.litatom.com/ | Cố định. |
loctype | 0 | Cố định. |
Headers
User-Agent: Mozilla/5.0 (Linux; Android 9; ...; wv) AppleWebKit/537.36 Origin: https://activity.static.litatom.com Referer: https://activity.static.litatom.com/ X-Requested-With: com.litatom.lite
Mẫu request đầy đủ (lịch sử)
GET https://www.litatom.com/api/sns/v1/lit/multiplayer_box/get_result_record
?sid=session.v2.<SESSION_ID>
&loc=EN&uuid=<DEVICE_UUID>&version=7.70.2&lang=en
&base_url=https%3A%2F%2Fwww.litatom.com%2F
&platform=android&model=23078RKD5C&os=28&loctype=0&game_version=1.0.5Lấy dữ liệu khác thì đổi get_result_record thành endpoint tương ứng, giữ nguyên bộ query. Với get_result thêm ?round_times=N (N từ 1 đến vòng hiện tại của hôm nay).
Mã kết quả (field result)
| Mã | Ý nghĩa |
|---|---|
| success | Có data hợp lệ. |
| -1 | Vòng chưa xảy ra (round_times tương lai / ngoài phạm vi ngày). |
| -10 | login time out — sid hết hạn. Mở lại game để nạp sid mới. |
| -22 | Rate-limit (“Vui lòng thử lại sau”). Giãn ~2s/request + retry backoff. |
Bảng xác suất (get_box_resource)
Bằng chứng “server quyết”: phân phối categorical hoàn chỉnh (tổng xác suất = 1). Mọi cửa có kỳ vọng bằng nhau = 0.972 → RTP ≈ 97.2%, house edge ≈ 2.8% cố định.
| ID | Cửa | Odds | Probability | EV (odds×prob) |
|---|---|---|---|---|
| 1 | Kem Cây | 5 | 0.19438 | 0.972 |
| 2 | Phao Bơi | 5 | 0.19438 | 0.972 |
| 3 | Bong Bóng | 5 | 0.19438 | 0.972 |
| 4 | Nắm Đấm | 5 | 0.19438 | 0.972 |
| 5 | Gấu Bông | 10 | 0.09720 | 0.972 |
| 6 | Nàng Tiên | 15 | 0.06480 | 0.972 |
| 7 | Máy Ảnh | 25 | 0.03888 | 0.972 |
| 8 | Vương Miện | 45 | 0.02160 | 0.972 |
Cơ chế round_times — reset mỗi ngày
- 1 vòng = 32 giây (chính xác 32.000s). 1 ngày = 2700 vòng (86400 / 32).
- Vòng N bắt đầu lúc
nửa_đêm + (N−1)×32s(giờ địa phương). Mốc neo lấy từ server:day_start = start − (round_times−1)×32. - round_times KHÔNG duy nhất giữa các ngày → khoá lưu trữ phải là
(ngày, round_times). - Không lấy lại được ngày hôm trước: qua nửa đêm counter reset,
get_result?round_times=Ntrỏ sang vòng N của ngày mới. Muốn đủ 1 ngày phải gom trong ngày đó. get_result_recordchỉ trả mảngfileid(không kèm round_times) — tự neo:record[i]ứng với vònground_times_hiện_tại − 1 − i.fileid↔result_idlà ánh xạ 1:1 cố định.
get_result.top_three và last_bet_record trả về profile đầy đủ của người chơi khác (tên, tuổi, bio, quốc gia, ngày sinh, avatar…). Cân nhắc khi lưu/chia sẻ.
bet/place_bet) chưa xuất hiện trong phiên capture (chỉ quan sát, không cược thật). Không ảnh hưởng kết luận nguồn kết quả — kết quả nằm ở get_result, độc lập với việc có cược hay không.