11/08/2018, 20:24

Tôi đã viết phim.clgt.vn như thế nào

Động lực Đối với nghề lập trình viên thần thánh, nếu một sớm mai thức dậy anh em cảm thấy ko có bất kì động lực nào để tỉnh, chỉ muốn ngủ tiếp, đó là dấu hiệu cho thấy anh em đang sắp bị burnout, rằng công việc hiện tại quá nhàm chán. Đó là một dấu hiệu xấu. Nếu ko vực dậy anh em sẽ nhảy ...

alt text

Động lực

Đối với nghề lập trình viên thần thánh, nếu một sớm mai thức dậy anh em cảm thấy ko có bất kì động lực nào để tỉnh, chỉ muốn ngủ tiếp, đó là dấu hiệu cho thấy anh em đang sắp bị burnout, rằng công việc hiện tại quá nhàm chán. Đó là một dấu hiệu xấu. Nếu ko vực dậy anh em sẽ nhảy job trong sớm chiều.

Sáng hôm kia tôi cũng vậy, bạn phải tự cứu lấy chính mình trước khi quá muộn. Tôi đã bỏ việc ngày hôm đó để bắt tay vào làm 1 side project vớ vẩn, ý tưởng lúc đầu chỉ muốn làm site coi phim X ( x là ẩn số - nhưng tôi thích cách nghĩ của anh em)

Sau một lúc đắn đo thì http://phim.clgt.vn ra đời. Đọc là phim-chấm-còn-lắm-gian-truân-chấm-việt-nam.

Tại sao làm trang phim

Trước hết là phục vụ nhu cầu coi phim của bản thân, đúng không đã. Side project mà người viết ra không dùng là vứt. Ngoài ra tôi thấy các site phim hiện có đa số quá phức tạp, mà nhu cầu của tôi chỉ đơn giản.

Bước đầu tiên khi làm side project, các lập trình viên thần thánh sẽ liệt kê các tính năng phải có, tôi cũng đéo khác.

Liệt kê tính năng

  • Site phải search được phim muốn xem
  • Click phát xem luôn
  • Không chôm direct link làm mất bandawidth site của anh em khác
  • Không up phim lên host ( hỡi ôi tiền đâu mà trả )
  • Site không quảng cáo kiếm tiền
  • Không cần database để có thể chơi immutable deployment

Bắt tay vào làm

Đầu tiên là đi kiếm nguồn phim được host trên google drive. Ở VN làm web phim ... số vốn ban đầu phải nói là cực rẻ, anh em chỉ việc kiếm 1 email có đuôi edu, sau đó đăng ký gói khuyến học của google để dc account gdrive unlimit không tốn một xu nào.

Hoặc lười anh em có thể mua trực tiếp gói https://gsuite.google.com với giá 10 đỗ nam trung 1 tháng, thế là chúng ta đã có storage không giới hạn dung lượng, không giới hạn băng thông và trên hết có thể upload đủ thứ hay ho như phim lên đó.

Tất nhiên phim.clgt.vn ko rảnh up phim, nên chúng ta sẽ đi mượn tạm của phimmoi.net ;)

Một trang web để thành nguồn phim phải đáp ứng dc 2 thao tác, tìm và xem.

Thao tác tìm kiếm không thể đơn giản hơn, chỉ việc gọi request qua phimmoi.net/tim-kiem/SEARCH_QUERY/ thay SEAERCH_QUERY bằng tên phim như kubo, sau đó ta duyệt qua html để trích ra những thành phần mong muốn bao gồm tên phim và quan trọng nhất, tính toán ra URL dẫn đến trang xem phim.

Tất cả trang phim đều phải gởi link video xuống trình duyệt, không có ngoại lệ. Về lý thuyết nếu có thể coi dc video thì sẽ download dc, một số trang bị khoá DRM bản quyền, phim khi muốn playback cần có file license. Những phim này dù bạn có down về máy nhưng cũng ko coi dc.

Nói thì nói số trang có khóa DRM ở Việt Nam, đếm dc trên đầu ngón tay, hãy để yên cho họ làm ăn, mục tiêu của chúng ta là các trang không bản quyền.

Nhẽ tất nhiên phimmoi làm gì có bản quyền a hèm .. và 1 cơ số các trang phim khác cũng thế.

Quay lại vấn đề chính, chúng ta đã lấy dc link đến trang xem phim, ví dụ link xem kubo:

http://www.phimmoi.net/phim/kubo-va-cay-dan-shamisen-3616/xem-phim.html

view source ngó qua ngó lại 1 tí chúng ta đã tìm dc link mà phimmoi gọi để lấy video như trong hình

alt text

gọi link này và chúng ta có response chứa video kèm vài dòng js

alt text

nhưng đoạn URL của video bôi đen trong hình trên đã dc phimmoi ưu ái mã hoá thành 1 đoạn trông có vẻ ghê ghê tởm tởm không giống URL lắm.

hỡi ôi hành động này có thể làm khó ai chứ không thể làm khó các bạn lập trình viên thần thánh. Mà cơ bản theo tôi không hề có tác dụng gì, nói thì nói phimmoi vẫn phải giải mã đoạn URL trên ở ngay chính browser của tôi thì mới chíu dc phim.

Mà trên browser của tôi thì tôi làm gì chả dc, ngó lại đám json data thì thấy nó dc pass vào hàm episodeLoadedCallback để process.

follow hàm này dẫn ta đến file watch-n3.js, function episodeLoadedCallback như bên dưới.

//--Current EpisodeInfo Loaded Callback
    episodeLoadedCallback=function(data){
        watching.cancelSkipWaiting();
        watching.handleData(data); // set break point ở đay
        //removePlayerLoading();
    }

tôi set 1 cái break point ngay dòng 259 vì đang quan tâm phimmoi làm gì với cục data đã mã hoá đó, refresh lại và như dự đoán browser pause ngay dòng 259.

Lúc này URL của phim nằm trong biến data dc chọi vào vẫn chưa giải. Như các anh em có thể thấy trong hình.

alt text

Step into next function call và chúng ta rơi vào file watching-v4, file này bị min lại thành 1 dòng, đừng lo lắng vì browser có đủ đồ chơi, click vào nút pretty print để bung lụa.

alt text

Đến đây tôi có lời khen tặng cho phimmoi đã nhọc công obfuscate cả file js này, cả đám code nhìn chán ko thể tả

 this[_0xba81[214]] = function(_0xfe74xa) {
        this[_0xba81[215]]();
        this[_0xba81[206]]();
        var _0xfe74x54 = this[_0xba81[43]]();
        if (typeof _0xfe74xa[_0xba81[216]] != _0xba81[33] && _0xfe74xa[_0xba81[216]] && _0xfe74xa[_0xba81[216]] != _0xfe74x54) {
            console[_0xba81[49]](_0xba81[217] + _0xfe74x54 + _0xba81[218] + _0xfe74xa[_0xba81[216]]);
            return false
        }
        ;if (typeof _0xfe74xa != _0xba81[4]) {
            console[_0xba81[69]](_0xba81[219]);
            return false
        }

Tuy nhiên chúng ta vẫn chỉ quan tâm đến hehe data đã pass vào, tuy giờ nó có tên _0xfe74xa các anh em hãy add nó vào watch list để tiện bề theo dõi.

Tại đây công việc khá đơn giản chỉ việc step overstep into khi cần cho đến khi các bạn thấy dòng 18, aha đây rồi

GibberishAES

Như vậy là phimmoi dùng aes để mã hoá, mã hoá này là 2 chiều do đó cần key để decode lại, không đâu xa, ngay dòng 18 chúng ta thấy luôn key.

GibberishAES[_0xba81[12]](_0xfe74xa[_0xba81[3]][_0xfe74xb][_0xba81[6]], _0xba81[10] + _0xfe74xa[_0xba81[11]])

// key cần tìm là đoạn nối chuổi
// _0xba81[10] + _0xfe74xa[_0xba81[11]]

với JS đã mã hoá như trên đoán dc 2 biến kia là gì gần như bằng 0, rất may browser một lần nữa lại đầy đủ đồ nghề, hãy add 2 biến vào watch list để thấy val của tụi nó.

alt text

Nhìn vào watch list trong hình thì mọi việc đã sáng tỏ, mật danh _0xba81[10] là PhimMoi.Net@ còn _0xfe74xa[_0xba81[11]] với giá trị 104695 chính là Id của tập phim hay nói cách khác là episodeId. Anh em xem hình coi đúng chưa đã :D

alt text

Như vậy chúng ta đã có trong tay password để giải mã, công đoạn tìm link video đến đây đã thành công.

Như đã hứa sẽ public toàn bộ source cho anh em down về vọc chơi, code cũng ko có gì ghê gớm cả, rất đơn giản và nhiều bug =))

Đây xin mời anh em: https://github.com/quocnguyen/phim

Dù có hứa sẽ làm video live stream từng dòng code và giải thích cụ thể cho anh em vừa coi vừa học nodejs luôn nhưng hồi chiều vợ rủ đi coi "your name" nên chưa quay tay kịp, sẽ update sớm :>

ps: your name hay vãi đái highly recommended.

0