J2TEAM Security: A must-have extension for Chrome users. Install now!

Công cụ xem tin nhắn đầu tiên trên Facebook được code như thế nào?

Tính năng "Xem tin nhắn đầu tiên với bạn bè" trên Facebook (Messenger) trong extension J2TEAM Security đã được tạo ra như thế nào?
Do có nhiều bạn gặp lỗi khi sử dụng tính năng "Tìm lại tin nhắn đầu tiên", cũng có một số bạn đưa ra nghi ngờ rằng tính năng này lấy random, hoặc lấy tất cả các tin nhắn sau đó lọc ra, nên mình xin phân tích một chút về cách mình tiếp cận với bài toán cũng như những thuật toán được sử dụng cho tính năng này:

Để tiếp cận với bài toán thì việc đầu tiên mình làm đó là ngồi capture và đọc các requests từ browser gửi lên khi mình kéo tin nhắn trên Messenger. Mục đích của bước này là để tìm hiểu cơ chế của Facebook Messenger trong việc lấy tin nhắn và xây dựng một cơ chế riêng để lấy n tin nhắn đầu tiên dựa trên đó.

Sau khi tìm hiểu, mình nhận thấy Messenger lấy n tin nhắn (mặc định là 41 tin mỗi lần) theo thứ tự từ mới -> cũ, đúng như cách bạn đọc tin nhắn trên messenger (đừng nghĩ điều này hiển nhiên nhé, vì trước đây họ từng lấy theo cách ngược lại :v). Nói đơn giản là việc lấy tin nhắn sẽ được messenger thực hiện bằng cách gửi lên server một mốc thời gian và giới hạn n số tin nhắn cần lấy, và server sẽ chỉ trả về n tin nhắn MỚI NHẤT trước mốc thời gian đó mà thôi.

Vì cách lấy tin nhắn như trên mà mình gặp khá nhiều khó khăn trong việc lên ý tưởng, vì cái mình cần là lấy n tin nhắn CŨ NHẤT, nếu messenger hoạt động theo cách ngược lại thì việc của mình đơn giản chỉ là đặt cái mốc đó thật xa trong quá khứ thôi, vì messenger sẽ tự làm nốt phần còn lại là tìm và lôi n cái tin nhắn mới nhất sau khoảng thời gian đó ra.

Nhưng cuối cùng sau một hồi vắt óc suy nghĩ thì mình đưa ra được 3 ý tưởng đó là:

1. Lấy hết tất cả tin nhắn của user và lọc ra n tin nhắn đầu tiên:


Cách này không tối ưu chút nào, vì ngoài n tin nhắn bạn muốn lấy ra thì phần còn lại là thừa. Mình có thử lấy 5k tin nhắn theo cách này thì thấy tốn cỡ 4mb. Load đến 30k thì server error luôn :|. Cách này theo mình là tốn kém và không khả thi, nếu không còn cách nào khác thì dùng tạm.

2. Tìm cách thu hẹp phạm vi tìm kiếm:


Với cách này thì mình tính áp dụng thuật toán tìm kiếm nhị phân (thuật toán được mô tả trên ảnh) để tìm n tin nhắn cũ nhất nằm trong giới hạn trong khoảng thời gian từ 1/1/2004 tới thời điểm hiện tại. Theo lý thuyết khi sử dụng cách này mình sẽ chỉ tốn nhiều nhất cỡ 12 lần lấy tin nhắn (1200 tin), thực tế mình thử nghiệm thấy tốn nhiều hơn do cách mình áp dụng thuật toán có hơi khác.

binary-search-animation

Ban đầu thì đây là cách được ứng dụng trên extension, nhưng trong lúc dev bọn mình đã không để ý một trường hợp đặc biệt đó là giữa quá trình tìm kiếm bị lỗi (do Messenger) khiến cho việc tìm kiếm không hoàn tất được và hệ quả là user ngồi đợi dài cổ.

3: Tìm cách lấy tin nhắn theo cơ chế ngược lại:


Với cách này mình sẽ phải bỏ hết những gì mình đã nghiên cứu ở trên đi và tự đi tìm một API khác có cơ chế hoạt động tương đương, nhưng với cách hoạt động ngược lại. Thực tế hôm nay trong lúc ngồi chơi không có việc gì làm thì mình chợt nghĩ ra chức năng search tin nhắn trong messenger :v. Bạn nào muốn thử thì vào messenger bấm search tin nhắn sẽ thấy có nút load more ở dưới ấy, nó hoạt động đúng theo cách mình cần :v.

Nhưng cái API này lại không áp dụng được như những cách trên vì nó lấy tin nhắn theo message_id T_T. message_id này hoạt động cũng như số thứ tự vậy, và thay vì gửi mốc thời gian như trên thì bạn gửi cho server một cái message_id và server sẽ gửi cho bạn tất cả những tin nhắn có thứ tự xếp sau cái đó. Cách này sẽ áp dụng được nếu như mình có thể lấy được message_id của tin nhắn đầu tiên.
search-facebook-message

-> Mình nảy ra cách để áp dụng ý tưởng 2 và 3 với nhau, đó là thay vì lấy n tin nhắn mỗi lần tìm kiếm như ở ý tưởng 2 thì mình chỉ lấy đúng 1 tin đầu tiên thôi, sau đó tách message_id của tin nhắn đó và dùng cách 3 để lấy là n tin nhắn sau đó. Hiện tại bọn mình đang test lại cách này cho chắc ăn, có lẽ vài ngày nữa sẽ có bản cập nhật mới nhật.

P/S: Bài có nhiều kiến thức chuyên môn khó hiểu nên chắc không nhiều bạn đọc được đến đây.

- Nhưng nếu bạn đang đọc dòng này thì cảm ơn bạn vì đã quan tâm và hiểu được tâm huyết của mình.

Bài gốc của Việt Thảo đăng trên J2TEAM Community.

Công cụ này hiện có trong J2TEAM Security, mời các bạn cài đặt và trải nghiệm nhé!
Leader at J2TEAM. Website: https://j2team.dev/