Сценарий входа в Python и механизировать

Привет коллеги программисты!

Я пытаюсь написать скрипт для входа на страницу «продовольственный баланс» моего университета, используя python и модуль механизации...

Это страница, на которую я пытаюсь войти: 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>

Отсюда мы знаем, что мне нужно заполнить следующие поля: 1. имя=id 2. имя=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()

Теперь проблема...

По какой-то странной причине страница, которую я возвращаю (в mycatpage.html), является страницей входа в систему, а не ожидаемой страницей, на которой отображается мой «остаток наличных денег для кошек» и «количество блочных блюд» осталось ...

Кто-нибудь знает, почему? Имейте в виду, что с файлами заголовков все правильно, и хотя идентификатор и пароль на самом деле не 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))

Это имеет такое же поведение...


person Perun    schedule 13.04.2012    source источник


Ответы (3)


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

Я считаю, что это проблемная линия.

Попробуйте изменить его на

br['id'] = myId
br['PIN'] = myPin

Я также почти уверен, что вам не нужен br.form.action = 'https://itapp.wcu.edu/BanAuthRedirector/Default.aspx', потому что вы уже выбрали форму, поэтому простой вызов submit должен работать, но я могу ошибаться.

Кроме того, я выполнил аналогичную задачу, просто используя 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()

Редактировать 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'}

Это может быть вашей проблемой? Точно сказать не могу.

Редактировать 3:

Воспользовавшись инспектором html, я думаю, что есть неплохая вероятность, что вам нужно установить «wcuirs_uir» на «https://cf.wcu.edu/busafrs/catcard/idsearch.cfm». Я на 95% уверен, что это сработает.

person Nolen Royalty    schedule 13.04.2012
comment
Изменение br.form['id'] = myId br.form['PIN'] = myPin не сработало.... Я тоже пробовал urllib, но безуспешно.... - person Perun; 13.04.2012
comment
Сценарий, который вы мне дали, дает мне: urllib2.HTTPError: Ошибка HTTP 500: Внутренняя ошибка сервера - person Perun; 13.04.2012
comment
Поэтому каждый раз, когда я пытаюсь использовать urllib2 (как тот, который я разместил, так и тот, который вы предложили), я получаю внутреннюю ошибку сервера (500)... Когда я использую механизировать, я просто возвращаю страницу входа... - person Perun; 13.04.2012
comment
@UkrNIXakep также исходный URL-адрес во втором опубликованном мной скрипте был неверным (я полагаю), я обновил его URL-адресом, который вы используете. Я думаю, что + URL, который я только что опубликовал, стоит попробовать. - person Nolen Royalty; 13.04.2012
comment
Как я могу отправить его на cf.wcu.edu/busafrs/catcard/idsearch.cfm в моем скрипте меха? - person Perun; 13.04.2012
comment
stackoverflow.com/questions/4815033/ Может помочь при ошибке 500. - person Nolen Royalty; 13.04.2012
comment
когда я отправляю на cf.wcu.edu/busafrs/catcard/idsearch.cfm вместо itapp.wcu .edu/BanAuthRedirector/Default.aspx, я возвращаю страницу входа..... снова..... - person Perun; 13.04.2012
comment
Я немного читал о представлении таких вещей asp, и это кажется довольно сложным, я еще не совсем уверен. - person Nolen Royalty; 13.04.2012
comment
Все еще получаю ошибку 500, обратите внимание, что это именно то, что я сделал в своем скрипте urllib2 (исходный пост внизу) - person Perun; 13.04.2012
comment
не уверен, что сказать, idk, если вам нужно закодировать это значение отправки в первом скрипте, но я думаю, что проблема с веб-сайтом. - person Nolen Royalty; 13.04.2012
comment
Да, веб-сайт довольно ужасен... Но должен же быть способ войти в систему с помощью скрипта, верно? может использовать перл? не понимаю что не так.... - person Perun; 13.04.2012

Я предлагаю следующую библиотеку: http://docs.python-requests.org/en/latest/

Это хорошая и простая библиотека. У него хорошая документация. Я использовал эту библиотеку для создания различных сценариев, таких как тот, который вы делаете.

Вам нужно сделать что-то вроде этого:

import requests 

s = requests.Session()
url = 'https://itapp.wcu.edu/BanAuthRedirector/Default.aspx'                    
myId = 'xxxxxxxx'                                                               
myPin = 'xxxxxxxx'  
headers = {'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'}
data = {'id':myId,                                                          
        'PIN':myPin,                                                        
        'submit':'Request Access',                                          
        'wcuirs_uri':'https://cf.wcu.edu/busafrs/catcard/idsearch.cfm'} 
response = s.post(url, headers = headers, data=date)

if response.status_code == 200: #Maybe add another constraint to be sure we are logged in
    #Now do any call you want
    response = s.get(another_url)
    print response.text

Дополнительную информацию можно получить здесь

person Federico Ponte    schedule 23.09.2014

Еще одно решение, которое я использовал в работе с ASPX, — это robobrowser.

Например:

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

Примечание. Возможно, вам потребуется обновить форму, чтобы добавить в форму скрытые поля формы, такие как __VIEWSTATE и друзья, перед отправкой. См. этот пост для получения дополнительной информации.

person Patrick    schedule 08.01.2015