加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python – 请求/ RoboBrowser – ASPX POST JavaScript

发布时间:2020-12-20 11:39:41 所属栏目:Python 来源: >登录/SubLogin.aspx >成
导读:我正在移植一个使用curl的bash脚本,并将代码中的有效负载PO??ST到URL并运行.基本问题是,使用robobrowser,我在使用页面表单发布时遇到了麻烦. 逐步浏览网站: 登录/SubLogin.aspx 成功登录重定向/OptionsSummary.aspx 用params获取/FindMe.aspx POST /FindMe.
我正在移植一个使用curl的bash脚本,并将代码中的有效负载PO??ST到URL并运行.基本问题是,使用robobrowser,我在使用页面表单发布时遇到了麻烦.

逐步浏览网站:

>登录/SubLogin.aspx
>成功登录重定向/OptionsSummary.aspx
>用params获取/FindMe.aspx
> POST /FindMe.aspx按钮“电话列表”(页面应该加载“电话列表”表,其中包含“工作”项)
>选择“工作”项目会对/PhoneLists.aspx执行POST(然后应该将表格“工作”加载到用户列表中.

我已经能够成功验证网站并使用RoboBrowser和Requests bs4执行GET
我很难回到页面本身.

使用RoboBrowser(liboncall.py)

#!/usr/bin/python

from robobrowser import RoboBrowser
from bs4 import BeautifulSoup as BS

oc_mailbox = '123456'
oc_password_hashed = 'ABCDEFG'

base_uri = 'http://example.com'
auth_uri = oc_base_uri + '/SubLogin.aspx'
find_uri = oc_base_uri + '/FindMe.aspx'
phne_uri = oc_base_uri + '/PhoneLists.aspx'


p_auth_payload = {
        'SubLoginControl:javascriptTest': 'true','SubLoginControl:mailbox': mailbox,'SubLoginControl:phoneNumber': '','SubLoginControl:password': password_hashed,'SubLoginControl:btnLogOn': 'Logon','SubLoginControl:webLanguage': 'en-US','SubLoginControl:initialLanguage': 'en-US','SubLoginControl:errorCallBackNumber': 'Entered telephone number contains non-dialable characters.','SubLoginControl:cookieMailbox': 'mailbox','SubLoginControl:cookieCallbackNumber': 'callbackNumber','SubLoginControl:serverDomain': ''
        }

p_find_payload = {
        'FindMeControl:enableFindMe': 'on','FindMeControl:MasterDataControl:focusElement': '','FindMeControl:MasterDataControl:masterList:_ctl0:enabled': 'on','FindMeControl:MasterDataControl:masterList:_ctl0:itemGuid': '','FindMeControl:MasterDataControl:hidSelectedScheduleName': '','FindMeControl:MasterDataControl:hidbtnStatus': '','FindMeControl:MasterDataControl:hidScheduleXML': '','FindMeControl:MasterDataControl:tempScheduleXML': '','FindMeControl:MasterDataControl:hidSelectedScheduleGUID': '','FindMeControl:MasterDataControl:hidChangedScheduleList': '','FindMeControl:btnPhoneLists': 'Phone Lists','FindMeControl:enableFindMeHidden': '','FindMeControl:applySet': 'false'
        }

p_phne_payload = {
        '__EVENTARGUMENT': '','__EVENTTARGET': 'PhoneListsControl$MasterDataControl$masterList$_ctl0$SelectButton','PhoneListsControl:MasterDataControl:focusElement': '','PhoneListsControl:MasterDataControl:masterList:_ctl0:itemGuid': '','PhoneListsControl:MasterDataControl:hidSelectedScheduleName': '','PhoneListsControl:MasterDataControl:hidbtnStatus': '','PhoneListsControl:MasterDataControl:hidScheduleXML': '','PhoneListsControl:MasterDataControl:tempScheduleXML': '','PhoneListsControl:MasterDataControl:hidSelectedScheduleGUID': '','PhoneListsControl:MasterDataControl:hidChangedScheduleList': '','PhoneListsControl:applySet': 'false'
        }


def auth(mailbox,password):
    browser = RoboBrowser(history=False)
    browser.open(oc_auth_uri)

    signin = browser.get_form(id='aspnetForm')
    signin['SubLoginControl:mailbox'].value = mailbox
    signin['SubLoginControl:password'].value = password
    signin['SubLoginControl:javascriptTest'].value = 'true'
    signin['SubLoginControl:btnLogOn'].value = 'Logon'
    signin['SubLoginControl:webLanguage'].value = 'en-US'
    signin['SubLoginControl:initialLanguage'].value = 'en-US'
    signin['SubLoginControl:errorCallBackNumber'].value = 'Entered+telephone+number+contains+non-dialable+characters.'
    signin['SubLoginControl:cookieMailbox'].value = 'mailbox'
    signin['SubLoginControl:cookieCallbackNumber'].value = 'callbackNumber'
    signin['SubLoginControl:serverDomain'].value = ''

    browser.submit_form(signin)
    return browser

登录网站并显示网址以验证我们是否在:

In [20]: from liboncall import *
In [21]: m = auth(oc_mailbox,oc_password_hashed)

In [22]: m.url
Out[22]: u'http://example.com/OptionsSummary.aspx'

打开“/FindMe.aspx”:

In [24]: m.open(find_uri)

In [25]: m.url
Out[25]: u'http://example.com/FindMe.aspx'

最初“/FindMe.aspx”将加载表单和按钮“电话列表”,(FindMeControl:btnPhoneLists).

In [26]: m.select('title')
Out[26]: [<title>Find Me</title>]

In [27]: form_find_a = m.get_form(action="FindMe.aspx")

In [28]: for i in form_find_a.keys():
    print(i)
    ....:
    __VIEWSTATE
    __EVENTVALIDATION
    FindMeControl:enableFindMe
    FindMeControl:MasterDataControl:focusElement
    FindMeControl:MasterDataControl:masterList:_ctl0:enabled
    FindMeControl:MasterDataControl:masterList:_ctl0:itemGuid
    FindMeControl:MasterDataControl:btnAdd
    FindMeControl:MasterDataControl:btnDelete
    FindMeControl:MasterDataControl:btnRename
    FindMeControl:MasterDataControl:btnCancel
    FindMeControl:MasterDataControl:btnEnter
    FindMeControl:MasterDataControl:btnUpdate
    FindMeControl:MasterDataControl:hidSelectedScheduleName
    FindMeControl:MasterDataControl:hidbtnStatus
    FindMeControl:MasterDataControl:hidScheduleXML
    FindMeControl:MasterDataControl:tempScheduleXML
    FindMeControl:MasterDataControl:hidSelectedScheduleGUID
    FindMeControl:MasterDataControl:hidChangedScheduleList
    FindMeControl:btnApply
    FindMeControl:btnSchedules
    FindMeControl:btnPhoneLists
    FindMeControl:enableFindMeHidden
    FindMeControl:applySet

删除不需要的表单字段,填写表单并提交:

In [29]: find_remove = (
'FindMeControl:MasterDataControl:btnAdd','FindMeControl:MasterDataControl:btnDelete','FindMeControl:MasterDataControl:btnRename','FindMeControl:MasterDataControl:btnCancel','FindMeControl:MasterDataControl:btnEnter','FindMeControl:MasterDataControl:btnUpdate','FindMeControl:btnApply','FindMeControl:btnSchedules')

In [30]: for i in find_remove:
        form_find_a.fields.pop(i)

In [31]: form_find_a['FindMeControl:enableFindMe'].value = 'on'
form_find_a['FindMeControl:MasterDataControl:focusElement'].value = ''
form_find_a['FindMeControl:MasterDataControl:masterList:_ctl0:enabled'].value = 'on'
form_find_a['FindMeControl:MasterDataControl:masterList:_ctl0:itemGuid'].value = ''
form_find_a['FindMeControl:MasterDataControl:hidSelectedScheduleName'].value = ''
form_find_a['FindMeControl:MasterDataControl:hidbtnStatus'].value = ''
form_find_a['FindMeControl:MasterDataControl:hidScheduleXML'].value = ''
form_find_a['FindMeControl:MasterDataControl:tempScheduleXML'].value = ''
form_find_a['FindMeControl:MasterDataControl:hidSelectedScheduleGUID'].value = ''
form_find_a['FindMeControl:MasterDataControl:hidChangedScheduleList'].value = ''
form_find_a['FindMeControl:btnPhoneLists'].value = 'Phone Lists'
form_find_a['FindMeControl:enableFindMeHidden'].value = ''
form_find_a['FindMeControl:applySet'].value = 'false'
Out [31]: ...

In [32]: m.submit_form(form_find_a)

验证该页面已更新并且列表项“Work”:

In [33]: m.parsed.find('title')
Out[33]: <title>Phone Lists</title>

In [34]: m.parsed.find('a',id='PhoneListsControl_MasterDataControl_masterList__ctl0_SelectButton')
Out[34]: <a class="linkButtonItem" href="javascript:__doPostBack('PhoneListsControl$MasterDataControl$masterList$_ctl0$SelectButton','')" id="PhoneListsControl_MasterDataControl_masterList__ctl0_SelectButton" onclick="javascript:onClick();">Work</a>

获取“PhoneLists.aspx”表单,删除不需要的字段,填写并提交.

In [35]: form_find_b = m.get_form(action='PhoneLists.aspx')

In [36]: phne_remove = (
    'PhoneListsControl:MasterDataControl:btnAdd','PhoneListsControl:MasterDataControl:btnDelete','PhoneListsControl:MasterDataControl:btnRename','PhoneListsControl:MasterDataControl:btnCancel','PhoneListsControl:MasterDataControl:btnEnter','PhoneListsControl:MasterDataControl:btnUpdate','PhoneListsControl:btnApply','PhoneListsControl:btnBack')

In [37]: for i in phne_remove:
            form_find_b.fields.pop(i)

In [38]: form_find_b['PhoneListsControl:MasterDataControl:focusElement'].value = ''             
form_find_b['PhoneListsControl:MasterDataControl:hidChangedScheduleList'].value = ''
form_find_b['PhoneListsControl:MasterDataControl:hidScheduleXML'].value = ''
form_find_b['PhoneListsControl:MasterDataControl:hidSelectedScheduleGUID'].value = ''
form_find_b['PhoneListsControl:MasterDataControl:hidSelectedScheduleName'].value = ''
form_find_b['PhoneListsControl:MasterDataControl:hidbtnStatus'].value = ''
form_find_b['PhoneListsControl:MasterDataControl:masterList:_ctl0:itemGuid'].value = ''
form_find_b['PhoneListsControl:MasterDataControl:tempScheduleXML'].value = ''
form_find_b['PhoneListsControl:applySet'].value = 'false'

In [39]: m.submit_form(form_find_b)

查看帖子以查看是否已加载用户列表.在这种情况下,它没有加载
用户列表.

In [40]: m.parsed.findAll('div',id='PhoneListsControl_phoneListMembersText')
Out[41]: [<div class="displayText" id="PhoneListsControl_phoneListMembersText"></div>]

如果成功,以上将返回:

<div id="PhoneListsControl_phoneListMembersText" class="displayText" style="top: 315px; left: 281px;">&nbsp;&nbsp;Work&nbsp;&nbsp;</div>

连同表中的以下项目(PhoneListsControl_phoneListDetail):

<input name="PhoneListsControl:phoneListDetail:_ctl2:number" type="text" value="95551234567" maxlength="50" id="PhoneListsControl_phoneListDetail__ctl2_number" onkeyup="enableApplyButton('PhoneListsControl_')" style="width:140px;">
...
<input name="PhoneListsControl:phoneListDetail:_ctl3:number" type="text" value="95551236789" maxlength="50" id="PhoneListsControl_phoneListDetail__ctl2_number" onkeyup="enableApplyButton('PhoneListsControl_')" style="width:140px;">
...

在这次冒险中,我发现Robobrowser没有包括所有要求
邮件的formdata为“PhoneLists.aspx”按预期工作,(‘__ EVENTTARGET’:’PhoneListsControl $MasterDataControl $masterList $_ctl0 $SelectButton’和__EVENTARGUMENT).设置params然后执行submit_form(form_find_b)也不会达到预期的效果.我想知道robobrowser.forms.form中的add_field()是否会起作用,但我不知道如何正确使用它,(如果要根据我的需要使用它.例如,添加__EVENTTARGET和__EVENTARGUMENT隐藏的输入字段到表格).

还有其他我缺少的东西或RoboBrowser / Requests不支持此类帖子吗?
是否表单需要javascript执行here与机械化?

解决方法

解决了

经过大量的谷歌搜索,重新发布reddit的帮助,然后随机绊倒this RoboBrowser问题,向我展示如何正确使用’fields.add_field()’方法;问题已经解决了.

例如

b_e_arg = robobrowser.forms.fields.Input('&;input name="__EVENTARGUMENT" value="" /&;')

b_e_target = robobrowser.forms.fields.Input('&;input name="__EVENTTARGET" value="PhoneListsControl$MasterDataControl$masterList$_ctl0$SelectButton" /&;')

In [30]: form_find_b.add_field(b_e_target)
In [31]: form_find_b.add_field(b_e_arg)

使用这些值更新表单后,提交到“PhoneLists.aspx”的表单将按预期工作.

In [33]: m.submit_form(form_find_b)

In [34]: m.url
Out[34]: u'http://example/PhoneLists.aspx'

In [35]: m.parsed.findAll('div',id='PhoneListsControl_phoneListMembersText')
Out[35]: [<div class="displayText" id="PhoneListsControl_phoneListMembersText">??Work??</div>]

In [36]: m.parsed.findAll('input',id='PhoneListsControl_phoneListDetail__ctl2_number')
Out[36]: [<input id="PhoneListsControl_phoneListDetail__ctl2_number" maxlength="50" name="PhoneListsControl:phoneListDetail:_ctl2:number" onkeyup="enableApplyButton('PhoneListsControl_')" type="text" value="95551234567"/>]

我希望其他任何必须刮掉ASPX网站的人都觉得这很有用.快乐的黑客入侵!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读