25
2019
04

谷歌图书下载

自己写了个谷歌浏览器插件,用来下载谷歌图书。

可以用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的时候自己换算一下尺寸。

谷歌图书可以预览的页面可能不是整本书,只有一部分,所以只能下载到可以预览的部分。没有找到下载整本书的方法。


源码下载

« 上一篇下一篇 »

相关文章:

下载draw2d在线API  (2016-5-16 15:57:25)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。