Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go检测本地是否安装chrome

如何使用Go检测用户本地是否安装chrome

作者:陪我去看海

这篇文章主要为大家详细介绍了如何使用Go检测用户本地是否安装chrome,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

前言

起因,是因为我之前做过用 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,然后,他使用每个操作系统的系统命令打开链接:

通过将这些代码,可以无缝重定向到用户安装 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 未安装的情况。

到此这篇关于如何使用Go检测用户本地是否安装chrome的文章就介绍到这了,更多相关Go检测本地是否安装chrome内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家

您可能感兴趣的文章:
阅读全文