下载官方旧版本 Chrome 并禁止更新

2024-07-30 • 更新于 2025-09-07

已经忍 Chrome 很久了,但是如果换其他浏览器,想想那一堆扩展脚本密码书签就头疼。整天提醒更新,不知道更新了个什么玩意,反而把原来的功能改成依托答辩。

万万没想到,在三哥的英明领导下,狗鸽又拉了几坨大的:

  • 想要复制下载链接只能到下载记录里。
  • 升级到 127.0.6533.73,下载记录没有链接了,光标移动到上面都不行,只能看到域名。
  • 升级到 128.0.6613.138,这下连域名都看不到了,只有在下载完成后光标移到文件名上有链接。
  • 129 以后,Catalina 也不支持了。

地铁老人手机.jpg

就有没有一种可能,我只想获取文件的真实链接呢?这就是地球上最流行的浏览器吗?张小龙都觉得抽象。

于是去找历史版本,结果狗鸽居然不提供,只给过时系统提供最后一个版本。

去第三方网站 uptodown.com 下载最新版,和狗鸽官网的 sha256 都对不上,这尼玛谁敢用?

也翻了很多号称官方下载的帖子,这些工具号称是 Chrome,其实都是 Chromium,我也是服了。

最后终于找到了一个获取 Chrome 官方链接的 Python 脚本1,不过只能获取 macOS 版 Chrome,用 Shell 重写了一下。

还找到一个 Windows 适用的2,但是没试过。

2025 年 9 月 6 日更新:

沟槽的狗哥,go1.25 害我不得不升级 macOS。

但是我明明已经禁止了更新程序,它在后台不知道怎么就偷偷把 Chrome 升级到 140 了。而且就算装回旧版本,一重启就变成新版。

关键是它给强制升级到 Manifest V3 了。

这次在文末更新一下禁止更新的方法。

Shell 脚本

get-chrome.sh
#!/usr/bin/env sh

set -e

UUID=$(uuidgen | tr '[:upper:]' '[:lower:]')
PLATFORM=mac
OS_VERSION=
TARGET_VERSION_PREFIX=

error() { printf "%s\n" "$@" >&2; }

if [ "$(uname)" = Darwin ]; then
  OS_VERSION=$(sw_vers -productVersion | grep -o '[[:digit:]]\+\.[[:digit:]]\+')
fi

PRINT_ALL_LINKS=false
PRINT_SHA256=false
SHA_256=

SCRIPT=$(basename "$0")

USAGE=$(
  cat <<-END
Usage: $SCRIPT [<options>]
Get official download link of Chrome for macOS.

  -o <os_version>             set OS version, e.g. '10.15'
  -t <target_version_prefix>  set target version prefix of Chrome, e.g. '126'
  -a                          print all available links (by default, print first HTTPS link only)
  -s                          print sha256 checksum
  -h                          display this help and exit

Home page: <https://binac.org/posts/download-an-old-version-of-chrome/>
END
)

_exit() {
  error "$USAGE"
  exit 2
}

while getopts "asho:t:" c; do
  case $c in
  o) OS_VERSION=$OPTARG ;;
  t) TARGET_VERSION_PREFIX=$OPTARG ;;
  a) PRINT_ALL_LINKS=true ;;
  s) PRINT_SHA256=true ;;
  h) error "$USAGE" && exit ;;
  *) _exit ;;
  esac
done

[ -z "$OS_VERSION" ] && error "OS version not set" && exit 2

URL="https://tools.google.com/service/update2"

DATA="<request protocol=\"3.0\" requestid=\"$UUID\">
    <os platform=\"$PLATFORM\" version=\"$OS_VERSION\" />
    <app appid=\"com.google.Chrome\" lang=\"en-us\">
        <updatecheck targetversionprefix=\"$TARGET_VERSION_PREFIX\"/>
    </app>
</request>"

CONTENT=$(curl -fsSL -X POST "$URL" -d "$DATA")

LINKS=$(echo "$CONTENT" | grep -o 'https\?://[^"]*')
NAME=$(echo "$CONTENT" | grep -o ' name="[^"]*' | cut -c 8-)

if [ "$PRINT_ALL_LINKS" = false ]; then
  LINKS=$(echo "$LINKS" | grep -o 'https://[^"]*' | head -1)
fi
for link in $LINKS; do
  echo "$link$NAME"
done

SHA_256=$(echo "$CONTENT" | grep -o 'hash_sha256="[^"]*' | cut -c 14-)
if [ "$PRINT_SHA256" = true ]; then
  error "sha256 $SHA_256"
fi

默认输出第一个 HTTPS 链接,用 -o 指定系统版本(需要注意,见后文),-t 指定大版本,-a 打印所有链接,-s 打印 sha256,例如:

$ get-chrome.sh -o 11 -t 126 -s
https://redirector.gvt1.com/edgedl/release2/chrome/c27alpqp6yqlnckxwaxrg35r2y_126.0.6478.183/GoogleChrome-126.0.6478.183.dmg
sha256 7bb3660120eb9e857f371b390f470a530ef2e956e6426a14b4193751684393f6

脚本是从 tools.google.com 获取,得到链接域名是 gvt1.com,这应该也是狗鸽的域名。

狗鸽最贱的一点是,对废弃的系统,它只会返回最后支持的版本。

比如对 Mojave(10.14),它就只返回 116.0.5845.187。对 Catalina(10.15),它就只返回 128.0.6613.138,即使 128 以前的版本也可用。

只有用 -o 11 指定系统为 Big Sur(11)时,它才会老实,但也只能得到支持 Big Sur 以后的版本(>=122),目前版本如下(均可用于 Catalina):

$ for v in $(seq 100 128); do get-chrome.sh -o 11 -t "$v" -s; done
https://redirector.gvt1.com/edgedl/release2/chrome/mem3daavyalw3ej62rqnfxrt4e_122.0.6261.129/GoogleChrome-122.0.6261.129.dmg
sha256 655542b6a1cf41d4982a2c1353310855dfa03834d18253f54910cca0289fa6a1
https://redirector.gvt1.com/edgedl/release2/chrome/ad5yyrouti3mrydk3xx37nwvpiga_123.0.6312.124/GoogleChrome-123.0.6312.124.dmg
sha256 8393cf83853624488e1ac31633c2787686b0c5b8ddec5d86ce96611ad29f3237
https://redirector.gvt1.com/edgedl/release2/chrome/pyibrq4fvbzbiecijliwb7oyxa_124.0.6367.208/GoogleChrome-124.0.6367.208.dmg
sha256 698b37c47639941443616cb629b2a1f13f45b0a856848d97905ebb5440d06c09
https://redirector.gvt1.com/edgedl/release2/chrome/i5incd454szmu3rscl5w6r5qga_125.0.6422.142/GoogleChrome-125.0.6422.142.dmg
sha256 0a2f19d0a00c256dc6ed005abdcda43c7c1a91fc5dadfb781e33972be8be91dc
https://redirector.gvt1.com/edgedl/release2/chrome/c27alpqp6yqlnckxwaxrg35r2y_126.0.6478.183/GoogleChrome-126.0.6478.183.dmg
sha256 7bb3660120eb9e857f371b390f470a530ef2e956e6426a14b4193751684393f6
https://redirector.gvt1.com/edgedl/release2/chrome/adqui4t7hzlljw2m2mmu2dvb6tmq_127.0.6533.120/GoogleChrome-127.0.6533.120.dmg
sha256 91f5024eef012067194cc69bcb48b294e085c48fa92d772af5f2a8da8c3a1eb3
https://redirector.gvt1.com/edgedl/release2/chrome/gtm24cqmnwgcp7dtscvlmsbrwa_128.0.6613.138/GoogleChrome-128.0.6613.138.dmg
sha256 c1dea7dc078ac4a773fb95fd5f14e2d501f3981cb329180859c7378811e1b59b

我对这些版本都做了备份,虽然大概率没什么用。需要的可以联系我。

对 10.* 所有版本运行结果如下(这些下载链接在官网的“其他平台”可以找到):

$ for o in $(seq 0 15); do get-chrome.sh -o "10.$o" -s && echo "^^^ 10.$o ^^^"; done
https://dl.google.com/release2/b7c5syhum0krv8iwaxqj75m937t1mxerm4vt7t39qyqq7foxhnpagw0908czwsgdwz9v1phqybtkyzal6afib1gu2x59e3r0px1/GoogleChrome-49.0.2623.112-Beta.dmg
sha256 b8fb5e4795ff5d4e7501f88b432da558fd54cd3afe078e1cfcd37a917ae5b711
^^^ 10.6 ^^^
https://dl.google.com/release2/b7c5syhum0krv8iwaxqj75m937t1mxerm4vt7t39qyqq7foxhnpagw0908czwsgdwz9v1phqybtkyzal6afib1gu2x59e3r0px1/GoogleChrome-49.0.2623.112-Beta.dmg
sha256 b8fb5e4795ff5d4e7501f88b432da558fd54cd3afe078e1cfcd37a917ae5b711
^^^ 10.7 ^^^
https://redirector.gvt1.com/edgedl/release2/chrome/fOFsZ-5dHaI_65.0.3325.181/GoogleChrome-65.0.3325.181.dmg
sha256 c66f934750643c18e09f09f3103e235d3b6d48dda44dac9993ca53cf95db0d2d
^^^ 10.9 ^^^
https://redirector.gvt1.com/edgedl/release2/chrome/fnc67wptv5dybsdbrounkk36mu_103.0.5060.134/GoogleChrome-103.0.5060.134.dmg
sha256 cec46f072974f5eb82f660328d395cde5c3e6b2056e5ccba628a7af1c722123a
^^^ 10.11 ^^^
https://redirector.gvt1.com/edgedl/release2/chrome/fnc67wptv5dybsdbrounkk36mu_103.0.5060.134/GoogleChrome-103.0.5060.134.dmg
sha256 cec46f072974f5eb82f660328d395cde5c3e6b2056e5ccba628a7af1c722123a
^^^ 10.12 ^^^
https://redirector.gvt1.com/edgedl/release2/chrome/acmm55cy3sg73rcub4rfcdfjjmza_116.0.5845.187/GoogleChrome-116.0.5845.187.dmg
sha256 9c338299144c8eabe355e2cfb740dfd1f3d8fe42732f2e015e9901c0b9c499aa
^^^ 10.13 ^^^
https://redirector.gvt1.com/edgedl/release2/chrome/acmm55cy3sg73rcub4rfcdfjjmza_116.0.5845.187/GoogleChrome-116.0.5845.187.dmg
sha256 9c338299144c8eabe355e2cfb740dfd1f3d8fe42732f2e015e9901c0b9c499aa
^^^ 10.14 ^^^
https://redirector.gvt1.com/edgedl/release2/chrome/gtm24cqmnwgcp7dtscvlmsbrwa_128.0.6613.138/GoogleChrome-128.0.6613.138.dmg
sha256 c1dea7dc078ac4a773fb95fd5f14e2d501f3981cb329180859c7378811e1b59b
^^^ 10.15 ^^^

Python 脚本

os_version = '14.2'
target_version_prefix = '114'

改一下就能用了。

禁止更新

在更新程序保活这件事上,狗哥的不要脸程度堪比 360。

首先把 tools.google.comupdate.googleapis.com 这俩域名屏蔽掉,例如在 hosts 文件里指向回环地址。

如果使用梯子,可以写在 block 路由规则里,放到 proxy 前。

然后把更新程序干掉:

sudo rm -rf /Library/Google/GoogleSoftwareUpdate
rm -rf /Applications/Google\ Chrome.app/Contents/Frameworks/Google\ Chrome\ Framework.framework/Versions/Current/Helpers/GoogleUpdater.app
rm -rf ~/Library/Google/GoogleSoftwareUpdate/*
chflags uchg ~/Library/Google/GoogleSoftwareUpdate
rm -rf ~/Library/Application\ Support/Google/GoogleUpdater
rm -rf ~/Library/HTTPStorages/com.google.GoogleUpdater
rm -rf ~/Library/Caches/com.google.GoogleUpdater
rm ~/Library/LaunchAgents/com.google.keystone.agent.plist
rm ~/Library/LaunchAgents/com.google.keystone.xpcservice.plist
launchctl unload -w ~/Library/LaunchAgents/com.google.GoogleUpdater.wake.plist
: >~/Library/LaunchAgents/com.google.GoogleUpdater.wake.plist
chflags uchg ~/Library/LaunchAgents/com.google.GoogleUpdater.wake.plist
defaults write com.google.Keystone.Agent checkInterval 0

这些傻逼玩意会在重启后自动生成,必要的时候用 chflags uchg 禁止写入。

还有一个脑瘫的玩意,就是“Chrome 版本太旧”。这玩意可以用命令行参数 --disable-background-networking 解决,或者用 --simulate-outdated-no-au3

为此可以用“自动操作”新建一个 Shell 脚本:

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --disable-background-networking

另存为 Chrome.app,需要的时候打开它就行了。但是这样可能需要重新登录账号。

ChromePythonmacOSShell

本作品根据 署名-非商业性使用-相同方式共享 4.0 国际许可 进行授权。

为邮件客户端添加 OAuth 2.0 代理

grep 使用中的一些坑