Kuten otsikosta saattaa arvata, olen kiinnostunut Veikkauksen peleistä yleisesti, vaikkakin vakioveikkaus on viime aikoina ollut pääosassa. Menestystä tämän vaikean lajin parissa on turha käsitellä. Taustana on kuitenkin se, että Veikkaus ilmoitti jokin aika sitten sulkevansa kevytkäyttöliittymänsä, jolloin aiemmat sovellukseni muuttuvat toimimattomiksi.
Veikkaus on julkistanut uuden järjestelmän toiminnan osoitteessa https://github.com/VeikkausOy/sport-games-robot. En ymmärrä noista kuvauksista juuri mitään. Tässä vaiheessa olen onnistunut hakemaan monivetokohteet seuraavalla koodilla (ymmärtääkseni tässä käytetään Bill Gatesin MSHTML:ää):
procedure TMainForm.ButtonHaeMonariKohteetClick(Sender: TObject); var Linkki, S: String; oXmlHttp: OleVariant; begin Linkki := 'https://www.veikkaus.fi/api/v1/sport-games/draws?' + 'game-names=MULTISCORE'; oXmlHttp := CreateOleObject('Microsoft.XmlHttp'); oXmlHttp.Open('get', Linkki, False); oXmlHttp.SetRequestHeader('Accept', 'application/json'); oXmlHttp.SetRequestHeader('Content-type', 'application/json'); oXmlHttp.SetRequestHeader('X-ESA-API-Key', 'ROBOT'); oXmlHttp.Send; S := oXmlHttp.responseText; VarClear(oXmlHttp); Memo1.Lines.Clear; Memo1.Lines.Add(S); ShowMessage('Tehty'); end;
Seuraava vaihe olisi sisäänkirjautuminen. Osaako kukaan opastaa, miten sisäänkirjautuminen voidaan toteuttaa Delphillä. Tiedän, että Indy-komponentit ovat käytössä, mutta törmäsin niilläkin johonkin ongelmaan, mistä syystä käyttäisin mieluummin MSHTML:ää.
Mod. huom: oma kuvaus kuuluu profiiliin ja Delphi muihin kieliin!
Moi,
Itsekin olen kiinnostunut Veikkauksen ohjelmista monivetoon ja vakioon. Olen käyttänyt Jukosen Tapion ohjelmia vuosien ajan lähes päivittäin (vaihtelevalla menestyksellä). Nyt Tapio lopetti ohjelmien tarjoamisen Veikkauksen muutostyön vuoksi.
Nyt yritän löytää ihmisiä tai yritystä, joka osaisi tehdä ohjelman kyseisiin peleihin. Mielenkiintoista on se, että kukaan ei Suomessa tarjoa tällä hetkellä toimivia ohjelmia.
Ongelmana saattaa olla Veikkauksen lisenssisopimus:
https://github.com/VeikkausOy/sport-games-robot/wiki/Lisenssisopimus:
Asiakkaalla on oikeus käyttää ja muokata Ohjelmiston lähdekoodia silloin, kun asiakas toteuttaa Veikkauksen julkista rajapintaa hyödyntävän sovelluksen omaan henkilökohtaiseen käyttöönsä. Asiakkaan tulee olla rekisteröitynyt Veikkauksen kanta-asiakkaaksi eli hänellä tulee asiakkuutensa osana olla oma pelaajatunnus.
Veikkauksen myöntämä käyttöoikeus Ohjelmistoon ei sisällä oikeutta jälleenmyydä tai alilisensoida Ohjelmistoa taikka sen avulla luotua sovellusta. Asiakkaalla ei ole myöskään oikeutta siirtää tai luovuttaa käyttöoikeutta kolmansille osapuolille taikka muuten hyödyntää Ohjelmistoa kaupallisesti. Erityisesti asiakas ei saa tehdä Ohjelmiston avulla verkkopalveluita tai muita kolmansille tarjottavia kokonaisuuksia.
Veikkaus siis kieltää ohjelmistonsa kaupallisen hyödyntämisen. Ahtaasti tulkittuna ohjelmistoa käyttävän sovelluksen jakaminen korvauksettakin on kielletty. Lähetin Veikkaukselle asiaa koskevan kysymyksen, mutta vastausta ei ole vielä kuulunut.
Apua sovelluksen koodaamiseen kyselin pelkästään täältä. Koska teema ei heräättänyt minkäänlaista mielenkiintoa, annoin asian olla, ja palasin uudelleen sen pariin muutaman viikon kuluttua. Tavaamalla Veikkauksen ohjeita ja esimerkkejä ja lukemalla Delphi-sivustoja pääsin kohta kohdalta eteenpäin. Sovellus toimiikin nyt hyvin. Omalta osaltani en näe mahdottomaksi sitä, että tekisin pelejä lähettävän sovelluksen jaettavaksi ilmaiseksi. Odottelen kuitenkin Veikkauksen kannanottoa asiaan.
Vähemmän yllättäen Veikkaus Pelirobotti -ohjelman käyttöehdot koskevat vain Veikkaus Pelirobotin koodia. Jos teet Veikkauksen rajapinnan päälle oman sovelluksesi kopioimatta tuon Pelirobotin koodia tai "logiikkaa", niin silloin tietenkään kyseisen ohjelman lisenssiehdot eivät koske sinua mitenkään. Lue ennemmin rajapinnan käyttöehdot.
Uskoisin, että on sallittua tehdä ja myydä ohjelmaa. Sitä on saanut myydä tähänkin saakka ja Veikkaukselta se ei ole mitään pois. Päin vastoin - he saavat lisävaihtoa ohjelmaa käyttävien pelaajien avulla.
Veikkaus ei ole kovin hyvä vastailemaan kysymyksiin. Liekö siellä vastuunsiirtoa. Olen hyvin kiitollinen, jos saan tulevaisuudessa käyttää ohjelmaa.
Terveisin,
Santtu Kuosmanen
En ole perehtynyt ohjelmistojuridiikkaan millään tavalla, joten debatoiminen juridiikasta ei omalta osaltani ole järkevää. Oudoksun kuitenkin sitä, miksi Veikkaus asettaa ehdoksi "Veikkauksen myöntämä käyttöoikeus Ohjelmistoon ei sisällä oikeutta jälleenmyydä tai alilisensoida Ohjelmistoa taikka sen avulla luotua sovellusta", jos tarkoituksena ei ole rajoittaa. Ymmärrän toki hyvin, että Veikkauksen etu on täsmälleen päinvastainen. On kuitenkin tullut vuosien kuluessa selväksi, että sen tahto vastata kysymyksiin on olematon.
Tapio Jukosen ohjelmiin olen perehtynyt jonkin verran. Minun mielestäni ne olivat tavattoman monimutkaisia. Erilaisia kriteerejä oli niin runsaasti, että minä en kertaakaan vakavissani harkinnut niiden käyttämistä.
Santtu, riittääkö sinulle ohjelma, jolla rivejä voi lähettää Veikkaukselle, vai pitäisikö ohjelmassa olla kriteerejä, joilla vetoja rajataan. Jos kriteerejä tarvitaan, voisit kuvailla niitä. En näe mahdottomana sitä, että koodaisin kriteerejäkin mukaan, kunhan ne ovat riittävän tyhmiä. Koska koodaaminen on enimmäkseen harrastus, nopeita tuloksia ei kannata odottaa. Intohan vaihtelee suuresti.
Olen kanssasi täsmälleen samaa mieltä. Vakiossa en käytä mitään suodatuksia (suurin osa suodatuksista on leikkiä) enkä tiedä miksi Tapio niitä tarjosi. Suodatattamlla rivejä, voit pelata ainoastaan itseäsi vastaan. Tärkeintä on saada omat prosenttiarviot (ja rivien todennäköisyysarviuta) otteluihin ja verrata veikkauksen voitto-osuus arvioihin. Lopuksi on tietenkin tärkeää, että rivit saa syötettyä Veikkaukselle. AutoOnnetia ei välttämättä tarvitse olla.
Monivedossa käytän joskus minimi- ja maksimikerroinrajaa. Monivedossa joutuu joskus kierrättämään tuloksia yhden tuloksen kautta, koska yhdistelmiä tulee niin valtavasti (4:n kohteen jääkiekko, 5:n kohteen jalkapallo). Silloin "numerotaulukko on hyvä olla olemassa". Nopeasti en muuta keksi.
Mieluummin pelaan vakioita kuin monivetoja. Kirjoittelen täältä Amerikan päästä, joten vastausaikani saattavat olla hieman erikoisia.
Saakohan tänne laittaa email osoitetta?
T: Santtu
Silkkikauppias kirjoitti:
Oudoksun kuitenkin sitä, miksi Veikkaus asettaa ehdoksi "Veikkauksen myöntämä käyttöoikeus Ohjelmistoon ei sisällä oikeutta jälleenmyydä tai alilisensoida Ohjelmistoa taikka sen avulla luotua sovellusta", jos tarkoituksena ei ole rajoittaa.
Kuten jo sanottiin, lisenssi koskee Veikkauksen julkaisemaa esimerkkikoodia eikä suinkaan rajapintaa. Voi olla, että asiaa ei ole Veikkauksessa mietitty loppuun, mutta joka tapauksessa on ihan tavallista, että firmat julkaisevat esimerkkejä tuollaisilla ehdoilla. Selkokielellä ehto tarkoittaa, että jos haluat levittää ohjelmaasi, älä suoraan kopioi Veikkauksen esimerkkiä vaan koodaa itse.
SanttuK kirjoitti:
Saakohan tänne laittaa email osoitetta?
Osoitteesi näkyy halukkaille jo profiilisivullasi. Myös nimen kirjoitus viestiin on turhaa, koska nimimerkkisi näkyy viestin alussa ja oikean nimen voit laittaa profiiliisi.
OK.
mulla on sama ongelma kun SanttuK:lla, ennen oli ohjelmat peleihin, mutta eivät näköjään enää toimi ja sama kaveri kuka teki ne ei enää jaksa tehdä vaan ilmoitti että tee itse, ei se ole vaikeaa :) mulla oli ohjelmat noiden edellä mainittujen lisäksi voittajapeleihin.
eli mistäköhän sitä sitten pitäis aloittaa, osaiskohan joku antaa vaikka ohjelman nimen että mille kannattais alkaa harjoittelemaan koodausta. osaan itse tehdä ohjelmat exceliin eli sen verran on pohjaa ja rivien sisäänjättöä en ole alkanut ikinä edes vääntää kun se mikä oli toimi kaikkiin.
Olen edelleen kiinnostunut Veikkauksen ohjelmista.
Terve ketjuun!
Olen itse samassa vaiheessa kun ketjun avaaja. Miksi se vanha rajapinta pitikin lakkauttaa?
Esimerkkikoodi oli vauhdikas alku - pelitietojen hakeminen onnistuu.
Oletko "Silkkikauppias" jatkanut eteenpäin?
Itselläni kertoimien lataaminen (esim PäivänTrio) tuottaa suurta tuskaa.
Jos intoa riittää, niin kaikki apu on tervetullutta!
Minä pääsin eteenpäin Delphillä ja Indy-komponenteilla. Vakioveikkauksen pelitietojen ja pelitilanteen hakeminen sekä pelien lähettäminen onnistuvat hyvin. Muita pelejä en ole koodannut, mutta luulen, että ei niistä nyt suurta murhetta aiheutune.
Oletan, että tässä tilanteessa voin auttaa vain koodaamalla yleiseen käyttöön sopivan ohjelman. Ainakin aluksi siitä tulisi jättää pois pelattavien rivien lajitteleminen.
Jos ohjelmalle em. rajoituksin on tarvetta, voin aloittaa vakioveikkauksella tai monivedolla. Kehittäminen voi kuitenkin olla hidasta. Pyydän halukkaita ottamaan kantaa siihen, mistä tulisi lähteä liikkeelle.
ehdotus silkille, olisko tulosveto paras aloitusviritys?
>>Silkkikauppiaalle
Python-osaajat puhuvat peruskaurasta, mutta hienoa kuulla että joku on saanut pelittämään muillakin välineillä!
En tiedä onko kohtuuton pyyntö, mutta jos ei tunnu kohtuuttomalta, niin itseäni ainakin helpottaisi esimerkki (copy-paste) siitä miten esim pelitietojen haku tai kirjautuminen hoituu.
Delphi on tuttu, Indyä en ole käyttänyt ja Rest-rajapinta ja JSon-rakenteet nekin vasta tästä tuttuja. Johonkin se on aina karahtanut kun ei saa toimimaan halutusti.
Suurimmat ja helpommin hyödynnettävät edut saa varmasti Päivän Pari/Trio/Moniveto-tyyppisistä peleistä, joissa käyttäjän antamia kohteittaisia todennäköisyyksiä käytetään hyväksi suodatettaessa parhaimpia yhdistelmiä. Vakio tietysti tällä listalla mukana.
Yksiuloitteisissa peleissä (Voittajaveto, Tulosveto) ohjelmallinen apu on aika olematon.
Kirjautuminen ja saldotarkistus C#:lla (ei sisällä mitään hienouksia, fiksatkaa paremmaksi):
*Edit*
Mitä tuossa noita Pitkävetojen ja Vakioiden hakua testasin, oli palautuva jsonmöykky pakattu gzipillä.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; using Newtonsoft.Json; using System.Net; using System.IO; using System.Text.RegularExpressions; using Newtonsoft.Json.Linq; namespace Veikkaus.Services { public class LoginInfo { public string type { get; set; } public string login { get; set; } public string password { get; set; } } public class SportGames { private LoginInfo login; public SportGames(LoginInfo Login) { login = Login; } public string GetBalance() { var request = (HttpWebRequest)WebRequest.Create("https://www.veikkaus.fi/api/v1/players/self/account"); request.Accept = "application/json"; request.ContentType = "application/json"; request.Method = "GET"; request.Headers.Add("X-ESA-API-Key", "ROBOT"); request.CookieContainer = Login(); var response = request.GetResponse(); string jsonresult = ""; using(StreamReader _Answer = new StreamReader(response.GetResponseStream())) { jsonresult = _Answer.ReadToEnd(); }; response.Close(); JToken token = JObject.Parse(jsonresult); string balance = (string)token.SelectToken("balances.CASH.balance"); return balance; } private CookieContainer Login() { var request = (HttpWebRequest)WebRequest.Create("https://www.veikkaus.fi/api/v1/sessions"); request.Accept = "application/json"; request.ContentType = "application/json"; request.CookieContainer = new CookieContainer(); request.Method = "POST"; request.Headers.Add("X-ESA-API-Key", "ROBOT"); var jsonObject = JsonConvert.SerializeObject(login); using (var streamWriter = new StreamWriter(request.GetRequestStream())) { streamWriter.Write(jsonObject); } CookieContainer reqCookies = new CookieContainer(); var b = (HttpWebResponse)request.GetResponse(); foreach (Cookie c in b.Cookies) { reqCookies.Add(c); } b.Close(); return reqCookies; } } } //Käyttö: var Login = new LoginInfo() { type = "STANDARD_LOGIN", login = "käyttäjätunnus", password = "salasana" }; SportGames sg = new SportGames(Login); var r = sg.GetBalance(); MessageBox.Show(string.Format("Balance: {0} EUR",r));
Yritin edellistä esimerkkiä hyväksikäyttäen vääntää saman Delphille.
Ei toimi.
Löytyisikö vinkkiä?
var Cookie : TidCookieManager; Linkki, Json : string; JsonToSend: TStringStream; Response: TStringStream; sResponse: string; LHandler: TIdSSLIOHandlerSocketOpenSSL; begin Cookie := TidCookieManager.Create(NIL); LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); HTTP1.IOHandler:=LHandler; HTTP1.Request.ContentType := 'application/json'; HTTP1.Request.CharSet := 'utf-8'; HTTP1.Request.Accept := 'application/json'; HTTP1.Request.Method := 'POST'; HTTP1.AllowCookies := True; HTTP1.CookieManager := Cookie; HTTP1.Request.CustomHeaders.AddValue('X-ESA-API-Key', 'ROBOT'); Linkki := 'https://www.veikkaus.fi/api/v1/sessions'; Json := '{"type": "STANDARD_LOGIN", "login": "xxxxxxx", "password":"yyyy"}'; JsonToSend := TStringStream.Create(Json, TEncoding.UTF8); Response := TStringStream.Create(); try sResponse := HTTP1.Post(linkki, JsonToSend); ...
Minkä ilmoituksen saat responsen mukana?
Tuo mallihan toimii niin, että loginista saadut keksit siirretään seuraavaan requestiin mukaan (joka kerta uusi login, keksit pitää uusia joka kyselylle).
eli malli on seuraava:
1. Luo request loginille
2. Ota responsesta keksit talteen
3. Luo uusi request kyselylle (esim saldo), ja liitä requestiin mukaan loginin responsesta saadut keksit
4. Lue tulokset kyselyn responsesta
Ylläolevassa esimerkissäni GetBalance() metodissa haetaan keksit login -metodin palauttamana:
request.CookieContainer = Login();
groovyb kirjoitti:
Minkä ilmoituksen saat responsen mukana?
Kiitokset vastauksesta ja selvennyksestä!
Mielestäni eilen tuli "timed out". Nyt tulee EIdHTTPProtocolExceptiont with message 'HTTP/1.1 401 Unauthorized'.
oletko katsonut, miltä lähtenyt request näyttää? (esim fiddlerillä), tai varmistanut että käyttämäsi tunnukset on oikein?
tuossa myöskin kutsut create -metodia kaksi kertaa?
JsonToSend := TStringStream.Create(Json, TEncoding.UTF8); Response := TStringStream.Create();
mitä toisessa kutsussa tapahtuu? luodaan uusi stream Response muuttujaan, jota ei käytetä missään? No, tuo ei nyt vika ole, koska tuota ei käytetä itse postauksessa. Oma arvaukseni on, että customheaderiin laittamasi X-ESA-API-KEY ei näy requestin headereissä.
Fiddleri asennettu!
POST https://www.veikkaus.fi/api/v1/sessions HTTP/1.0 Content-Type: application/json; charset=utf-8 Content-Length: 65 X-ESA-API-Key: ROBOT Host: www.veikkaus.fi Accept: application/json Accept-Encoding: identity User-Agent: Mozilla/3.0 (compatible; Indy Library) {"type": "STANDARD_LOGIN", "login": "XXXXXXX", "password":"YYYY"}
Nyt onnistui logini!
Piti lisätä rivit:
HTTP1.ConnectTimeout:= 10000; HTTP1.Request.Clear; HTTP1.Request.BasicAuthentication := true;
Hitaasti etenee...
Nyt seuraava (ratkaisematon) haaste on hakea pelimäärät eli kombinaatioille.
Lähdin toteuttamaan PäivänTrio:a. Siihen ei oikein esimerkkiä löydy. Periaate on kai kuitenkin upottaa JSON rakenteeseen rivit joille palautuu voitto-osuudet.
JSON-rakenteesta on esimerkki VakioVeikkaukselle:
https://github.com/VeikkausOy/sport-games-robot/blob/master/doc/sport-winshare-request.json
Oma yritys Päivän Triolle - Vastaukseksi tulee Bad Request, joten onkohan tässä rakenteessa jotain pielessä?
[{ "page": 0, "selections": [{ "competitors": { "main": [ "6" ] }, "systemBetType": "SYSTEM", "rowId": 1 }, { "competitors": { "main": [ "5" ] }, "systemBetType": "SYSTEM", "rowId": 2 }, { "competitors": { "main": [ "5" ] }, "systemBetType": "SYSTEM", "rowId": 3 }] }]
Mitä äkkiä vilkaisin niin urli johon kikkare lähetetään, muodostetaan pelitunnisteen mukaan (eli ensin kyselet luonnollisesti pelit joista saat tarvittavat tunnisteet kyselyille):
POST /api/v1/sport-games/draws/SPORT/{drawId}/winshares
jossa drawId vastaa pelikohteen tunnistetta (ota myös {} merkit pois, eli validi urli on /api/v1/sport-games/draws/SPORT/12345/winshares, mikäli tuo tunniste nyt sattuu luku olemaan)
yhteen kyselyyn ei myöskään voi yli sataa kombinaatiota laittaa mukaan, eli tässä tapauksessa tulee kysely pilkkoa osiin.
groovyb kirjoitti:
Mitä äkkiä vilkaisin niin urli johon kikkare lähetetään, muodostetaan pelitunnisteen mukaan (eli ensin kyselet luonnollisesti pelit joista saat tarvittavat tunnisteet kyselyille):
POST /api/v1/sport-games/draws/SPORT/{drawId}/winshares
jossa drawId vastaa pelikohteen tunnistetta (ota myös {} merkit pois, eli validi urli on /api/v1/sport-games/draws/SPORT/12345/winshares, mikäli tuo tunniste nyt sattuu luku olemaan)
Tämän nyt oletan olevan oikein, eli tämän päivän ensimmäiseen Päivän Trioon urli olisi:
https://www.veikkaus.fi/api/v1/sport-games/draws/PICKTHREE/56363/winshares
Json-rakennetta olen kokeillut ruuvata - tällä nyt viimeksi kokeilin:
{"page": 0,"selections": [{"systemBetType": "SYSTEM", "competitors":[{"main":["6"]},{"main":["6"]},{"main":["6"]}]}]}
En tuosta "main"-kentästä tiedä, mutta tästä yritin kopioida soveltavasti:
https://github.com/VeikkausOy/sport-games-robot/blob/master/doc/pickthree-wager-request.json
Edistystä taas tapahtunut.
Lopulta keksin itse, että fiddlerin avulla saan Veikkauksen sivuilta katsottua oikean JSon rakenteen, jotta saan haettua kertoimet halutuille yhdistelmille.
Eipä tätä kovin hyvin ollut siellä Githubissa selitetty..
Esimerkiksi tämä oli pielessä:
https://www.veikkaus.fi/api/v1/sport-games/draws/PICKTHREE/56363/winshares
Olisi pitänyt olla näin:
https://www.veikkaus.fi/api/v1/sport-games/draws/PICKTHREE/56363/odds
Aihe on jo aika vanha, joten et voi enää vastata siihen.