qiandao, 一个基于 HAR 自动签到的 web 框架

04 Jan 2016 . . Comments #qiandao #har

前几天在github上面闲逛,发现了一个有意思的项目,qianda。正巧这些天在kaola上面各种网购,签到后用考拉豆可以换打折券,于是颇有兴趣的看了看。

qiandao是基于HRA,也就是http Archive的工具。其基本原理是使用chrome/firefox将登陆+签到所有的http请求记录下来,上传到qiandao的网站,然后进行分析,将其中动态的部分提取成为变量,然后使用必要的http请求自动进行签到。

我自己在aws上面搭建了一个服务,并没有用他家的网站,原因嘛自然是担心密码泄露。如果不用cookie,而用密码登陆的话,密码是需要保存在qiandao数据库的,虽然说有加密,但安全意识要提高提高。

启动qiandao服务主要由两个文件。web.py,用来启动web服务;worker.py,用来启动一个进程每天自动运行qiandao任务。

我任务是如何搞定kaola的自动签到,首先是需要下载相应的HAR文件,如何保存HAR在这里 有详细的说明。

打开kaola网站,点击登陆,填好用户名和密码,然后根据har-howto里面的说明,设置好chrome的相关选项。之后登陆和签到,将对应过程的HAR下载下来。

之后是上传到网站,网站会要求输入用户名和密码,这是用来做变量替换,它会扫描har的http请求,如果匹配了用户名和密码,就将其用替换,生成一个请求的模板。

上传之后qiandao将web请求进行了相关的分类,javascript,image,media,style之类的请求就不需要关注了,需要关注的是Document请求以及Others。kaola登陆请求,经过分析基本过程如下:

  • post到https://reg.163.com/logins.jsp,post的内容包括用户名,密码,转跳的url。这个过程会设置一个NETS_SESS,也就是网易登陆的session,以及一大堆其他cookie。返回页面中包括一个windows.location.replace,将当前页面转跳到http://global.163.com/urs/redirect.html?username=&target=http%3A%2F%2Fwww.kaola.com%2F

这里我们需要将这个转跳的url抓取下来,qiandao提供一个变量提取的功能,能够从http返回内容中提取通过正则表达式提取相关变量,然后这个变量可以使用在以下的请求当中。这里我走了一点弯路,刚开始没有仔细检查返回内容(当然qiandao也没有提供检查返回内容的功能,我是改了一下代码,记录了每个请求的返回到日志),而是只检查返回的header,然后想通过提取cookie里面的用户名拼凑出上面这个redirect.html,但发现没法提取header里面的内容,还去qiandao的github上开了一个case问了问。

总之,如果是跨站的请求,也就是域名不同的情况下,一般相应的cookie啊,session啊,转跳url啊都会在返回内容中,原因是cookie是不能够跨站的,只能通过url调用的方式。

这里使用正则表达式window.location.replace\("http://(.*?)"\)可以将这个url提取出来。保存在变量redirectUrl里面。

  • redirectURL此时就可以使用了,也正是第二个http请求,将请求url的模板改为http://即可。这个请求会返回一个kaola的url,比如http://www.kaola.com/urs/setUrsCookie.html?noredirect=true&sess=0cv6FPGtS4TXMUKDIWTWAv9h4JS2VaW67DqeXqfsxaDrOGeEUOReTsq0NHFctUYzksqZqcFi2EW7aBxwDqLHfbyIDWwyDwLCxUQGluYZnwCgyrje1sTZTc1W9Bdmf1eBEKef2Sfmhu6.3kVcL9Sn8.U0ss5XuBoQK&pinfo=%40163.com%7C1451270374%7C0%7Ckaola%7C00%2699%7CUS%261451201630%26kaola%23shh%26null%2310%230%230%7C%260%7Ckaola%7C%40163.com&sinfo=1451270374%7C0%7C3%2640%23%23%7C&uuid=3c922cb2dfb6593c43c2e9da77514a82"。用来设置相关session和cookie,和上面同理,我们可以通过正则表达式kaolaUrl\s*=\s*'http://(.*?)')来提取这个url,保存到变量kaolaUrl中。

  • kaolaUrl就是第三个需要的http请求。这里将url改为http://即可,这个请求为kaola设置各种cookie。

  • 最后一个请求是http://www.kaola.com/personal/my_sign.html,get这个url,可以为你的账户签到。

整个流程中,cookie是自动保存并传递到下一个http请求的,所以无需担心cookie丢失 de问题,这样,使用这个模板,就可以通过qiandao来做每天的自动签到了。

我把自己用的har模板放到了这里,做个备份,有人需要也可以拿去用。