Tôi đi tìm lại tin nhắn tình yêu đầu tiên trên Facebook

Hoài niệm

Ngồi một góc nhỏ cafe, lại nhớ về một chút kỷ niệm gì của quá khứ. Một người bạn của quá khứ hay đôi khi là những tin nhắn sến sẩm với bà xã. Rồi tự hỏi, 2 đứa từng nhắn tin với nhau từ bao giờ ?

Lôi điện thoại ra kéo ngược dòng quá khứ, sao mệt dữ vậy. Tìm sao được cái này đầu tiên nhắn tin tỏ tình nhỉ ?

Tìm lại ký ức yêu

Bó tay sao ? Ý tưởng trong tôi lại lóe lên. Kiếm cái Facebook API : Read inbox messages cho nó nhanh.

alt text

Thế là ra đi rồi ông giáo ạ.
alt text

Bó tay tiếp ?

Firebug

Đành dùng Firebug vào phần messenger (fb.com/messages) kiểm tra tiếp vậy, tìm tất tần tật cái API nào type nó trả về json.

alt text

Ra ngay em này : https://www.facebook.com/api/graphqlbatch/ - method POST

Tìm một người bạn và trace theo API này xem nó ra làm sao ?

alt text

Đoán già đoán non, thì cái __dyn kia nó là token rồi, kiểm tra thêm về hoạt động của token này xem sao. Mình gửi lại một request bằng Edit and Resend, thay đổi nội dung Request Body một chút. Ồ, nó vẫn trả về json mà không lầm lỗi gì, vậy là token này vẫn sống, có thể tái sử dụng được.

Lên ý tưởng cho một Chrome Extension.

Phân tích

Bài toán : Tìm các tin nhắn đầu tiên với một người bạn.

Input : Một id của người bạn, một mốc thời gian (timestamp: tìm tin nhắn trước ngày này), số tin nhắn cần lấy.
alt text

 Kiểm tra qua một request, thấy đầu vào ngoài các tham số chung thì có các tham số thay đổi như là id, message_limit, before

Output: Danh sách các tin nhắn, hiển thị ra màn hình.

Phương thức :

  • findUserId: Tìm userid từ một url khi chuột phải vào.
  • getTokenSample: Lấy token template từ một request get messages đầu tiên, sau đó lưu lại để thay đổi các tham số đầu vào gửi lên.
  • fetchMessage : Tìm các tin nhắn từ ngày hiện tại cho đến tin nhắn đầu tiên. Các request đều trả về một biến has_previous_page, do đó xác định dễ dàng được page cuối cùng. Đệ quy phương thức này cho tới hết, tham số truyển vào là mốc thời gian của node cuối cùng trong danh sách tin nhắn trước đó. alt text

Source code

Google với keyword chrome extension webpack github: chrome-extension-webpack-boilerplate là ra một bộ source tha hồ biến tấu.

Viết code

1 . Get userId

alt text

2 . Capture token, mở một tab trên trình duyệt, sau đó bắt request mẫu để lưu lại các tham số input vào localstorage

     getTokenFriend() {
        chrome.tabs.create({
            url: `https://www.facebook.com/messages/t/${this.aliasUser}`
        }, (tab) => {
            db.set('__tabCachedMessenger', tab);
        });
    }

alt text

3 . Fetch messages bao gồm 2 options: duyệt dữ liệu từ đầu và duyệt dữ liệu từ request cuối cùng.

this.lastQuery = db.get(`__fuserId:${this.aliasUser}:last_query`);
    async fetchMessage(timestamp) {

        let sample = db.get('__messengerSamplePost');

        if (sample && db.get('__isBusy') == "false") {

            db.set('__isBusy', "true");

            let queries = {
                "o0": {
                    "doc_id": "2335490819851618",
                    "query_params": {
                        "id": `${this.userId}`,
                        "message_limit": MAX_MESSAGE,
                        "load_messages": true,
                        "load_read_receipts": true,
                        "load_delivery_receipts": true,
                        "before": `${timestamp}`
                    }
                }
            };

            sample.queries = JSON.stringify(queries);

            const body = await helper.post('https://www.facebook.com/api/graphqlbatch/', (this.lastQuery || sample));

            var lines = body.split(/\n/);
            let result = JSON.parse(lines[0]);

            result = result && result.o0 && result.o0.data && result.o0.data.message_thread;

            if (!result || !result.messages || result.messages.nodes.length <= 0) {
                return helper.info('errorRelationShip', 'Chưa nhắn tin với nhau bao giờ');
            }

            this.indexMessage += result.messages.nodes.length;

            db.set('__isBusy', "false");

            if (result && result.messages.page_info.has_previous_page == false) {
                if (!this.isView) {
                    this.openView();
                    helper.info('fetchToken', `Hai bạn đã từng qua lại với nhau ${result.messages_count} tin nhắn.`);
                    db.set(`__fuserId:${this.aliasUser}:last_query`, sample);
                }
                return result;
            } else {
                let __timestamp = result.messages.nodes[0].timestamp_precise;
                helper.info('fetchToken', `Đã quét ${Math.floor(this.indexMessage / result.messages_count * 100)}% tin nhắn`);
                return await this.fetchMessage(__timestamp);
            }

        }
    }

4 . Hiển thị ra view
alt text

Để các request tới api của facebook không bị bắt lỗi vặt, mình fake lại header của các request

alt text

Tạo menu
alt text

Thành quả

Chọn chế độ phát triển và load extension vào.
alt text

tìm tin nhắn đầu tiên fb

Lần đầu tiên với Ngọc Trinh.
alt text

Xuất bản trên Chrome Extension Store:

https://chrome.google.com/webstore/detail/messenger-viewer/jlgoljebdmafabnmlhgfkmofbdonlcjd

alt text

Tìm lại tin nhắn của vợ thì nó phải như thế này :
alt text

Bản build cho mọi người test thử :

  • 0.0.229 : Fix một số lỗi về trùng lặp truy vấn.
  • 0.0.239: Thêm mốc thời gian của cuộc hội thoại.

Chỉ việc giải nén, load thư mục vào chrome dưới chế độ phát triển. Tool vẫn còn bug đâu đó, mong anh em bạn bè dùng thử report bug để mình fix :lmao:

Nhắn nhủ
Trên đây mình không dám đi quá sâu vào từng dòng code, chỉ cặn kẽ chi tiết như một hướng dẫn, mình chỉ vẽ ra một case study cho mọi người cùng tham khảo. Mọi thông tin cá nhân của bạn chỉ bạn nhìn thấy thôi.

Cái kết

/!\ Lợi bất cập hại, chắc tool này không phù hợp cho anh em nào hay mò mẫm đêm khuya. Dùng tool này lại tan cửa nát nhà, khuyến cáo trước nhé :lol:

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Anh NC

3 bài viết.
38 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
61 12
Nguồn gốc Từ việc thiếu thốn dữ liệu của các nhà số học xung quanh mình. Buộc tôi phải tìm cách giúp họ. Nhưng với đôi tay trắng này, giúp sao đây...
Anh NC viết 3 tháng trước
61 12
White
8 0
insecam.org là website lưu trữ dữ liệu về các IPCam bị public (The world biggest directory of online surveillance security cameras.) Để bản đồ hóa...
Anh NC viết 3 tháng trước
8 0
Bài viết liên quan
White
20 3
Một lỗ hổng bảo mật cực kỳ nghiêm trọng, có ảnh hưởng trực tiếp đến quyền riêng tư của khoảng 1 tỷ tài khoản Facebook và có khả năng ảnh hưởng tới ...
Hùng PV viết hơn 2 năm trước
20 3
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
3 bài viết.
38 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!