From 0b04eca16af8de94077ba28bcb9f2ec9c586fff2 Mon Sep 17 00:00:00 2001 From: XOF Date: Wed, 17 Dec 2025 01:50:06 +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 | 89 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 70 insertions(+), 19 deletions(-) diff --git a/main.go b/main.go index 0774ddd..384fc8a 100644 --- a/main.go +++ b/main.go @@ -3,7 +3,7 @@ package main import ( "crypto/md5" "crypto/subtle" - "encoding/json" + "encoding/xml" "fmt" "html/template" "io" @@ -22,8 +22,7 @@ const ( downloadDir = "./chrome_versions" checkInterval = 24 * time.Hour maxRetries = 3 - versionAPI = "https://versionhistory.googleapis.com/v1/chrome/platforms/win64/channels/stable/versions" - chromeURL = "https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26iid%3D%7B00000000-0000-0000-0000-000000000000%7D%26lang%3Dzh-CN%26browser%3D4%26usagestats%3D0%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26ap%3Dx64-stable-statsdef_1%26installdataindex%3Dempty/chrome/install/ChromeStandaloneSetup64.exe" + updateXMLURL = "https://tools.google.com/service/update2" ) var ( @@ -39,12 +38,43 @@ type Version struct { Time time.Time } -type ChromeVersion struct { - Version string `json:"version"` +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 ChromeVersionResponse struct { - Versions []ChromeVersion `json:"versions"` +type UpdateResponse struct { + XMLName xml.Name `xml:"response"` + App struct { + UpdateCheck struct { + Status string `xml:"status,attr"` + URLs struct { + URL []struct { + Codebase string `xml:"codebase,attr"` + } `xml:"url"` + } `xml:"urls"` + Manifest struct { + 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"` + } `xml:"package"` + } `xml:"packages"` + } `xml:"manifest"` + } `xml:"updatecheck"` + } `xml:"app"` } func init() { @@ -87,33 +117,54 @@ func monitor() { } } -func getLatestVersion() (string, error) { - resp, err := http.Get(versionAPI) +func getLatestVersionInfo() (version, downloadURL string, err error) { + reqBody := ` + + + + + + +` + + resp, err := http.Post(updateXMLURL, "application/xml", strings.NewReader(reqBody)) if err != nil { - return "", err + return "", "", err } defer resp.Body.Close() - var versionResp ChromeVersionResponse - if err := json.NewDecoder(resp.Body).Decode(&versionResp); err != nil { - return "", err + 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 } - if len(versionResp.Versions) == 0 { - return "", fmt.Errorf("no versions found") + version = updateResp.App.UpdateCheck.Manifest.Version + 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 } - return versionResp.Versions[0].Version, nil + return version, downloadURL, nil } func checkAndDownload() { - version, err := getLatestVersion() + version, downloadURL, err := getLatestVersionInfo() if err != nil { - log.Printf("Failed to get version: %v", err) + log.Printf("Failed to get version info: %v", err) return } log.Printf("Latest Chrome version: %s", version) + log.Printf("Download URL: %s", downloadURL) + + if downloadURL == "" { + log.Println("No download URL found") + return + } // 检查是否已存在该版本 files, _ := os.ReadDir(downloadDir) @@ -128,7 +179,7 @@ func checkAndDownload() { client := &http.Client{} for i := 0; i < maxRetries; i++ { - resp, err := client.Get(chromeURL) + resp, err := client.Get(downloadURL) if err != nil { log.Printf("Attempt %d failed: %v", i+1, err) time.Sleep(time.Duration(i+1) * 10 * time.Second)