Python - 将数据输入表单并提交隐藏表单

时间:2015-03-09 11:27:51

标签: javascript python html form-submit hidden-field

好的,这是我在StackOverflow上的第一篇文章,所以请放轻松。我真的坚持使用 Python 脚本。我在网上看了一遍,找不到解决办法!

所以我使用mechanize登录网站(例如: http://www.foobar.com/

要登录的表单的HTML:

form id="loginForm" method="post" action="/z/0.123/?cmd=login-post" onsubmit="return someSubmitfunction();"

该网站的登录表单如下所示:

    <HiddenControl(__FOO=someLongString) (readonly)>
    <TextControl(emailAddress=)>
    <PasswordControl(password=)>
    <CheckboxControl(persist=[*on])>

我可以登录网站并重定向到内部链接(详见代码)。

以下是登录的代码... 注意:请求方法是POST

    import urllib, urllib2
    import cookielib
    import mechanize

    # Note this is the FORM, but missing the HIDDEN value, LOOK lower in code
    EmailAddress = 'someusername'
    Password = 'somepassword'
    Persist = ['on',]

    browser = mechanize.Browser()

    # Enable cookie support
    cookiejar = cookielib.LWPCookieJar() 
    browser.set_cookiejar( cookiejar )

    # Browser options 
    browser.set_handle_equiv( True ) 
    browser.set_handle_redirect( True ) 
    browser.set_handle_referer( True ) 
    browser.set_handle_robots( False )

    # Pretend that I am a browser
    browser.set_handle_refresh( mechanize._http.HTTPRefreshProcessor(), max_time = 1 ) 
    browser.addheaders = [ ( 'User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1' ) ]

    # Open webpage & add form fields
    browser.open('http://www.foobar.com/')
    browser.select_form(nr = 0) #select the ONLY form (Login form)
    browser.form['emailAddress'] = EmailAddress
    browser.form['password'] = Password
    browser.form['persist'] = Persist

    # Submit for FORM is an action, find it and redirect to internal page
    # Create new control & submit to internal page
    browser.new_control("HIDDEN", "action", {})
    control = browser.form.find_control("action")
    control.readonly = False
    browser["action"] = "/z/0.123/?cmd=login-post"
    browser.method = "post"
    browser.action = 'http://www.foobar.com/user/summary/'

    browser.submit()

好的,到目前为止,我很好。我已成功登录并被重定向到 http://www.foobar.com/user/summary/ ,就像我想要的那样。

    url = browser.open('http://www.foobar.com/user/summary/')
    print url.read() # - see content of url HTML ### THIS WORKS ###

现在我使用BeautifulSoup()来解析/ user / summary /的HTML并成功抓取此页面上的另一个表单。此表单没有像登录表单那样的操作,但这就是它的外观......

我需要从这里帮助...我无法将文本(myInput)输入表单并提交!

来自... / user / summary /的表格的HTML:

form method="post" id="foobar" name="foobar">

这是表单的提交按钮:

onkeypress="return submitFormKey(event, '','foobar', 'foobar', 'pcm');"> img src="someuglyimage.jpg" class="submit" id="btn_Submit" onclick="submitForm('foobar', 'foobar', 'pcm');" alt="Foo"

这是实际形式:(此页面上的唯一表格,再次!)

    <HiddenControl(hdnCmd=foobar) (readonly)>
    <TextControl(inputvalue=)>

我尝试了很多提交方法。我尝试使用Selenium,Splinter,urlib(1&amp; 2),甚至是JSON,javascript,iframe,嵌入等等。我很生气,帮助PLZ!

我认为这会有效,我尝试使用和不使用隐藏控制:

    browser.select_form(nr = 0) #select the 1st form for inputting value
    browser.form['inputvalue'] = myInput #MY INPUT I WANT THERE

    browser.new_control("hidden", "foobar", {})
    control = browser.form.find_control("foobar")
    control.readonly = False
    #browser["foobar"] = "/?cmd=foobar&from=/user/summary"
    browser.method = "post"
    response = browser.submit()
    print response.read()

我的结果:

显然,它似乎将我重定向到网站的主页(302重定向)。所以我知道这很可能与隐藏的值有关,并在我提交时将其传递给javascript / Ajax调用(onclick =“submitForm)。我读到了CSRF令牌,它可能就是这样,但如果有人有任何想法如何做到这一点,让我知道,因为我迫切需要帮助。

不知怎的,我找不到... / user / summary /(控制台告诉我这个)的形式因为我被重定向到主页,即使我不提交浏览器,直到我输入所有表单字段。 ..

我可以阅读... / user / summary /的HTML,找到“foobar”表格!这就是为什么我这么困惑。我可以阅读它,解析它,但是当我尝试将myInput输入到表单中时,不知何故我被重定向到主页,但我仍然登录!

感谢pplz ..希望我很清楚!

0 个答案:

没有答案
相关问题