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

 更新时间:2024年10月21日 08:21:39   作者:陪我去看海  
这篇文章主要为大家详细介绍了如何使用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,然后,他使用每个操作系统的系统命令打开链接:

  • 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 未安装的情况。

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

相关文章

  • Go结合MQTT实现通信的示例代码

    Go结合MQTT实现通信的示例代码

    本文主要介绍了Go结合MQTT实现通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • goland 导入github包报红问题解决

    goland 导入github包报红问题解决

    本文主要介绍了Go项目在GoLand中导入依赖标红问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • Go程序员踩过的defer坑错误处理

    Go程序员踩过的defer坑错误处理

    这篇文章主要为大家介绍了Go程序员踩过的defer坑错误处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 浅谈go语言renderer包代码分析

    浅谈go语言renderer包代码分析

    本篇文章主要介绍了浅谈go语言renderer包代码分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 一文带你了解Go中的内存对齐

    一文带你了解Go中的内存对齐

    一旦涉及到较为底层的编程,特别是与硬件交互,内存对齐是一个必修的课题,所以这篇文章小编就想来和大家聊一聊Go语言中的内存对齐,希望对大家有所帮助
    2023-10-10
  • go连接mysql的项目实践

    go连接mysql的项目实践

    本文主要介绍了go连接mysql的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Go语言的io输入输出流方式

    Go语言的io输入输出流方式

    Go语言中,输入输出流的处理通过io库中的Reader和Writer接口来实现,Reader接口定义了Read方法,用于从流中读取数据到程序中,Writer接口定义了Write方法,用于将数据写入到底层的数据流中,这些接口被许多标准库的类型所实现
    2024-10-10
  • go语言学习之包和变量详解

    go语言学习之包和变量详解

    这篇文章主要给大家爱介绍了关于go语言学习之包和变量的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用go语言具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • 关于golang中平行赋值浅析

    关于golang中平行赋值浅析

    这篇文章主要给大家介绍了关于golang中平行赋值的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用golang具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • Go语言基础学习之指针详解

    Go语言基础学习之指针详解

    Go 语言中指针是很容易学习的,Go 语言中使用指针可以更简单的执行一些任务。所以本文就来和大家聊聊Go语言中指针的定义与使用,需要的可以参考一下
    2022-12-12

最新评论