Hei,
Olen yrittämässä tehdä kustomoitua uutta välilehteä. Välilehdelle tulisi tärkeimmät linkit sekä ilmoituksia. Ilmoituksissa olisi mm. Wilmasta uudet ilmoitukset. Ongelmana on nyt se, että Wilma ei halua päästää minua sisään, vaikka tunnukset ovat täysin oikeat. Käyttämäni koodi:
<?php class Wilma { function getPage($username, $password, $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://wilma.kaupunki.fi/login"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, 'Login='.$username.'&Password='.$password); curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $store = curl_exec($ch); curl_setopt($ch, CURLOPT_URL, 'https://wilma.kaupunki.fi/' . $url); return curl_exec($ch); } // Tanne jatkossa lisaa kasittelyfunktiota tms. } echo Wilma::getPage("etunimi.sukunimi", "salasana", "exams/calendar"); ?>
Tulos:
Virheellinen avain (common-4033) Lomakkeen tulee sis�lt�� istuntokohtainen avain. T�m�n virheen todenn�k�isin aiheuttaja on ongelma Wilman mallinetiedostossa. Sulje selaimestasi kaikki Wilma-ikkunat ja -v�lilehdet ja yrit� uudelleen. Jos ongelma jatkuu, ota yhteys oppilaitokseen. Siirry Wilman etusivulle StarSoft Wilma 2.17f2 fi 28.11.2014 18:54
Eli joku istuntokohtainen avain pitäis luoda? Vai onko Wilma "blokannut" kaikki tälläiset cURL-viritelmät?
Nopeasti lähdekoodista kaivettu seuraavaa:
view-source:https://wilma.espoo.fi/login?returnpath=forms kirjoitti:
<input type="hidden" name="SESSIONID" value="HM0Ver8PNSv1"><input type="hidden" name="returnpath" value="/forms">
Näyttäisi vaihtuvan joka latauskerralla.
Sain nyt SESSIONIDn file_get_content
illa sekä regexillä (lähetän sen Login ja Password POST-elementtien kanssa), mutta sama virhe toistuu. Alhaalla tosin on tekstin fi ja päivämäärän väliin on ilmaantunut käyttäjän etu- ja sukunimi.
Kokeile asettaa headeri Content-Type: application/x-www-form-urlencoded. Testasin vanhaa koodiani, joka toimii muuten samoin, Wilman versiolla 2.17f2, ja se näytti vielä toimivan.
Ei, ei toimi. Palauttaa saman virheen. Onko tarkoituksena siis lisätä tälle omalle tiedostossa (missä skripti on) tämä kyseinen header, vai cURLin headerille? Testasin molemmilla, sama lopputulos.
Lähetä headeri login-pyynnön mukana. Jos epäilet koodisi toimivuutta, kokeile HTTP-pyynnön lähettämistä käsin esimerkiksi s_client:illä. Onnistunut kirjautuminen esimerkiksi selaimella haetulla SESSIONID:llä näyttää hieman lyhennettynä tältä:
$ openssl s_client -quiet -connect wilma.kaarina.fi:443 POST /login HTTP/1.0 Content-Length: 58 Content-Type: application/x-www-form-urlencoded SESSIONID=abcdefghijklm&Login=oskari.ketola&Password=passu HTTP/1.0 302 Moved Temporarily Content-Type: text/html; charset=ISO-8859-1 Server: Wilma/2 (Windows; StarSoft Oy) Indy/OpenSSL ... Set-Cookie: Wilma2SID=abcdefghijklmnopqrstuvwxyz012345; Path=/; HttpOnly; Secure Location: https://wilma.kaarina.fi/?checkcookie Content-Length: 224 <html> ... <p>Käyttämäsi selain ei tue uudelleenohjausta. Ole hyvä ja <a href="https://wilma.kaarina.fi/?checkcookie">paina tästä jatkaaksesi</a>.</p> ... </html>
Testasin tuota s_clienttiä, ja sain tuon saman uudelleenohjausjutun. Kuitenkin, kun käytän seuraavaa koodinpätkää, ilmoittaa se edelleen sen saman virheellinen avain-virheen.
<?php class Wilma { function getPage($username, $password, $url) { if($c = preg_match_all("/<input type=\"hidden\" name=\"SESSIONID\" value=\"(.*?)\">/", file_get_contents("https://wilma.kaupunki.fi/login?returnpath=forms"), $matches)) { $sessid = $matches[1][0]; } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://wilma.kaupunki.fi/login"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, 'Login='.$username.'&Password='.$password.'&SESSIONID='.$sessid); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $store = curl_exec($ch); curl_setopt($ch, CURLOPT_URL, 'https://wilma.kaupunki.fi/' . $url); return curl_exec($ch); } } echo Wilma::getPage("etunimi.sukunimi", "salasana", "exams/calendar"); ?>
Miten yllä oleva koodi eroaa sinun ratkaisustasi?
Haittaako muuten, kun lataan ensin file_get_content
illa sessionid:n ja cURLilla sitten yritän postata sessionid:tä? Koska jos se vaihtuu joka latauskerrassa...
Vielä tässä mitä sivu ilmoittaa:
Virheellinen avain (common-4033) Lomakkeen tulee sis�lt�� istuntokohtainen avain. T�m�n virheen todenn�k�isin aiheuttaja on ongelma Wilman mallinetiedostossa. Sulje selaimestasi kaikki Wilma-ikkunat ja -v�lilehdet ja yrit� uudelleen. Jos ongelma jatkuu, ota yhteys oppilaitokseen. Siirry Wilman etusivulle StarSoft Wilma 2.17f2 fi Etunimi Sukunimi 29.11.2014 9:44
Laita virheilmoitukset päälle ja varmista samalla, että SESSIONID:n haku onnistuu. Ennen kuin olet saanut kirjautumisen toimimaan, kannattaa vain tulostaa $store-muuttujan arvo eikä yrittää hakea tietoa muilta sivuilta. Kristallipalloni veikkaa, ettei SESSIONID:n hakeminen onnistu, koska palvelimesi PHP:stä puuttuu https-wrapperi.
Koodisi näyttää toimivan kyllä Espoon Wilmaan, sillä saan kirjatumispyyntöön vastaukseksi loginfailed-uudelleenohjauksen.
Onko jokin järkevä syy hakea alussa tietoa funktiolla file_get_contents sen sijaan, että kaikki pyynnöt tehtäisiin samalla cURLilla?
Voisit myös laittaa merkistön kuntoon, ettei tarvitsisi katsoa noita rikkinäisiä ääkkösiä.
-tossu- kirjoitti:
Laita virheilmoitukset päälle
Kaikki ovat päällä (jos näin se tehdään):
ini_set('display_errors',1); ini_set('display_startup_errors',1); ini_set("error_reporting", E_ALL | E_STRICT); error_reporting(-1);
ja palauttaa seuraavan virheen, en usko että vaikuttaa mitenkään...
Strict Standards: Non-static method Wilma::getPage() should not be called statically in /Applications/MAMP/htdocs/get.php on line 28
-tossu- kirjoitti:
ja varmista samalla, että SESSIONID:n haku onnistuu
Kun tulostan sessid-muuttujan, antaa se kyllä ihan kelvon ID:n. (ei enää... kts. alhaalla)
-tossu- kirjoitti:
sillä saan kirjatumispyyntöön vastaukseksi loginfailed-uudelleenohjauksen.
Kun tulostan $store-muuttujan, saan myös loginfailed-ilmoituksen.
Metabolix kirjoitti:
Onko jokin järkevä syy hakea alussa tietoa funktiolla file_get_contents sen sijaan, että kaikki pyynnöt tehtäisiin samalla cURLilla?
Ei :D
Metabolix kirjoitti:
Voisit myös laittaa merkistön kuntoon, ettei tarvitsisi katsoa noita rikkinäisiä ääkkösiä.
Anteeksi.
Öhm. Nyt taisi mennä vähän päin puuta...
<?php ini_set('display_errors',1); ini_set('display_startup_errors',1); ini_set("error_reporting", E_ALL | E_STRICT); error_reporting(-1); header('Content-Type: text/html; charset=utf-8'); class Wilma { function getPage($username, $password, $url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://wilma.kaupunki.fi/login?returnpath=forms' . $url); $loginform = curl_exec($ch); if($c = preg_match_all("/<input type=\"hidden\" name=\"SESSIONID\" value=\"(.*?)\">/", $loginform, $matches)) { $sessid = $matches[1][0]; } curl_setopt($ch, CURLOPT_URL, "https://wilma.kaupunki.fi/login"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, 'Login='.$username.'&Password='.$password.'&SESSIONID='.$sessid); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $store = curl_exec($ch); curl_setopt($ch, CURLOPT_URL, 'https://wilma.kaupunki.fi/' . $url); return curl_exec($ch); } } echo Wilma::getPage("etunimi.sukunimi", "salasana", "exams/calendar"); ?>
Palauttaa:
Strict Standards: Non-static method Wilma::getPage() should not be called statically in /Applications/MAMP/htdocs/get.php on line 28 Kirjaudu sisään, ole hyvä. Kirjaudu sisään Käyttäjätunnus: Salasana: StarSoft Wilma 2.17f2 © 2000-2014 StarSoft Oy Notice: Undefined variable: sessid in /Applications/MAMP/htdocs/get.php on line 16 Virheellinen avain (common-4033) Lomakkeen tulee sisältää istuntokohtainen avain. Tämän virheen todennäköisin aiheuttaja on ongelma Wilman mallinetiedostossa. Sulje selaimestasi kaikki Wilma-ikkunat ja -välilehdet ja yritä uudelleen. Jos ongelma jatkuu, ota yhteys oppilaitokseen. Siirry Wilman etusivulle StarSoft Wilma 2.17f2 fi 29.11.2014 21:23
Käytän ekaa kertaa cURLia + olen aloittelija muutenkin, niin olen ihan metsässä...
Tee yksi asia kerrallaan. Aloita vaikka luomalla Wilma-luokka, joka on jaettu metodeihin siten, että voit testata niitä erikseen.
Koodisi antaa virheilmoituksen Undefined variable: sessid, joka viittaa siihen, ettei SESSIONID:n haku onnistu. Mieti, mistä se johtuu ja korjaa ongelma. Sen jälkeen voit alkaa toteuttaa kirjautumista.
Hei!
En jaksanut miettiä tuolloin enään asiaa, mutta haluaisin nyt ratkaista ongelman.
Kun tutkin tarkemmin, sain tuon "Käyttämäsi selain ei tue uudelleenohjausta. Ole hyvä ja paina tästä jatkaaksesi."-ilmoituksen, niinkuin tossu näytti esimerkissään.
Ongelmana on varmaan siis se, että keksi "Wilma2SID" ei tule mukana kohtaan "Tänne"?
Eli tämä:
<?php ini_set('display_errors',1); ini_set('display_startup_errors',1); ini_set("error_reporting", E_ALL | E_STRICT); error_reporting(-1); $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_COOKIESESSION, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt"); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_URL, "https://wilma.kaupunki.fi/login?returnpath=forms"); $sessionKey = "Session key not found!!!!"; if($c = preg_match_all("/<input type=\"hidden\" name=\"SESSIONID\" value=\"(.*?)\">/", curl_exec($ch), $matches)) { $sessionKey = $matches[1][0]; } echo $sessionKey; $username = "etunimi.sukunimi"; $password = "salasana"; curl_setopt($ch, CURLOPT_URL, "https://wilma.kaupunki.fi/login"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, 'Login='.$username.'&Password='.$password.'&SESSIONID='.$sessionKey); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); echo curl_exec($ch); $url = "exams/calendar"; curl_setopt($ch, CURLOPT_URL, 'https://wilma.kaupunki.fi/' . $url); // Tänne curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); echo curl_exec($ch); curl_close($ch); ?>
palauttaa tämän:
OIKEASESSIONID Käyttämäsi selain ei tue uudelleenohjausta. Ole hyvä ja paina tästä jatkaaksesi. Virheellinen avain (common-4033) Lomakkeen tulee sisältää istuntokohtainen avain. Tämän virheen todennäkäisin aiheuttaja on ongelma Wilman mallinetiedostossa. Sulje selaimestasi kaikki Wilma-ikkunat ja -välilehdet ja yritä uudelleen. Jos ongelma jatkuu, ota yhteys oppilaitokseen. Siirry Wilman etusivulle StarSoft Wilma 2.17f3 fi Etunimi Sukunimi 5.1.2015 16:02
Vai oonko missannut (tai unohtanut tässä n. kuukauden aikana) jotain?
Ei palauta virheitä.
Jee! Sain koodin toimimaan lisäämällä tämän:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
Aihe on jo aika vanha, joten et voi enää vastata siihen.