一個只用 Gemini CLI 就能輕鬆簡單地獲得解釋的指令

3 min

language: ja bn en es hi pt ru zh-cn zh-tw

大家好,我是無能。
好久不見了。我一直在儲存能量。開玩笑的,我只是在偷懶而已。抱歉。

所以這只是一個小技巧,但由於 Gemini CLI 已經發布,對於 CLI 愛好者來說是個好消息。

我只是將這個指令放進了我的.bashrc中。

ghelp() {
 (echo "これを説明して" ; cat $1 ) | gemini
}

這沒什麼特別的,但它消除了原本需要透過瀏覽器才能讓 LLM 解釋程式碼的步驟,讓事情變得更輕鬆了。
例如,對於這個:
[curljs]

thepassenger:[haturatu]:~/git/curljs$ ghelp curl.js 
這段程式碼是一個 Node.js 腳本,它使用 [Puppeteer](https://pptr.dev/) 函式庫來獲取指定網頁的內容。

以下將解釋程式碼的各個部分在做什麼。

1.  **`const puppeteer = require('puppeteer');`**
    *   載入 Puppeteer 函式庫。這個函式庫用於以程式方式操作 Chrome 或 Chromium 瀏覽器。

2.  **`(async () => { ... })();`**
    *   這是一個「立即執行非同步函式」。透過將整個程式碼包裝在非同步函式中,可以在內部使用 `await` 關鍵字。`await` 是等待耗時操作(例如啟動瀏覽器或載入頁面)完成所必需的。

3.  **`const url = process.argv[2];`**
    *   將從命令列傳遞的第三個參數儲存到 `url` 變數中。
    *   例如:如果執行 `node script.js https://example.com`,則 `process.argv[2]` 將包含 `https://example.com`。

4.  **`if (!url) { ... }`**
    *   如果未指定 URL,則顯示錯誤訊息,並使用 `process.exit(1)` 異常終止腳本。

5.  **`const browser = await puppeteer.launch({ headless: true });`**
    *   啟動一個新的瀏覽器實例。
    *   `headless: true` 是在背景執行而不顯示瀏覽器 UI(畫面)的設定。如果在偵錯時需要視覺化瀏覽器操作,請將其設為 `false`。

6.  **`const page = await browser.newPage();`**
    *   在啟動的瀏覽器中開啟一個新的分頁(頁面)。

7.  **`await page.goto(url, { waitUntil: 'networkidle2' });`**
    *   導航到指定的 URL。
    *   `waitUntil: 'networkidle2'` 是一個重要的選項,用於等待頁面載入。它會等待直到網路連線少於兩個,並且在 500 毫秒內沒有新的連線。這有助於正確顯示現代網站(例如 SPA),這些網站會透過 JavaScript 動態載入內容。

8.  **`await new Promise(resolve => setTimeout(resolve, 5000));`**
    *   頁面載入完成後,再等待 5 秒。
    *   這是為了等待僅靠 `networkidle2` 無法完成載入的動畫或在特定操作後顯示的內容而插入的額外等待時間。

9.  **`const html = await page.content();`**
    *   獲取頁面的完整 HTML 內容。這包括所有由 JavaScript 動態生成的 HTML 元素。

10. **`console.log(html);`**
    *   將獲取的 HTML 輸出到控制台。

11. **`await browser.close();`**
    *   關閉瀏覽器實例並釋放資源。如果忘記這樣做,程序可能會繼續運行而不會終止。

### 總結

這個腳本執行的處理是:**「獲取命令列中指定 URL 的網頁,並在 JavaScript 執行完成的最終狀態下,將其 HTML 內容輸出到標準輸出。」**

這是一種非常方便的方法,適用於想要獲取無法透過簡單 HTTP 請求取得的、由 JavaScript 動態渲染的網站(例如 SPA)的資訊(例如網路爬蟲)。

它會像這樣輸出。
嗯,就這樣而已啦...。

Related Posts