Wpis z mikrobloga

Mam następujący problem: chcę prostym skryptem się zalogować do panelu administratora mojej drukarki i wyświetlić przykładową zawartość panelu admina. Skrypt wygląda tak:

#!/usb/bin/python3

import requests

payload = {
'funfunction': 'HTTPAuthenticatefn',
'NextPage': '/protocols/ip/dns.php?from=wiredConfig',
'webUsername': 'adminsample',
'webPassword': 'passwordsample',
'frmaltDomain': 'default'
}

with requests.Session() as s:
p = s.post('http://192.168.1.2/userpost/xerox.set', data=payload)
print(p.text)

r = s.get('http://192.168.1.2/protocols/ip/dns.php?from=wiredConfig')
print(r.text)

I w requests.session() o ile POST przechodzi tak GET już nie. W payloadzie do postu jest linijka "nextpage" na którą mnie przekierowywuje po zalogowaniu i to działa. Natomiast GET trzy linijki niżej już nie - wywala mnie z powrotem do ekranu logowania. Czytałem, że requests.Session() trzyma ciacha póki trwa sesja więc dlaczego powyższy skrypt nie działa? Spotkał się ktoś już z czymś takim?

#python #programowanie #skryptowanie #it #informatyka
  • 9
@mlglegitnoscopez: ale z każdym requestem czyli między postem, a getem, czy za każdym odpaleniem skryptu? Jeśli to drugie to to normalne zachowanie.

Dodaj sobie print(r.request.headers) i zobacz czy w środku masz 'Cookie' i czy zgadza się z tym co jest w p.headers w 'Set-Cookie' (jeśli post zwraca status 30x to dodaj parametr allow_redirects=False żeby zobaczyć headery z odpowiedzi pierwszego żądania).
@egoistyczny_logistyk: no właśnie z każdym requestem. Stworzyłem sobie taki prosty skrypt:

#!/usb/bin/python3

import requests

with requests.Session() as s:
test1 = s.get('http://192.168.1.2/protocols/ip/dns.php?from=wiredConfig')
print(test1.cookies)
test2 = s.get('http://192.168.1.2/protocols/ip/dns.php?from=wiredConfig')
print(test2.cookies)

Ciacho PHPSESSID mam wyświetlone dwa razy z dwoma różnymi wartościami. Tak chyba nie powinno być, prawda?
@mlglegitnoscopez: no to tak jak pisałem, debugujemy po kolei.

Pod test1 dodaj print(test1.headers), a potem zobacz czy w print(test2.request.headers) jest wysyłane to PHPSESSID, które zostało ustawione przez Set-Cookie w test1.

Dodatkowo otwórz sobie ten url normalnie w chrome i w inspectorze zobacz czy odświeżając stronę też serwer ustawia nowe PHPSESSID - może po prostu tak ma być?
@egoistyczny_logistyk: Sprawdzałem wiresharkiem. Do momentu wyłączenia strony PHPSESSID pozostaje takie samo.

To mi wypluło po dodaniu twoich linijek:

TEST 1 -----
{'Cache-Control': 'max-age=0, no-store', 'Keep-Alive': 'timeout=10, max=99', 'X-Frame-Options': 'SAMEORIGIN', 'Content-Type': 'text/html; charset=UTF-8', 'Date': 'Thu, 05 Oct 2017 14:13:08 GMT', 'Content-Length': '3518', 'Connection': 'Keep-Alive', 'Set-Cookie': 'PHPSESSID=fd9fa5f27638d99e937661551b09adf3; path=/; secure, PHPSESSID=0ab20dc269e3c405382721e70f34891d; path=/; secure', 'Pragma': 'no-cache', 'Server': 'Apache', 'Expires': 'Thu, 19 Nov 1981 08:52:00 GMT'}
]>
TEST 1 -----
TEST 2 -----
{'User-Agent': 'python-requests/2.10.0', 'Connection':
@mlglegitnoscopez: No to coś Pan masz nie tak bo w drugim requeście nie idzie header z cookie. Prosty przykład bazujący na dokumentacji requests: https://pastebin.com/SsWXL1kh

Po wywołaniu wyświetla takie cuś:

{'Content-Length': '223', 'X-Processed-Time': '0.000696897506714', 'X-Powered-By': 'Flask', **'Set-Cookie': 'sessioncookie=123456789; Path=/'**, 'Server': 'meinheld/0.6.1', 'Connection': 'keep-alive', 'Via': '1.1 vegur', 'Location': '/cookies', 'Access-Control-Allow-Credentials': 'true', 'Date': 'Thu, 05 Oct 2017 17:50:55 GMT', 'Access-Control-Allow-Origin': '*', 'Content-Type': 'text/html; charset=utf-8'}

{'Connection': 'keep-alive', **'Cookie': 'sessioncookie=123456789'**, 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent':