Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: cURL: virheellinen avain

Sivun loppuun

joah [28.11.2014 18:59:21]

#

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?

Teuro [28.11.2014 19:06:34]

#

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.

joah [28.11.2014 20:03:01]

#

Sain nyt SESSIONIDn file_get_contentilla 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.

-tossu- [28.11.2014 21:36:17]

#

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.

joah [28.11.2014 21:46:43]

#

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.

-tossu- [28.11.2014 22:59:21]

#

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>

joah [29.11.2014 09:47:39]

#

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_contentilla 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

-tossu- [29.11.2014 18:22:00]

#

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.

Metabolix [29.11.2014 19:28:52]

#

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ä.

joah [29.11.2014 21:28:35]

#

-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ä...

-tossu- [29.11.2014 22:54:35]

#

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.

joah [05.01.2015 16:10:33]

#

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ä.

joah [06.01.2015 19:35:21]

#

Jee! Sain koodin toimimaan lisäämällä tämän:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta