爬虫模仿上岸 SegmentFault

媒介

本文来自我在 SegmentFault 上的 回复,我纪录了个中出色的部分到本博客。

大抵意义是模仿上岸 segmentfault.com,一时手痒,本文将率领人人一同完成这个操纵。

剖析

这个题目问的异常好,但惋惜的是人人的复兴都是夸夸其谈未经讨论,最前最高票的回复的居然说让下抓包东西,几乎好笑啊,chrome下F12直接就能够看到账号暗码是明文发送的何须还要抓包?别的的题主的http头就是从chrome下复制的。

依据居然我推断你的题目的原因是发送了过量的http头,个中Content-Length是显著有题目的,这个代表内容长度,你此次抓包是49,但下次换个账号暗码可就真不肯定了。比方,假如账号暗码太长,能够就会致使截断,那末无论如何都邑提醒暗码毛病的(由于只发送了一部分的暗码过去)。

计划

事实上为了探讨这个有意义的题目,我特地着手做一个有意义的试验。这里就用个最简朴的剧本语言node.js中的ajax模子来从新构建操纵历程。

剖析

我们先去上岸页–源码页去大抵看一下,个中

<script crossorigin src="https://dfnjy7g2qaazm.cloudfront.net/v-575e20ec/user/script/login.min.js"></script>

这个跨域要求加载js剧本,看名字应该是和上岸有关的,我们这边运用尝试接见下,效果不必想,一篇乱糟糟的。

依据定名范例,我们猜想紧缩前的名字能够就是叫login.js,我们看下他删除了没有,我们尝试接见https://dfnjy7g2qaazm.cloudfront.net/v-575e20ec/user/script/login.js,嗯哼还在,看来他们的宣布职员能够不是处女座的。

那好我们往下看下这里:

$("form[action='/api/user/login']").submit(function() {
  var data, url;
  url = '/api/user/login';
  data = $(this).serialize();
  $.post(url, data, function(d) {
    if (!d.status) {
      return location.href = d.data;
    }
  });
  return false;
});

代码异常简朴,我们知道了要求效果中status为0时代表上岸胜利,同时我们也知道了背景实行上岸要求页是/api/user/login,即https://segmentfault.com/api/user/login,我们接见一下,嗯404。这说明了服务端考证了输入,并推断我们的要求不符合一般逻辑。下面我们最先捏造要求头。

要求头

我们用相似chrome的现代化浏览器,一般接见https://segmentfault.com/user/login,按下F12,挑选network面板最先监控要求,然后我们随便填写账号暗码,点击上岸。

这个时刻下面会有一条信息,我们提取个中的Request Header以下

POST /api/user/login?_=93e1b923149fb56c4fd329fe95ea4001 HTTP/1.1
Host: segmentfault.com
Connection: keep-alive
Content-Length: 46
Pragma: no-cache
Cache-Control: no-cache
Accept: */*
Origin: https://segmentfault.com
X-Requested-With: XMLHttpRequest
User-Agent: xxxx
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
DNT: 1
Referer: https://segmentfault.com/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
Cookie: PHPSESSID=web5~to8l5ovmt9t3jkb84aevuqf151; Hm_lvt_e23800c454aa573c0ccb16b52665ac26=1465799317; Hm_lpvt_e23800c454aa573c0ccb16b52665ac26=1465799317; _ga=GA1.2.915515414.1465799317; _gat=1

我们只需要一样发送这些要求到服务器上,理论上就不会有题目,同时也不会再404了。

这里面的数据中,有些不需要发的,有些是必需要发送的。我们能够逐一测试下。

调试

我们这里运用nodejs来简朴写段代码测试下服务端所考证的参数。

死板的测试就是不停删减要求来看看服务端会不会返回404。历程不再赘述,效果是:

  1. querystring中的 _必需和Cookie中的PHPSESSID对应。

  2. X-Requested-With的值需要带ajax要求标志,即XMLHttpRequest

  3. Referer的值

看来他们服务端照样蛮严厉的。

源码

var superagent = require('superagent');


superagent.post('https://segmentfault.com/api/user/login?_=7ef046ad4f224034d7b51655238bd870')
    .set('Referer', 'https://segmentfault.com/user/login')
    .set('X-Requested-With', 'XMLHttpRequest')
    .set('Cookie', 'PHPSESSID=web1~395mahoqliohh5kclv894ibpr3; _gat=1; _ga=GA1.2.1234754628.1465797373; Hm_lvt_e23800c454aa573c0ccb16b52665ac26=1465797373; Hm_lpvt_e23800c454aa573c0ccb16b52665ac26=1465797538')
    .send({
        mail: "xxxxxx",
        password: "xxxx"
    })
    .type('form')
    .end(function(err, res) {
        if (err || !res.ok) {
            console.log(err.status);
        } else {
            console.log('yay got ' + JSON.stringify(res.body));
        }
    });

同时,开源在 GitHub 上,地点 segmentfault_loginer:https://github.com/Rozbo/segmentfault_loginer

    原文作者:rozbo
    原文地址: https://segmentfault.com/a/1190000005706474
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞