简介
最近(其实是很久以前就)想下载虫虫钢琴上的曲谱,本着能白嫖就白嫖的心理,想写个软件一键下载。
其实之前已经写了一个Chrome扩展 可以快速下载/打印PDF曲谱了,因为之前在曲谱浏览页面右键iframe可以直接浏览整首曲子的曲谱,最近才被修复(前端JS验证Referer 改源码轻松绕过),不能通过那个方法下载了。
把虫虫钢琴播放器的前端源码下载下来,去掉Referer验证后就可以随意浏览曲谱了。
拿到CCMZ链接
不废话,曲谱页抓包直接拿到如下API接口:
https://www.gangqinpu.com/api/home/user/getOpernDetail?id=曲谱ID
返回内容有曲谱信息、第一页图片链接(之前是每页链接)、试听音频链接、CCMZ链接等,我们只需要这个CCMZ链接,把他拼接到播放器URL后面(?url=+URL)
顺便一提 URL里还可以设置曲谱格式(jianpuMode=0/1/2 五线谱/简谱/固定调简谱)
Python 使用 ChromeDrive 分页保存图片
- 加载网页,设置窗口尺寸 - A4纸标准:2480x3508
- JS交互获取页数 - body的scrollHeight÷window.innerHeight + 1 即可
- 循环page 设置body的 marginTop 实现滚动页面
- 每页保存一张截图
*注意:这样截图会截到进度条,请设置body的overflow为hidden 隐藏进度条
option = webdriver.ChromeOptions()
option.add_argument('--headless') # 设置不显示窗口 否则受屏幕分辨率限制
browser = webdriver.Chrome(chrome_options=option)
browser.set_window_size(2480, 3508) # 设置窗口尺寸 这里为标准A4纸比例
browser.get(url) # URL自行替换为你播放器HTML的地址
time.sleep(1) # 等待1秒加载完成
page = browser.execute_script("return Math.floor(document.getElementsByTagName('body')[0].scrollHeight/window.innerHeight)+1;") # 获取曲谱页数
for i in range(0,page):
browser.execute_script("document.getElementsByTagName('body')[0].style.marginTop = -3508*"+str(i)+"+'px';") # 滚动
browser.save_screenshot('TEST_'+str(i)+'.PNG') # 保存图片
保存为PDF
这里需要查阅 Chrome DevTools 文档,我找了好久才找到。。。(不设置参数 默认打印出来的PDF比例不对)

设置paperWidth和paperHeight 纸张尺寸,单位是英寸
pdf = browser.execute_cdp_cmd("Page.printToPDF", {
"printBackground": True,
"paperWidth": 8.27, # 宽度
"paperHeight": 11.69, # 高度
})
with open("file.pdf", "wb") as f:
f.write(base64.b64decode(pdf['data']))
Comments | NOTHING