自己写了个谷歌浏览器插件,用来下载谷歌图书。
可以用VPN或者“谷歌访问助手”来访问谷歌。
网上也有下载谷歌图书的软件,下载了安装报错,干脆自己写一个。
通过图书的id可以发送一个请求,比如:https://books.google.com/books?id=6IUarHeMWpAC&hl=zh-CN&pg=PP1&jscmd=click3 ,该请求会返回一个对象,包含一个page数组,page数组就是可以预览的所有页面,数组中每一项都有一个pid,数组的前几项还包含src属性,src就是本页图片的地址。将上面地址中的pg换成相应的页面的pid,返回值page中就会包含页面的src。这样就可以拿到所有页面的图片地址。
发送请求时,需要用到jsonp。因为跨域。
拿到图片地址之后,就可以请求图片,只能用img对象来请求。
获得所有的图片之后,用jsPDF将图片合并成一个pdf,然后下载。
思路很清晰,但是实际遇到很多问题。
img获取的图片,由于存在跨域问题,不能转换成pdf(不能用canvas获取图片数据),要想能画到canvas上,需要将img的crossOrigin设为anonymous,但是设置了之后谷歌就不给返回图片了。
可以用nodejs来模拟img来发送请求,然后就可以拿到图片数据了,但是我没有vpn,只有谷歌访问助手,只能从浏览器里边访问谷歌,所以放弃该方法。
还可以用Selenium来做,就可以把请求到的img缓存文件复制出来。可行,但是要搭建selenium环境,太复杂了。
最后发现谷歌浏览器的插件不存在跨域问题,试着开发一个谷歌浏览器插件来实现。
谷歌插件里边,jquery的jsonp又出问题了,因为插件里边不让往head里边动态append标签,既然插件里边本来就不存在跨域问题,就不需要用jsonp了,问题就不存在了。
最后图片转pdf的时候,需要调用addPage来添加页面,要不转换出来只有一页。
转出来的尺寸总是不对,查了好长时间才找到原因,jsPDF默认单位应该是用的mm,我们图片用的是像素px,创建psf的时候可以指定单位,但是指定了还是会有问题,最后改为addImage的时候自己换算一下尺寸。
谷歌图书可以预览的页面可能不是整本书,只有一部分,所以只能下载到可以预览的部分。没有找到下载整本书的方法。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。