Cześć.
Mam drobny problem. Sprawa jest bardzo ciekawa.
Chciałbym za pomocą skryptu w Pythonie zalogować się na stronę www, a następnie pobrać jej kod źródłowy.
Aktualnie zatrzymałem się w takim miejscu, że kod źródłowy jest pobierany, ale tylko strony głównej, a mi zależy na kodzie strony dostępnej po zalogowaniu.
Część kodu źródłowego strony www:
<form method="post" action="/adres_docelowy">
<input type="hidden" name="NAZWA" value="WARTOSC">
<tr>
<td align="center"><INPUT TYPE="text" name="login" value="" maxlength="50" size="30" CLASS="UZYTKOWNIK"> </td>
</tr>
<tr>
<td CLASS="INFO" valign="middle" height="20"> Hasło: </td>
</tr>
<tr>
<td align="center"><INPUT TYPE="password" name="password" value="" maxlength="20" size="30" CLASS="HASLO"> </td>
</tr>
<tr>
<td align="center"><input type="submit" value=" " CLASS="BUTTON_ZALOGUJ" title="Zaloguj"> </td>
</tr>
<tr>
<td align="center"><input type="submit" onClick="form.action='przypomnij'" CLASS="BUTTON_ZAPOMNIALEM" title="Zapomniałem hasła" value=" "> </td>
</tr>
</form>
Kod źródłowy skryptu w Pythonie:
import cookielib
import urllib
import urllib2
# Store the cookies and create an opener that will hold them
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# Add our headers
opener.addheaders = [('User-agent', 'JestemAgentem')]
# Install our opener (note that this changes the global opener to the one
# we just made, but you can also just call opener.open() if you want)
urllib2.install_opener(opener)
# The action/ target from the form
authentication_url = 'https://adres.com'
# Input parameters we are going to send
payload = {
'NAZWA': 'WARTOSC',
'UZYTKOWNIK': 'aaa',
'HASLO': 'bbb'
}
# Use urllib to encode the payload
data = urllib.urlencode(payload)
# Build our Request object (supplying 'data' makes it a POST)
req = urllib2.Request(authentication_url, data)
# Make the request and read the response
resp = urllib2.urlopen(req)
contents = resp.read()
print "opening file..."
plik = open('zrodlo.txt','w+')
plik.write(contents)
plik.close
print "done"
Wynikiem jest pobranie tylko kodu źródłowego strony głównej, nie ma informacji o błędnym haśle, więc najprawdopodobniej nie zostało zainicjowane wciśnięcie przycisku.
Zastanawiam się, co jeszcze mogę zmodyfikować w kodzie.
PS. Próbowałem również zrobić logowanie w C++, ale nie udało mi się napisać kodu pobierającego źródło strony po zalogowaniu (próbowałem z libCURL).
Gdyby ktoś posiadał jakiś sprawdzony kod i chciałby udostępnić, to bardzo proszę się pochwalić.
Z góry dziękuję za pomoc.
Jarek