From 1aa29a6262784169bf10da935dc5087dfafb3065 Mon Sep 17 00:00:00 2001 From: XOF Date: Wed, 17 Dec 2025 01:55:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20main.go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 76 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/main.go b/main.go index 384fc8a..9929cd3 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "crypto/md5" "crypto/subtle" + "encoding/base64" "encoding/xml" "fmt" "html/template" @@ -22,7 +23,7 @@ const ( downloadDir = "./chrome_versions" checkInterval = 24 * time.Hour maxRetries = 3 - updateXMLURL = "https://tools.google.com/service/update2" + updateURL = "https://tools.google.com/service/update2" ) var ( @@ -38,23 +39,11 @@ type Version struct { Time time.Time } -type UpdateCheck struct { - XMLName xml.Name `xml:"request"` - OS struct { - Platform string `xml:"platform,attr"` - Arch string `xml:"arch,attr"` - } `xml:"os"` - App struct { - AppID string `xml:"appid,attr"` - Version string `xml:"version,attr"` - Lang string `xml:"lang,attr"` - UpdateCheck struct{} `xml:"updatecheck"` - } `xml:"app"` -} - type UpdateResponse struct { - XMLName xml.Name `xml:"response"` - App struct { + XMLName xml.Name `xml:"response"` + Protocol string `xml:"protocol,attr"` + App struct { + Status string `xml:"status,attr"` UpdateCheck struct { Status string `xml:"status,attr"` URLs struct { @@ -63,13 +52,14 @@ type UpdateResponse struct { } `xml:"url"` } `xml:"urls"` Manifest struct { - Version string `xml:"version,attr"` + Version string `xml:"version,attr"` Packages struct { Package struct { - Name string `xml:"name,attr"` - Required bool `xml:"required,attr"` - Size int64 `xml:"size,attr"` - Hash string `xml:"hash_sha256,attr"` + Name string `xml:"name,attr"` + Required bool `xml:"required,attr"` + Size int64 `xml:"size,attr"` + Hash string `xml:"hash,attr"` + HashSHA256 string `xml:"hash_sha256,attr"` } `xml:"package"` } `xml:"packages"` } `xml:"manifest"` @@ -117,42 +107,51 @@ func monitor() { } } -func getLatestVersionInfo() (version, downloadURL string, err error) { +func getLatestVersionInfo() (version, downloadURL, sha256 string, err error) { reqBody := ` - - - - - - + + + + + + + ` - resp, err := http.Post(updateXMLURL, "application/xml", strings.NewReader(reqBody)) + resp, err := http.Post(updateURL, "application/xml", strings.NewReader(reqBody)) if err != nil { - return "", "", err + return "", "", "", err } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) - log.Printf("Update response: %s", string(body)) var updateResp UpdateResponse if err := xml.Unmarshal(body, &updateResp); err != nil { - return "", "", err + return "", "", "", err } version = updateResp.App.UpdateCheck.Manifest.Version + sha256 = updateResp.App.UpdateCheck.Manifest.Packages.Package.HashSHA256 + packageName := updateResp.App.UpdateCheck.Manifest.Packages.Package.Name + if len(updateResp.App.UpdateCheck.URLs.URL) > 0 { - codebase := updateResp.App.UpdateCheck.URLs.URL[0].Codebase - packageName := updateResp.App.UpdateCheck.Manifest.Packages.Package.Name - downloadURL = codebase + packageName + for _, url := range updateResp.App.UpdateCheck.URLs.URL { + if strings.HasPrefix(url.Codebase, "https://dl.google.com") { + downloadURL = url.Codebase + packageName + break + } + } + if downloadURL == "" { + downloadURL = updateResp.App.UpdateCheck.URLs.URL[0].Codebase + packageName + } } - return version, downloadURL, nil + return version, downloadURL, sha256, nil } func checkAndDownload() { - version, downloadURL, err := getLatestVersionInfo() + version, downloadURL, sha256, err := getLatestVersionInfo() if err != nil { log.Printf("Failed to get version info: %v", err) return @@ -160,6 +159,7 @@ func checkAndDownload() { log.Printf("Latest Chrome version: %s", version) log.Printf("Download URL: %s", downloadURL) + log.Printf("SHA256: %s", sha256) if downloadURL == "" { log.Println("No download URL found")