转载

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获得网页内容,提取出含 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 Captian的问题,放弃。

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

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

以上

正文到此结束
Loading...