Để 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.
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.
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é!