这个文章写得不错,特此整理转载。
原文链接:https://note.qidong.name/2020/05/dl-vscode-cn/
在国内,想要下载Visual Studio Code,有时真是一件不容易的事。 它本体发布于海外,国内暂无可用镜像,更新频率又高。 在某些网络环境下,下载或更新真是苦不堪言,卡着卡着就断掉了。
本文提供一个Python脚本,自动从中国的azure下载。能略快一些。
配置软件源 ¶
对Linux的deb系来说,本以为配置好了源/etc/apt/sources.list.d/vscode.list
,就可以简单方便。
deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main
但有时卡住就是卡住,一点办法没有。
替换下载域名 ¶
如果是从官网点击下载,下载位置会略有不同。 多番重定向之后,最终链接是这种形式:
然而依然很慢。如果手动替换域名为vscode.cdn.azure.cn
,则下载起来会快很多。
wget https://vscode.cdn.azure.cn/stable/5763d909d5f12fe19f215cbfdd29a91c0fa9208a/code_1.45.1-1589445302_amd64.deb
原理推测,大概是vscode.cdn.azure.cn
是一个中国区服务器,其上要么有vscode镜像,要么有CDN代理。 从三级域名推测,是CDN代理;从四级域名推测,是镜像。 如果是代理,通过azure内网直通国外,速度自然快很多。
这个方案有个问题,那就是手工操作比较繁琐。 如果执行多次,非常消耗耐心。
自动发现与替换域名 ¶
据调查,当前vscode的各版本,大致如下:
- Win32
- Win64
- deb: https://update.code.visualstudio.com/latest/linux-deb-x64/stable
- rpm: https://update.code.visualstudio.com/latest/linux-rpm-x64/stable
- Mac OS X: https://update.code.visualstudio.com/latest/darwin/stable
为了实现自动替换,孤写了一个脚本。 原理大概是利用重定向,找到真实下载链接,然后通过替换域名,输出国内链接。 内容如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
"""
自动从中国下载vscode。
使用前先预装:
pip install requests tqdm
使用示例:
python3 cndlvsc.py deb
查看帮助:
./cndlvsc.py --help
更多介绍: https://note.qidong.name/2020/05/dl-vscode-cn/
"""
from argparse import ArgumentParser
from os.path import split
from urllib.parse import urlparse, urlunparse
import requests
from tqdm import tqdm
CN_DOMAIN = 'vscode.cdn.azure.cn'
TYPE2URL = {
'win32': 'https://update.code.visualstudio.com/latest/win32/stable',
'win64': 'https://update.code.visualstudio.com/latest/win32-x64/stable',
'deb': 'https://update.code.visualstudio.com/latest/linux-deb-x64/stable',
'rpm': 'https://update.code.visualstudio.com/latest/linux-rpm-x64/stable',
'mac': 'https://update.code.visualstudio.com/latest/darwin/stable',
}
def main():
args = _parse_args()
url = TYPE2URL[args.type]
resp = requests.get(url, allow_redirects=False)
resp.raise_for_status()
dl_url, fname = replace_domain(resp.next.url, CN_DOMAIN)
if args.print_only:
print(dl_url)
else:
download(dl_url, fname)
def _parse_args():
parser = ArgumentParser()
parser.add_argument(
'type',
choices=TYPE2URL,
help='The download type',
)
parser.add_argument(
'-p',
'--print-only',
action='store_true',
help='Print url only',
)
return parser.parse_args()
def replace_domain(url, domain):
result = urlparse(url)
lst = list(result)
lst[1] = domain
_, fname = split(result.path)
return urlunparse(lst), fname
def download(url, fname):
resp = requests.get(url, stream=True)
total = int(resp.headers.get('content-length', 0))
with open(fname, 'wb') as file, tqdm(
desc=fname,
total=total,
unit='iB',
unit_scale=True,
unit_divisor=1024,
) as bar:
for data in resp.iter_content(chunk_size=1024):
size = file.write(data)
bar.update(size)
if __name__ == '__main__':
main()
yanqd0 / 国内快速下载vscode / cndlvsc.py
复制或下载之后,保存为cndlvsc.py
文件,然后用Python3执行:
python3 cndlvsc.py deb
可查看帮助,下载各种版本的vscode。 也可-p
打印下载链接,通过浏览器或其它方式下载。
结语 ¶
当一个中国开发者真是好难!
本来想过写一个CLI发布到PyPI中,这样只用pip install cndlvsc
,就可以直接使用。 但是考虑到这就是个临时使用的小脚本,还不知道什么时候就会失效,也就算了。
今年国际形式进一步恶化,网络环境也更糟了。 如今想要和国际接轨,代价越来越大,效率越来越低。 如果强行与国际脱轨,中国的软件行业无疑会落后于时代。
相关笔记
- 《利用pyinstaller打包Python程序为一个可执行文件》
- 《定制Powerline的显示内容》
- 《安装Powerline并配置Vim、Bash、tmux、IPython、pdb》
- 《基于Redis配置Celery》
- 《Python利用S3的Presigned URLs实现无鉴权上传与下载》
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可,详见本站版权声明。
本站没有任何支持评论功能的计划。 如果你对本站的设计、内容、观点有什么意见,欢迎来信指正。
作者:匿蟒 邮箱:yanqd0@outlook.com 备案:闽ICP备15022549号