node自动推荐博客

推荐:
代理页面vote.html,也就是我们所说的推荐页面(引入博客园的加密js),请求'/getLoginData'获取账号密码,加密之后发送请求'/doVote'对文章进行推荐。

使用superagent请求登录的主界面,获取token,然后才进行正式的登录。向服务器发起带有cookie、token、content-type的请求,登录成功。获取登录验证之后服务器返回的cookie。

后面就是爬取要推荐的文章。使用async模块来进行流程控制。

async.series:串行执行,一个函数数组中的每个函数执行完之后才能执行下面的函数。每个函数都会有一个作为回调函数的参数,使用该回调函数可以将当前数据传递给下一个回调函数。

先对执行函数进行队列拼装,使用async.series对博客园每个pageurl发送请求,获取每个page的文章url,存放在数组中。

将推荐博客的请求数据封装到postData对象里面(博客名称,博客ID,是否取消推荐,推荐方式),再存放到postDatas数组里面

async.mapLimit控制并发数量,对每个postDatas数组遍历,使用superagent发送diggData数据。
在处理函数中,使用setTimeOut设定一个随机的延时时间,防止网站对并发连接数的限制,但请求太快的时候会返回空或者报错。

使用eventproxy管理这些异步操作是否完成。一般情况下可以维护一个计数器,每当异步操作完成的时候计数器加+,然后用handle处理函数来判断计数器是否到达。可以使用回调嵌套。

使用eventproxy,异步流程控制、事件代理
after 在某个事件之后在限制的次数之内执行某个监听器
emit 触发事件,并且执行所有监听器
需要设置监听器,比较消耗内存。

期间遇到的问题:
1.获取博客园的账号密码加密格式。期间尝试过使用cherrio(Node.js库,可以从一堆html片段中构建DOM结构,然后提供像jquery一样的css选择器查询)+superagent(node.js的请求代理模块,可以处理get、post、head、put、delete)请求。来获取js的那段加密代码,但是发现要使用window对象。所以直接引入博客园的加密js。

2.promise参数传递
在then方法中加入状态改变的回调函数,在调用resolve函数的时候,只能传入一个参数,但是我可以多个数据合成一个参数,然后再用es6的解构赋值。

3.判断是否重复登录
用一个缓存变量来获取。

4.判断博客推荐完成

5.请求太快会报错或者返回空
因为博客园有并发连接数的限制。所以使用async.maplimit来控制并发量

你可能感兴趣的:(node自动推荐博客)