Moi,
Olen yrittänyt PHP:llä kirjoitella ohjelmaa jolla pääsisi kirjautumaan veikkauksen sivuille ja sen jälkeen esim. lähettämään saldokyselyn omalle tilille. Nyt ilmeisesti tulee jotain ongelmaa siinä että en osaa ottaa talteen kirjautumisen yhteydessä tulevaa cookieta. Veikkauksen GitHub sivuilla on kyllä jotain ohjeita (sport-games-robot), mutta en ilmeisesti osaa soveltaa nittä PHP:lle.
Jos jollain olisi heittää valmis koodinpätkä jolla hoidetaan kirjautuminen ja sen jälkeen vaikkapa tuo saldokysely, niin olisin kovasti kiitollinen. Ja tarkoitus tosiaan olisi hoitaa koodaus PHP:llä, koska sillä on aiemmin tullut hieman koodailtua (mutta ei näköjään tarpeeksi).
Moro,
Voisitko laittaa tänne jo aikaansaamasi koodin, niin siittä voidaan sitten lähteä rakentaan toimivaa kokonaisuutta.
Moi,
Tällaista koodia kokeilin loginin osalta.
function veikkaus_login( $user, $pass ){ $host = "https://www.veikkaus.fi"; $header = array( "Accept: application/json", "Content-Type: application/json", "X-ESA-API-Key: ROBOT" ); $url = $host ."/api/bff/v1/sessions"; $postdata = "type:STANDARD_LOGIN, login:" . $user . ", password:" . $pass; $ch = curl_init(); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); curl_setopt( $ch, CURLOPT_ENCODING, "" ); curl_setopt( $ch, CURLOPT_COOKIESESSION, true ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_POST, 1 ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $header ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $postdata ); curl_setopt( $ch, CURLINFO_HEADER_OUT , 1 ); $data = curl_exec( $ch ); curl_close( $ch ); return $data; }
Tiedon pitää olla JSON-muodossa, kas näin:
$postdata = json_encode(["type" => "STANDARD_LOGIN", "login" => $user, "password" => $pass]); // Tulos: $postdata = '{"type": "STANDARD_LOGIN", "login": "käyttäjänimi", "password": "salasana"}'
Kiitos, nyt tuo login näyttäisi menevän läpi. Tulee vastauksessa datan mukana mm. nämä tiedot.
HTTP/1.1 200 OK Set-Cookie: isessionid=A86... Set-Cookie: TS0150b1a4=0173...
Mitenhän näitä loginin tietoja sitten käytetään kun haetaan seuraavaksi esim. oman tilin tietoja. Pitääkö nuo cookiet lähettää seuraavilla kyselyillä curl headerissä, vai tallentaa johonkin session asetuksiin?
Veikkauksen sivuilla on ohje saldon kyselylle:
lainaus:
Tällä pyynnöllä voidaan pyytää pelitilin saldo ja tieto mahdollisista kate- varauksista.
Pyyntö:
GET /api/v1/players/self/account
Kun asetat myös arvon CULRLOPT_COOKIEJAR, evästeet käsitellään ja lähetetään automaattisesti. Sen sijaan CURLINFO_HEADER_OUT on yleensä tarpeeton ja vain vaikeuttaa datan käsittelyä. Katso koodivinkki kirjautumisesta.
Kiitos jälleen, nyt menee login läpi sekä saan luettua tilin tiedot. Tästäpä on hyvä jatkaa eteenpäin pelaamisen automatiosointia.
Tässä vielä lopullinen koodi joka tuntuis toimivan OK.
function veikkaus_balance( $user,$pass ){ // Veikkaus url $host = "https://www.veikkaus.fi"; // Vaaditut otsikkotietueet $header = array( "Accept: application/json", "Content-Type: application/json", "X-ESA-API-Key: ROBOT" ); // login url $url = $host ."/api/bff/v1/sessions"; // curl postdata loginille $postdata = json_encode( ["type" => "STANDARD_LOGIN", "login" => $user, "password" => $pass] ); // curl init $ch = curl_init(); // Asetetaan curl optioita curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); curl_setopt( $ch, CURLOPT_ENCODING, "" ); curl_setopt( $ch, CURLOPT_FAILONERROR, 1 ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $ch, CURLOPT_URL, $url ); curl_setopt( $ch, CURLOPT_POST, 1 ); curl_setopt( $ch, CURLOPT_HTTPHEADER, $header ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $postdata ); curl_setopt( $ch, CURLOPT_COOKIESESSION, true ); curl_setopt( $ch, CURLOPT_COOKIEJAR, "/dev/null" ); // Suoritetaan curl pyyntö $data = curl_exec( $ch ); $info = curl_getinfo( $ch ); // Kysellään tilin saldo jos login meni läpi if($info['http_code'] == 200) { $url = $host ."/api/v1/players/self/account"; curl_setopt( $ch, CURLOPT_POST, 0 );; curl_setopt( $ch, CURLOPT_URL, $url ); $data = curl_exec( $ch ); } else { $data = "Login failed, http_code: " . $info['http_code']; } // Suljetaan curl ja palautetaan data curl_close( $ch ); return $data; } $balance = veikkaus_balance( $login, $password );
Sivusta tuli vaan mieleen, että miksi valitsit curlin etkä käyttänyt jotain perus REST -clienttiä joita varmaan on php:llekin pilvin pimein? Tosin PHP koodaus ei kuulu omaan portfolioon, joten saattahan tämä olla standardikin tapa tehdä tämä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.