简介

最近(其实是很久以前就)想下载虫虫钢琴上的曲谱,本着能白嫖就白嫖的心理,想写个软件一键下载。

其实之前已经写了一个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 分页保存图片

  1. 加载网页,设置窗口尺寸 - A4纸标准:2480x3508
  2. JS交互获取页数 - body的scrollHeight÷window.innerHeight + 1 即可
  3. 循环page 设置body的 marginTop 实现滚动页面
  4. 每页保存一张截图

*注意:这样截图会截到进度条,请设置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']))