切換語言為:簡體

Go怎麼檢測使用者本地有沒有安裝chrome啊?

  • 爱糖宝
  • 2024-10-20
  • 2043
  • 0
  • 0

前言

起因,是因為我之前做過用 go 直接開啟瀏覽器服務,然後在昨天遇到了一位大佬的業務,大佬使用 python 做了一個指令碼,並打包成 exe 檔案,讓我幫其測試,但是在我電腦上會報錯,找不到 chrome.exe 執行檔案,但是我電腦是安裝了 chrome 的,所以我問是不是本地ok,這就說明是程式碼中 chrome 路徑問題了,我一想之前好像也遇到過同樣的問題,於是有了這篇文章。

這是一篇教程型別文章,在本教程中,將介紹如何使用 Go 語言來檢測使用者系統上是否安裝了 Google Chrome(或 Chromium 和 Microsoft Edge等相容瀏覽器)。這篇文章中將介紹如何檢測 MacOS、Window、Linux作業系統上是否安裝的方法。此外,如果使用者沒有安裝還會提示使用者下載 Chrome

後續會給出完整程式碼。

為什麼要檢測Chrome?

在開發依賴 Chromium 的瀏覽器來執行某些任務的應用程式時,檢測是否安裝了 Chrome 就非常重要了。瞭解瀏覽器是否可用有助於透過自動開啟瀏覽器或指導使用者在必要時安裝瀏覽器來為使用者提供無縫體驗。

接下來讓我們探討如何檢查 Chrome 及其處理確實的情況。

Step1: 使用環境變數檢查 Chrome

檢測一個東西是否安裝的最快方法就是查詢環境變數了。在某些情況下,使用者可以透過環境變數來指定 Chrome 的路徑,特別是在使用自定義瀏覽器或配置時。

例如:如果建立一個環境變數 LORCACHROME,可以先查詢該路徑以避免不必要的檢查。

if path, ok := os.LookupEnv("LORCACHROME"); ok {
    if _, err := os.Stat(path); err == nil {
       return path
    }
}

在上述程式碼中,使用了 os.LookupEnv 來檢查 LORCACHROME 環境變來給你是否已設定。如果是,再使用 os.Stat 驗證路徑在系統中是否真實有效。如果檔案在系統中存在,意味著瀏覽器安裝在指定路徑,我們返回該路徑。這一判斷為喜歡自定義配置路徑的使用者提供了高效檢測。

Step2: 系統相關的搜尋路徑

接下來,需要擴大搜索範圍到環境變數之外,並在預設安裝路徑中搜索 ChromeChromium。這個過程因作業系統而異,因為需要具體處理每種情況。

MacOS

對於 MacOS 使用者,Chrome 安裝通常位於 /Applications 中,以及可能透過包安裝在 /usr/bin, 這時候就需要檢查這些常用路徑:

paths := []string{
    "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
    "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
    "/Applications/Chromium.app/Contents/MacOS/Chromium",
    "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
    "/usr/bin/google-chrome-stable",
    "/usr/bin/google-chrome",
    "/usr/bin/chromium",
    "/usr/bin/chromium-browser",
}

如果 Chrome 安裝在這些預設目錄中,將會返回找到的第一個有效路徑。

Windows

Windows 系統中,ChromeChromium 通常安裝在 Program FilesLocalAppData 目錄下。該程式碼檢查 64位 和 32位程式目錄以及 Edge:

paths := []string{
    os.Getenv("LocalAppData") + "/Google/Chrome/Application/chrome.exe",
    os.Getenv("ProgramFiles") + "/Google/Chrome/Application/chrome.exe",
    os.Getenv("ProgramFiles(x86)") + "/Google/Chrome/Application/chrome.exe",
    os.Getenv("LocalAppData") + "/Chromium/Application/chrome.exe",
    os.Getenv("ProgramFiles") + "/Chromium/Application/chrome.exe",
    os.Getenv("ProgramFiles(x86)") + "/Chromium/Application/chrome.exe",
    os.Getenv("ProgramFiles(x86)") + "/Microsoft/Edge/Application/msedge.exe",
    os.Getenv("ProgramFiles") + "/Microsoft/Edge/Application/msedge.exe",
}

在這裏使用 os.Getenv() 獲取 ProgramFilesLocalAppData 等環境變數的值,它們是重要的系統特定路徑。

Linux

Linux 中可能透過包管理或者 Snap 安裝 Chrome 或 Chromium。這些路徑是許多發行版的標準路徑:

paths = []string{
    "/usr/bin/google-chrome-stable",
    "/usr/bin/google-chrome",
    "/usr/bin/chromium",
    "/usr/bin/chromium-browser",
    "/snap/bin/chromium",
}

在這裏,檢查 /usr/bin/snap/bin 中的二進制檔案,它們都是Linux應用程式的常見位置。

Step3: 檢查 Chrome 是否存在

現在每個作業系統的潛在路徑都有一個列表,透過迴圈便利它們並檢查 Chrome 是否存在:

for _, path := range paths {
    if _, err := os.Stat(path); os.IsNotExist(err) {
       continue
    }
    return path
}

在上述程式碼中,遍歷了每個列表路徑,使用os.Stat來驗證檔案是否存在。如果是,立即返回路徑。如果沒有,那就繼續檢查下一個路徑。如果都沒有包含有效安裝,將返回一個空字串

Step4: 處理沒有安裝 Chrome 的情況

如果使用者系統上沒有安裝 Chrome 怎麼辦?我們可以透過提示使用者下載並安裝 Chrome 來處理這種情況。 我們定義一個函式在使用者預設瀏覽器中開啟 Chrome 頁面:

func PromptDownload() {
    // Open download page
    url := "https://www.google.com/chrome/"
    switch runtime.GOOS {
    case "linux":
       exec.Command("xdg-open", url).Run()
    case "darwin":
       exec.Command("open", url).Run()
    case "windows":
       r := strings.NewReplacer("&", "^&")
       exec.Command("cmd", "/c", "start", r.Replace(url)).Run()
    }
}

這個函式中構造了 Chrome 下載頁面的 URL,然後,他使用每個作業系統的系統命令開啟連結:

  • MacOS:open命令在預設瀏覽器中開啟url。

  • Windows: cmd命令使用start開啟url。

  • Linux:xdg-open命令用於預設瀏覽器開啟url。

透過將這些程式碼,可以無縫重定向到使用者安裝 Chrome 的頁面。

完整程式碼

package main

import (
    "os"
    "os/exec"
    "runtime"
    "strings"
)

func LocateChrome() string {
    if path, ok := os.LookupEnv("LORCACHROME"); ok {
       if _, err := os.Stat(path); err == nil {
          return path
       }
    }

    var paths []string
    switch runtime.GOOS {
    case "darwin":
       paths = []string{
          "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
          "/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
          "/Applications/Chromium.app/Contents/MacOS/Chromium",
          "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge",
          "/usr/bin/google-chrome-stable",
          "/usr/bin/google-chrome",
          "/usr/bin/chromium",
          "/usr/bin/chromium-browser",
       }
    case "windows":
       paths = []string{
          os.Getenv("LocalAppData") + "/Google/Chrome/Application/chrome.exe",
          os.Getenv("ProgramFiles") + "/Google/Chrome/Application/chrome.exe",
          os.Getenv("ProgramFiles(x86)") + "/Google/Chrome/Application/chrome.exe",
          os.Getenv("LocalAppData") + "/Chromium/Application/chrome.exe",
          os.Getenv("ProgramFiles") + "/Chromium/Application/chrome.exe",
          os.Getenv("ProgramFiles(x86)") + "/Chromium/Application/chrome.exe",
          os.Getenv("ProgramFiles(x86)") + "/Microsoft/Edge/Application/msedge.exe",
          os.Getenv("ProgramFiles") + "/Microsoft/Edge/Application/msedge.exe",
       }
    default:
       paths = []string{
          "/usr/bin/google-chrome-stable",
          "/usr/bin/google-chrome",
          "/usr/bin/chromium",
          "/usr/bin/chromium-browser",
          "/snap/bin/chromium",
       }
    }

    for _, path := range paths {
       if _, err := os.Stat(path); os.IsNotExist(err) {
          continue
       }
       return path
    }
    return ""
}

func PromptDownload() {
    // Open download page
    url := "https://www.google.com/chrome/"
    switch runtime.GOOS {
    case "linux":
       exec.Command("xdg-open", url).Run()
    case "darwin":
       exec.Command("open", url).Run()
    case "windows":
       r := strings.NewReplacer("&", "^&")
       exec.Command("cmd", "/c", "start", r.Replace(url)).Run()
    }
}

總結

本教程介紹了使用 Go 檢測跨多個作業系統的 Chrome 安裝所涉及的步驟。我們首先檢查了環境變數,然後搜尋常用瀏覽器安裝的系統相關路徑,最後透過提示使用者下載來處理 Chrome 未安裝的情況。

如果細心的人或許已經發現是否有點眼熟呢!知道的可以討論下!

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.