Kage - Công cụ loại bỏ JavaScript khỏi website và lưu trữ ngoại tuyến
(github.com/tamnd)- Dùng Chrome không giao diện để render trang, chụp lại DOM cuối cùng mà người dùng thực sự nhìn thấy, sau đó xóa toàn bộ JavaScript và tải CSS·hình ảnh·phông chữ về đường dẫn cục bộ để tạo một bản sao tĩnh hoạt động không cần mã
- Giải quyết vấn đề các trang lưu bằng "Save As" sau một thời gian sẽ hỏng với màn hình trắng·spinner bị treo·các nỗ lực kết nối đến máy chủ analytics đã biến mất
- Cung cấp tệp
.htmlcó thể mở trực tiếp từ ổ đĩa mà không có theo dõi·gọi mạng·hành vi ngoài ý muốn
- Cung cấp tệp
- Dùng crawl theo chiều rộng để đọc
robots.txt, lấy điểm bắt đầu từsitemap.xmlvà chỉ ở lại trong host seed- Nhờ tính chất idempotent, cùng một trang chỉ được lấy một lần bất kể là http·https hay có/không có dấu gạch chéo cuối
- Khi nhấn Ctrl-C sẽ lưu vị trí và tiếp tục khi chạy lại; dùng
--refreshđể render lại,--forceđể bắt đầu mới
- Cung cấp các flag điều khiển phạm vi·hành vi crawl như
--max-pages,--max-depth,--scope-prefix,--subdomains,--scroll,--workers - Với
kage pack, có thể đóng gói bản sao thành một tệp duy nhất, chọn giữa kho lưu trữ ZIM hoặc tệp thực thi độc lập có thể tự hoạt động như một website- ZIM tương thích với hệ sinh thái Kiwix nên có thể xem bằng
kiwix-servehoặc ứng dụng Kiwix trên desktop·di động - Binary độc lập giúp người nhận không cần cài gì thêm, và có thể dùng
--baseđể tạo viewer cho hệ điều hành khác (khoảng 13 MiB + dung lượng website)
- ZIM tương thích với hệ sinh thái Kiwix nên có thể xem bằng
- Nhờ đóng gói có tính xác định, cùng một bản sao sẽ luôn tạo ra tệp giống hệt nhau ở mức byte; UUID của archive được suy ra từ nội dung nên an toàn cho checksum·cache
- Khi build với tag
webview, sẽ dùng WebView của hệ điều hành (WKWebView·WebView2·WebKitGTK) để mở trong cửa sổ riêng thay vì tab trình duyệt - Pipeline xử lý: seed URL → render bằng Chrome không giao diện → chụp final DOM → loại bỏ JS → nội địa hóa tài nguyên → lưu xuống đĩa
- Giấy phép MIT
1 bình luận
Ý kiến trên Hacker News
Tôi thấy tò mò về cách tạo ra ảnh GIF demo trong README nên đã xem: https://github.com/tamnd/kage/blob/01e75b87ecc893bbba7943c63...
Hóa ra nó dùng một dự án khác của cùng tác giả là https://github.com/tamnd/ascii-gif
Script dùng cho demo nằm ở https://github.com/tamnd/kage/blob/01e75b87ecc893bbba7943c63..., và cách chạy cũng có trong chú thích:
ascii-gif render docs/demo/kage.tape -o docs/static/demo.gifCó vẻ như là một wrapper mang đậm gu cá nhân bọc quanh https://github.com/charmbracelet/vhs
$HOME/bin/của tôi cũng có khá nhiều binary cá nhân kiểu này. Những thứ nhưdelete-all-npm,clean-rust-cache,download-youtube-playlist,get-markdown; điểm hay là không cần phải nhớ lệnhĐôi khi coding agent còn tự tìm ra cách gọi các công cụ này
Có thể dùng cái này khi bạn muốn giúp việc truy cập wiki công ty trở nên dễ dàng ngay cả khi offline. Ví dụ, có thể có tài liệu hữu ích trên wiki để dùng tại hiện trường nơi điện thoại không bắt được sóng
Việc có thể gói cả website thành một binary duy nhất rất ngầu, nhưng sẽ càng hay hơn nếu có phiên bản không cần serving process riêng
Có vẻ cũng có thể làm kiểu một shim với một điểm vào HTML duy nhất chứa một ít JavaScript để duyệt kho lưu trữ nội dung của site, nếu có thể thì ở dạng nhúng sẵn
Trong đầu tôi đã có sẵn một script/chương trình chuyển HTML sang Markdown, nên trên thực tế cũng có thể lưu mọi thứ thành một thư mục các file Markdown trên đĩa rồi commit vào Git repository
Cái này rất hay. Tôi đã muốn lấy một bản sao offline của prototype ai đó làm trên Lovable hay mấy nơi tương tự, để quản lý phiên bản và chia sẻ theo định dạng dễ hơn
Cách chúng tôi tiếp cận việc này được viết ở đây: https://productnow.ai/blogs/extracting-html-from-ai-prototyp...
Giờ tôi sẽ xem thử cái này và xem có thể thay đổi một vài phần không. Tôi thích ý tưởng mirror offline, và các use case liên quan đến cộng tác cũng trở nên đơn giản hơn nhiều
Có ghi
kage serve $HOME/data/kage/paulgraham.com, nhưng nếu đầu ra là tĩnh thì tôi không hiểu vì sao lại cần server. Không thể làm cho nó mở trực tiếp trong trình duyệt sao?Ví dụ nếu có thể như
$ firefox $HOME/data/kage/paulgraham.comthì đầu ra có thể dùng được cả trên máy không cài kagepython -m http.server. Tôi chưa thử nhưng có lẽ sẽ chạyThực ra Kage gồm hai phần. Một phần là crawler dùng để crawl trang, chụp DOM sau khi Chrome/Chromium render và biến nó thành HTML sạch, còn phần kia là thành phần pack/serve để đóng gói kết quả thành file ZIM cho Kiwix hoặc thành executable
Tôi nghĩ SingleFile [0] là một phiên bản vững chắc hơn nhiều so với cái này
Nó cũng loại bỏ toàn bộ JavaScript, nhưng gói mọi thứ vào một tệp HTML duy nhất rất dễ chia sẻ. Các tài sản nhị phân như web font hay hình ảnh được nhúng dưới dạng chuỗi base64
Nó cũng cung cấp CLI dựa trên Puppeteer [1]
[0]: https://github.com/gildas-lormeau/singlefile
[1]: https://github.com/gildas-lormeau/single-file-cli
Còn thứ đang được triển khai ở đây là mirror cả website, bao gồm cả các trang con, nên vẫn có thể duyệt toàn bộ khi ngoại tuyến. Ví dụ như toàn bộ các bài luận trên paulgraham.com
Tuy vậy, nếu Kage có thể kết hợp chất lượng tái hiện ở mức SingleFile với cách tiếp cận spidering kiểu HTTPTrack thì trông rất hứa hẹn. Ứng dụng trang đơn hơi khó để lưu trữ, nên tôi tò mò không biết Kage sẽ xử lý tốt đến mức nào
File -> Save as?Tôi đã thử sao chép một trang dùng HTTP, tức không phải HTTPS, nhưng gặp
navigation failed: net::ERR_NAME_NOT_RESOLVED. Ngay cả khi chỉ rõ giao thức bằnghttp://thì vẫn vậyTôi đã dùng httrack(https://www.httrack.com) để tải wiki về đọc trên máy bay. Nó không hoàn hảo, nhưng tốt hơn những thứ tôi từng tìm thấy trước đây
Tôi cũng sẽ thử cái này, và sẽ rất vui nếu kết quả tốt
https://wiki.openzim.org/wiki/Build_your_ZIM_file
EDIT: https://get.kiwix.org/en/solutions/applications/kiwix-reader...
Tôi đã sưu tầm khá nhiều kho lưu trữ các website cũ trong nhiều năm. Điều thú vị là các bản dump HTML xấu xí lại hữu ích hơn những bản lưu trữ “hoàn hảo”
Đó cũng là một trong những lý do khiến theo thời gian tôi càng thích RSS hơn. Nhiều feed từ khoảng 10 năm trước ngày nay còn dễ dùng hơn những website kiểu ứng dụng được bảo tồn công phu
Tôi sẽ dọn dẹp thêm một chút rồi sớm mã nguồn mở nó
Cái này có vẻ có khả năng tạo tải khá lớn cho website. Có thiết lập nào để điều tiết tốc độ sao chép hoặc tránh hình ảnh/video không?
Tôi cũng muốn biết liệu có cách chỉ lấy một phần của website hay không
Dự án gọn gàng và tôi thích ý tưởng này
Đọc lướt nhanh thì tôi thấy nó chạy Chrome với
--no-sandbox, có lý do cụ thể nào cho việc đó không? Xét về bảo mật thì đây có thể không phải ý hay. Nếu không có lý do đặc biệt, tôi khuyên nên bật sandboxDù sao thì đây vẫn là một công việc rất ấn tượng
--no-sandboxlà cần thiết trong Docker. Có lẽ là vì họ giả định nó chủ yếu sẽ chạy trong Docker?