Wpis z mikrobloga

TL;DR: Jak w #python zaimplementować zapamiętanie sesji https z autentykacją?

Piszę sobie w programik pobierający dane z pewnego portalu, ale do pełnej funkcjonalności potrzebuję się do niego zalogować. Korzystam z requests i requests-html żeby otworzyć sesję i pobierać dane, potem beautifulsoup4 do parsowania HTML. Działa to mniej więcej tak:

session = requests_html.HTMLSession()
response = session.post('[https://portal.pl/login',](https://portal.pl/login',) data=auth_data)
response = session.get('[https://portal.pl/dane')](https://portal.pl/dane'))
page = bs4.BeautifulSoup(response.html.html)

To zupełnie dobrze śmiga ale tylko tak długo, jak działa skrypt. Chciałem zachować sesję pomiędzy uruchomieniami poprzez serializację obiektu sesji za pomocą pickle, trochę inspirując się tym rozwiązaniem, w skrócie zapisuję uzyskaną sesję:

with open('session.pickle', 'wb') as file:
pickle.dump(session, file)

a potem normalnie odczytuję ją i robię dalej requesty:

with open('session.pickle', 'rb') as file:
session = pickle.load(file)
response = session.get('[https://portal.pl/dane')](https://portal.pl/dane'))

Problem: taka sesja pozostaje "żywa" tylko przez paręnaście minut. Jeśli odpalę skrypt np. pół godziny potem, to gety nie udadzą się i będę musiał logować się ponownie.

O co jeszcze muszę zadbać, co jeszcze zapisać, żeby to działało permanentnie? Jak to jest, że na tym samym portalu mogę zalogować się raz, wyłączyć na noc (albo na weekend) komputer, wrócić, a w przeglądarce sesja będzie zapamiętana?

#webdev #python
  • 13
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@sokytsinolop: I właśnie tego nie rozumiem - dlaczego ciasteczko, które uzyskuje moja przeglądarka, jest nadal akceptowane nawet po paru dniach nieaktywności, a to, które otrzymuje mój skrypt jest nic nie warte już po pół godzinie?
  • Odpowiedz
@salad_fingers: to backend przechowuje waliduje sesje, samo ciasteczko nic nie znaczy jest tylko identyfikatorem.

I właśnie tego nie rozumiem - dlaczego ciasteczko, które uzyskuje moja przeglądarka, jest nadal akceptowane nawet po paru dniach nieaktywności, a to, które otrzymuje mój skrypt jest nic nie warte już po pół godzinie?


to już zależy od logiki która się wykonuje na backendzie. sprawdz czy na pewno request logowania jest taki sam z pythona jak
  • Odpowiedz
moze nie wysylasz pola "zapamietaj mnie"


@sokytsinolop: Sprawdziłem teraz formularz logowania i w `-ie do wprowadzania nazwy i hasła nie ma w ogóle czegoś takiego jak "zapamiętaj mnie". Natomiast są jeszcze dwa -y, których nie przekazywałem do mojego oryginalnego posta - jeden z login z URLem do przekierowania po zalogowaniu a inny jeszcze o jakiejś enigmatycznej nazwie _prm`. Spróbuję przekazać tak jak to robi przeglądarka i zobaczymy.

Na sprawach
  • Odpowiedz
@sokytsinolop: Dosłałem pozostałe parametry (łącznie z tym _prm) i sesja trzyma już ponad godzinę - zobaczymy, czy dociągnie do rana.

@dziekuje: Tak, domyślny user agent, nie pamiętam teraz jaki daje mi requests ale nic tam nie zmieniałem. Mój cel pozwala mi się jednak z niego zalogować. Spróbuję potem z innych, dzięki za radę.

@Lunatik: Heh, większość czasu operuję w przestrzeni angielskojęzycznej, czasami mi przeciekają takie
  • Odpowiedz
@sokytsinolop: Nie znałem tego, dzięki! Na razie wysłałem request tak jak to odczytałem z formy i sesja od jakichś 12 godzin pozostaje żywa. Trochę inny zestaw ciasteczek otrzymałem, więc na pewno coś się zmieniło i wygląda to dobrze. Będę obserwował dalej, jakby co skorzystam z analizy ruchu.

Wielkie dzięki za podpowiedzi! :)
  • Odpowiedz