豆丁书房文档下载至PC端
发布于 9 年前 作者 lihang1870719 7673 次浏览 最后一次编辑是 8 年前 来自 分享

豆丁书房文档下载至PC端

最近因为要写一些小论文,有时需要在豆丁网下载文档,但是豆丁上的文档大部分是要钱的,有三种途径,一种是充VIP,但是VIP也是下载的次数也是有限的;另一种是直接充钱(此处土豪直接略过);最后一种是豆丁出的神器–豆丁书房APP(此处是不是有打广告的嫌疑,囧),但是这种方法是有局限的,只能在手机端去查看,有点麻烦,于是就有了这一片blog的由来,我用nodejs写了一个小脚本,直接下载文档到PC端,下面就是详细的过程。

使用步骤

  1. 由于本插件是基于nodejs的,所以需要配置nodejs的环境
  2. 访问我的githubclone到本地
  3. 执行npm install
  4. 执行node getFile 文档就会自动下载到当前目录

详解

Step 1. 获取文档对应ID号

进入豆丁网,找到大家需要下载的文档,例如《42套最成功个人简历模板大集合 求职简历 英文简历》

snapshot

大家可以看到这篇文档时需要充值才可以下载的。注意图片最上面的地址栏:www.douin.com/p-531956905.html。其中“531956905”就是代表这篇文档的ID号。那么读者可能会问,这个ID有什么用,OK,下面进入正题。

Step 2. 根据ID号获得文档

上代码:

var superagent = require('superagent');
var async = require('async');
var fs = require('fs');

可以看到插件主要使用了3个模块:

  • superagent:用来模拟http请求
  • async:用来对代码进行控制,避免陷入callback-callback-callback
  • fs:文件操作

插件中主要有4个函数

  • getFile
  • getInvoiceId
  • getFileAddr
  • downFile

getFile函数:

var tasks = [getInvoiceId, getFileAddr, downFile];
var getFile = function (documentId) {
	var documentId = documentId;
	postText = 'value={"body":{"type":"1",' 
							+ '"document_ids":["' + documentId +'"]},' 
							+ '"account":"-fkKFxPvVLXOUxYkMY91S",'
							+ '"pwd":"1t8o4wWbnARtCij8JSgSUv",'
							+ '"type":"collection",'
							+ '"device_info":{"screen":"1080x1800","model":"android"},'
							+ '"version":"6.30","engine_id":"Android_BookStore"}';
	async.waterfall(tasks, function (err) {
		if(err) console.error(err.stack);
		console.log("download ok");
	});	
}
getFile(531956905);

getFile函数是程序的入口,大家只需要将自己要下载的文档ID换掉就可以欢乐的下载了


getInvoiceId函数

var getInvoiceId = function (callback) {
	console.log("in invoiceid");
	superagent.post(url)
			.set('Content-Type', 'application/x-www-form-urlencoded')
			.set('Connection', 'Keep-Alive')
			.set('User-Agent', 'Android')
			.send(postText)
			.end(function (err, res){
				if (err)
				{
					console.error(err);
				}
				else
				{
					var o = JSON.parse(res.text);
					var documents = o.body.documents[0];
					invoiceid = documents.invoiceid;
					var ext = documents.ext;
				}
				callback(null, invoiceid, ext);
			});
}

这里需要InvoiceID,是因为在下一步获取下载地址是需要的,推荐大家使用wireshark来抓包分析


getFileAddr

var getFileAddr = function (arg1, args2, callback) {
	console.log('in fileAddr');
	var postFileText = 'un=-fkKFxPvVLXOUxYkMY91S&'
				 + 'pwd=1t8o4wWbnARtCij8JSgSUv'
				 + '&invoiceid=' + arg1
				 + '&isfolder=false'
				 + '&encrypt=3'
				 + '&from=1'
				 + '&platform=android'
				 + '&version=2.5.9';
	superagent.post(urlFile)
		.set('Content-Type', 'application/x-www-form-urlencoded')
		.set('Connection', 'Keep-Alive')
		.set('User-Agent', 'Android')
		.send(postFileText)
		.end(function (err, res){
			if (err)
			{
				console.error(err);
			}
			else
			{
				var o = JSON.parse(res.text);
				var downLoadPath = o.result.url;
				var documentName = o.result.name;
				console.log("downLoadPath: " + downLoadPath);
				console.log(o);
			}
			callback(null, downLoadPath, documentName, args2);
		});	
}

这里利用获得的invoiceId获得文件下载的地址和下载文件名


downFile函数

var downFile = function (args1, args2, args3, callback) {
	var path = process.cwd() + "\\File\\" + args2 + '.' + args3;
	if (args1 == "")
	{
		callback(null);
	}
	fs.exists(path, function(args){
		if (args == true)
		{
			callback(null);
		}
		else
		{
			console.log(args1);
			console.log(path);
			var stream = fs.createWriteStream(path);
			var req = superagent.get(args1)
							.end(function (err, res){
								console.log(res.type);
							});
			req.pipe(stream).on('finish', function(err){
				if (err)
				{
					console.error(err);
				}
				callback(null);
			});
		}
	});
}

OK,最后一步,下载到本地就可以啦

回到顶部