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: 系统相关的搜索路径
接下来,需要扩大搜索范围到环境变量之外,并在默认安装路径中搜索 Chrome
或 Chromium
。这个过程因操作系统而异,因为需要具体处理每种情况。
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
系统中,Chrome
和 Chromium
通常安装在 Program Files
或 LocalAppData
目录下。该代码检查 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()
获取 ProgramFiles
和 LocalAppData
等环境变量的值,它们是重要的系统特定路径。
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 未安装的情况。
如果细心的人或许已经发现是否有点眼熟呢!知道的可以讨论下!
转载自:https://juejin.cn/post/7426994375057014836