代码之家  ›  专栏  ›  技术社区  ›  Bogdan Stăncescu

触发jsdom中的post请求的onclick事件

  •  0
  • Bogdan Stăncescu  · 技术社区  · 8 年前

    我在试着刮 poorly designed governmental website 它使用由javascript触发的POST请求进行导航(我正在尝试导航日历)。

    我正试图以优雅的方式完成这项工作,在节点中使用jsdom和jquery(可能 jsdom-simulant 但是我不确定我是否理解如何在模拟器中触发事件,因为事件本身应该返回到JSDOM并触发一个新的HTTP POST请求。

    我不希望你们为我编写代码,我只需要一些关于结构、哲学或现有代码库的指针,它们可以做类似的事情。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Bertrand Martel    8 年前

    关于刮削部分,这是一个发送表单URL编码数据的POST请求。有效载荷中有两个字段似乎是必需的:

    • _ eventTarget=ctl00$b_中心$voturiplen1$calvot
    • _ EventArgument=XXXX(带XXXX某个值)

    这个 __EVENTARGUMENT 值每天递增。例如,2018年4月4日是6668,2018年4月5日是6669。从最早的日期(1998年1月1日)来看,该指数为-730,因此可以使用目标日期和1998年1月1日之间的天数差减去730来计算该指数。

    使用 和; 和 dateutils :

    target_date="2018-04-04"
    index=$(($(dateutils.ddiff 1998-01-01 "$target_date") - 730))
    
    curl 'https://www.senat.ro/Voturiplen.aspx' \
         -H 'User-Agent: Mozilla' \
         -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
         --data "__EVENTTARGET=ctl00%24B_Center%24VoturiPlen1%24calVOT&__EVENTARGUMENT=$index"
    

    和使用 HTML分析程序:

    curl 'https://www.senat.ro/Voturiplen.aspx' \
         -H 'User-Agent: Mozilla' \
         -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
         --data "__EVENTTARGET=ctl00%24B_Center%24VoturiPlen1%24calVOT&__EVENTARGUMENT=$index" | \
         pup 'table#ctl00_B_Center_VoturiPlen1_GridVoturi'
    

    使用 你可以用 , :

    const request = require('request');
    const moment = require('moment');
    const jsdom = require("jsdom");
    const {JSDOM} = jsdom;
    
    var a = moment('21/12/2017', 'DD/MM/YYYY');
    var b = moment('01/01/1998', 'DD/MM/YYYY');
    var index = a.diff(b, 'days') - 730;
    
    request.post({
        url: 'https://www.senat.ro/Voturiplen.aspx',
        form: {
            "__EVENTTARGET": "ctl00$B_Center$VoturiPlen1$calVOT",
            "__EVENTARGUMENT": index
        },
        headers: {
            'User-Agent': 'Mozilla'
        }
    },
    function(err, httpResponse, body) {
        const dom = new JSDOM(body);
        var table = dom.window.document.querySelector("#ctl00_B_Center_VoturiPlen1_GridVoturi");
        console.log(table.textContent);
    });
    

    检查 this post 用于日期差异

    推荐文章