Python和机械化登录脚本

Per*_*run 8 python mechanize login-script python-memcached

嗨其他程序员!

我正在尝试编写一个脚本,使用python和mechanize模块登录我的大学"食物平衡"页面...

这是我尝试登录的页面:http://www.wcu.edu/11407.asp 该网站有以下表格登录:

<FORM method=post action=https://itapp.wcu.edu/BanAuthRedirector/Default.aspx><INPUT value=https://cf.wcu.edu/busafrs/catcard/idsearch.cfm type=hidden name=wcuirs_uri> 
<P><B>WCU ID Number<BR></B><INPUT maxLength=12 size=12 type=password name=id> </P>
<P><B>PIN<BR></B><INPUT maxLength=20 type=password name=PIN> </P>
<P></P>
<P><INPUT value="Request Access" type=submit name=submit> </P></FORM>
Run Code Online (Sandbox Code Playgroud)

据此我们知道我需要填写以下字段:1.name = id 2. name = PIN

通过操作:action = https://itapp.wcu.edu/BanAuthRedirector/Default.aspx

这是我到目前为止编写的脚本:

#!/usr/bin/python2 -W ignore

import mechanize, cookielib
from time import sleep

url   = 'http://www.wcu.edu/11407.asp'
myId  = '11111111111'
myPin = '22222222222'

# Browser
#br = mechanize.Browser()
#br = mechanize.Browser(factory=mechanize.DefaultFactory(i_want_broken_xhtml_support=True))
br = mechanize.Browser(factory=mechanize.RobustFactory()) # Use this because of bad html tags in the html...

# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

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

# Follows refresh 0 but not hangs on refresh > 0
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

# User-Agent (fake agent to google-chrome linux x86_64)
br.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'),
                 ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
                 ('Accept-Encoding', 'gzip,deflate,sdch'),                  
                 ('Accept-Language', 'en-US,en;q=0.8'),                     
                 ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]

# The site we will navigate into
br.open(url)

# Go though all the forms (for debugging only)
for f in br.forms():
    print f


# Select the first (index two) form
br.select_form(nr=2)

# User credentials
br.form['id']  = myId
br.form['PIN'] = myPin

br.form.action = 'https://itapp.wcu.edu/BanAuthRedirector/Default.aspx'

# Login
br.submit()

# Wait 10 seconds
sleep(10)

# Save to a file
f = file('mycatpage.html', 'w')
f.write(br.response().read())
f.close()
Run Code Online (Sandbox Code Playgroud)

现在问题......

由于一些奇怪的原因,我回来的页面(在mycatpage.html中)是登录页面,而不是显示我的"猫现金余额"和"块餐数"的预期页面...

有谁知道为什么?请记住,头文件的一切都是正确的,而id和pass实际上并不是真正的111111111和222222222,正确的值可以与网站一起使用(使用浏览器...)

提前致谢

编辑

我试过的另一个脚本:

from urllib import urlopen, urlencode                                           
import urllib2                                                                  
import httplib                                                                  

url = 'https://itapp.wcu.edu/BanAuthRedirector/Default.aspx'                    

myId = 'xxxxxxxx'                                                               
myPin = 'xxxxxxxx'                                                              

data = {                                                                        
            'id':myId,                                                          
            'PIN':myPin,                                                        
            'submit':'Request Access',                                          
            'wcuirs_uri':'https://cf.wcu.edu/busafrs/catcard/idsearch.cfm'      
        }                                                                       

opener = urllib2.build_opener()                                                 
opener.addheaders = [('User-agent','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'),
                     ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
                     ('Accept-Encoding', 'gzip,deflate,sdch'),                  
                     ('Accept-Language', 'en-US,en;q=0.8'),                     
                     ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3')]      

request = urllib2.Request(url, urlencode(data))                                 
open("mycatpage.html", 'w').write(opener.open(request))
Run Code Online (Sandbox Code Playgroud)

这有相同的行为......

Nol*_*lty 1

# User credentials
br.form['id']  = myId
br.form['PIN'] = myPin
Run Code Online (Sandbox Code Playgroud)

我相信这是问题所在。

尝试将其更改为

br['id'] = myId
br['PIN'] = myPin
Run Code Online (Sandbox Code Playgroud)

我也很确定您不需要,br.form.action = 'https://itapp.wcu.edu/BanAuthRedirector/Default.aspx'因为您已经选择了表单,因此只需调用“提交”就可以了,但我可能是错的。

此外,我仅使用 urllib 和 urllib2 完成了类似的任务,所以如果这不起作用,我将发布该代码。

编辑:这是我与 urllib 和 urllib2 一起使用的技术:

import urllib2, urllib

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
urllib2.install_opener(opener)
encoded = urllib.urlencode({"PIN":my_pin, "id":my_id})
f = opener.open('http://www.wcu.edu/11407.asp', encoded)
data = f.read()
f.close()
Run Code Online (Sandbox Code Playgroud)

编辑2:

>>> b = mechanize.Browser(factory=mechanize.RobustFactory())
>>> b.open('http://www.wcu.edu/11407.asp')
<response_seek_wrapper at 0x10acfa248 whose wrapped object = <closeable_response at 0x10aca32d8 whose fp = <socket._fileobject object at 0x10aaf45d0>>>
>>> b.select_form(nr=2)
>>> b.form
<mechanize._form.HTMLForm instance at 0x10ad0dbd8>
>>> b.form.attrs
{'action': 'https://itapp.wcu.edu/BanAuthRedirector/Default.aspx', 'method': 'post'}
Run Code Online (Sandbox Code Playgroud)

这可能是你的问题?没有把握。

编辑3:

使用 html 检查器,我认为您很有可能需要将“wcuirs_uir”设置为“https://cf.wcu.edu/busafrs/catcard/idsearch.cfm”。我 95% 确信这会起作用。