Hướng dẫn tự động tìm và tải về các phần mềm của NirSoft.

Các phần mềm NirSoft

NirSoft là nơi chứa bộ sưu tập các công cụ phần mềm hệ thống miễn phí “tuy nhỏ nhưng cực kỳ có võ” được phát triển bởi thanh niên Nir Sofer có địa chỉ tại nirsoft.net.

Một trong những công cụ tôi hay dùng nhất chính là dòng lệnh NirCmd.

Ở bài viết này tôi không có ý định nói về mục đích hay cách sử dụng các công cụ này mà vấn đề của tôi là làm sao tải hết chỗ phần mềm ở đó về máy vì …nhiều quá, mỗi cái một trang nhưng lại không có tùy chọn cho tải hết về.

Ừ thì đương nhiên bạn chỉ nên chọn phần mềm nào cần thiết thì mới tải về thôi, nhưng tôi lại coi việc tải hết app từ trang web của anh bạn này là một thử thách vui vẻ.

Tải các phần mềm NirSoft

Các phần mềm NirSoft được liệt kê tại mục All Utilities. đây là một danh sách cỡ hơn 250 phần mềm khác nhau. Mỗi phần mềm lại được mô tả trong một trang HTML và có link tải ở phía dưới cùng. Có thể là bộ cài .exe hoặc file .zip, bản 32-bit hoặc 64-bit.

Như vậy để tim đến link tải phần mềm, ta cần một công cụ web scraper dò tìm theo quy luật như trên. Tôi quyết định chọn Nightmare.js.

Lấy danh sách tải phần mềm NirSoft với NightmareJS

Trước dây tôi hay dùng PhantomJS để đào web, nhưng PhantomJS có rất nhiều giới hạn: Quá nhiều API rườm rà, code viết rất dài và nested và đặc biệt là không hỗ trợ JavaScript ES6. Trái lại, Nightmare.js khắc phục được những vấn đề trên.

Để sử dụng được Nightmare.js thì trước hết bạn cần phải cài đặt Node.js.

Cài đặt module Nightmare.js bằng npm như sau:

npm install nightmare --save-dev

Đoạn mã findapps.js dưới đây sử dụng 2 instance Nightmare để đào website NirSoft

  • 1 instance duyệt trang All Utilities để lấy danh sách web page phần mềm.
  • 1 instance để duyệt từng web page để tìm danh sách link tải về.

Đầu ra của script là một danh sách thông tin về link tải. Tôi không muốn dùng Nightmare để tải file vì đó không phải là thế mạnh của các headless browser.

findapps.js

const Nightmare = require('nightmare');

const nightmare1 = Nightmare({ show: false });
const nightmare2 = Nightmare({ show: false });

// A forEach() function with async callback
Array.prototype.asyncForEach = async function(callback/*, thisArg*/){
  var T, k;

  if (arguments.length > 1)
    T = arguments[1];

  var O = Object(this);
  var len = O.length >>> 0;

  k = 0;
  while (k < len) {
    var kValue;
    if (k in O) {
      kValue = O[k];
      await callback.call(T, kValue, k, O);
    }
    k++;
  }
};

// Open the All Utilities page
nightmare1.goto("https://www.nirsoft.net/utils/index.html")
  // Collect all links to an array
  .evaluate(() => [...document.querySelectorAll('tr.filesrow > td > a')]
      .map( a => [ a.innerText, a.href ] ))
  .end()
  .then(apps => {
    apps.asyncForEach(async function(app, index) {
      try {
        await nightmare2.goto(app[1])
          .wait(5000) // wait until the web is loaded
          .evaluate( name => {
            return [ ...document.querySelectorAll('a.downloadline') ]
              .map(a => [ a.href, name, window.location.href ])
          }, app[0] )
          .then(dl => {
            dl.forEach(info => {
              // Print the link info to console
              console.log( info.join('|') );
            });
          });
      } catch (error) {
        console.error(error);
        process.exit(1);
      }
      if (apps.length == index + 1)
        await nightmare2.end();
    });
  });

Tải các phần mềm NirSoft

Từ danh sách link phần mềm trên, tôi dùng lệnh tải file rất mạnh là aria2c– hỗ trợ resume và download nhiều luồng. Nếu là trên Windows, bạn có thể cài đặt Cygwin để có aria2c và chạy được Shell script dưới đây.

download.sh

#!/bin/bash

# Output directory
cd "${1}"
cd ..

# Read the input file, the arguments are separated by "|" 
while IFS="|" read url name referer; do
  # Each app is downloaded to a separated directory
  mkdir -p "${name}"

  cd "${name}"
  echo "Downloading: ${name}"
  aria2c -s 4 -x 4 --referer=${referer} ${url}
  cd -

  sleep 5 # a short break to avoid blacklisted
done

Kết luận

Vậy để tải các phần mềm NirSoft, ta kết hợp hai công cụ như sau:

node findapp.js > nirsoft.txt
./download.sh /path/to/setup/nirsoft < nirsoft.txt

Ngồi đợi thôi, lâu phết đấy!