python模拟登录segmentfault及备份文章

直接post登录失败

一般的网站确实直接post之后就登录成功了,然后拿到cookie想怎么就怎么。不过的确世事难料,失败在所难免。

首先是人肉登录,用chrome的network栏查看post了些什么东西,有三项:

  • mail

  • password

  • remember

地址是http://segmentfault.com/api/user/login?_=0b1bc2ca95203748b804e69ac2cfab06,后面那个32位的token是随机的,每次都不一样。怎么找到这个值呢?用chrome工具栏进行调试打断点找(记得先按'{}'格式化代码),从发XHR的地方开始,用call stack逐步缩小范围,直到找到token被加上的地方,值也就能找到了。这个过程还是很麻烦的。。。

最终能找到这个值为window.SF.token,你百度一下它会发现segmentfault上已经有文章写过用node模拟登录,不过在js文件里全局搜索_=这种方法略投机。我表示我完全没有参考它,因为我找到window.SF.token去搜索后才发现那文章,不然直接拿来主义了

这个值附在window上,没法js压缩混淆,所以肯定有个赋值的地方,稍微找找,发现就在登录页的html里。

python模拟登录segmentfault及备份文章

用python获得网页内容,提取出含token的那段代码,包括for循环中的数字,千方百计把token计算出来,拿去post,失败。加上headerscookies伪装浏览器,注意,当前这个cookies应该是匿名cookie,以防万一加上的,里面没有有效的能标记已经登录的session值。继续尝试post,成功,但是还是未登录状态。重新人肉登录检查发送xhr的地方,还有好几处,稍微尝试了一下模拟这几个发送,没有成功。经过分析发现,有效登录标记是一个叫sr_remembercookie值,但具体过程我确实没分析出来,现在的登录里回调和跳转太多了,分析过程就很麻烦,再用python模拟单个请求,很低效且不易成功

使用phantomjs

那就用最简单的方法,在python中直接模拟浏览器的js运行环境,试了试Ghost.py,大坑,好像是网页中有用到localStorage等的地方就直接崩溃了,而且它依赖于PySide,这个真的是非常费事,要装的朋友切忌选择下载源代码编译安装,否则你会发现pip install PySide之后半天没动静,前者至少都能给你点动静(编译估计要几十分钟吧)。PyV8安装没成功,好像是Ei Capitan的问题,放弃。

最后就选择了selenium+Phantomjs, selenium可以直接驱动phantomjs,很方便。这一瞬间我感觉自己相当明白为什么PySpider里要用Phantomjs了。

如前所说,用phantomjs模拟登录拿到cookie,然后python带上cookie去取文章备份就好了,用tornado加了点并发,代码放到github上了,地址,欢迎使用及拍砖

以上