Hei, kysyisin viisaammilta jotka tuntevat JSON systeemiä ja Pythonia paremmin.
Veikkaus siis muuttaa systeemejään 1.1.2015 alkaen niin että kaikki kyselyt ja pelien viennin tehdään JSON kautta.
Aikaisempi Veikkauksen systeemi on ollut mobile-liittymä joka onkin toiminut hyvin.
En saa tota esim koodia toimimaan kun en oikein tiedä miten request - kirjasto liitetään, ilmeisesti: import urllib , mutta tukeeko tuo keksejä joita Veikkaus vaatiin.
Veikkaus käyttää ohjeistukseen alla olevaa linkkiä:
https://github.com/VeikkausOy/sport-games-robot
# Vaaditut otsikko tietueet headers = { 'Content-type':'application/json', 'Accept':'application/json', 'X-ESA-API-Key':'ROBOT' } # Sisäänkirjautuminen Veikkauksen tilille, palauttaa sessio-objektin def login (username, password): s = requests.Session() login_req = {"type":"STANDARD_LOGIN","login":username,"password":password} r = s.post("https://www.veikkaus.fi/api/v1/sessions", data=json.dumps(login_req), headers=headers) if r.status_code == 200: return s else: raise Exception("Authentication failed", r.status_code) # Main funktio. # 1. Kirjautuu sisää. # 2. Hakee monivedon tulevat kohteet (kirjautuneena käyttäjänä) # 3. Tulostaa vastauksen def main(): s = login('esimerkki','salasana') r = s.get('https://www.veikkaus.fi/api/v1/sport-games/draws?game-names=MULTISCORE', headers=headers) print r.text
myös emailiin voi pistää raviguru (at) mailaxy.com kommenttia.
Kiitos.
Lisäys:
Ja toinen kysymys ,
voisiko edellä mainitun toteuttaa PHP:llä `???
kiitos
Mod. lisäsi kooditagit!
Santtu55 kirjoitti:
En saa tota esim koodia toimimaan kun en oikein tiedä miten request - kirjasto liitetään, ilmeisesti: import urllib , mutta tukeeko tuo keksejä joita Veikkaus vaatiin
Linkistäsi löytyy mm. tieto, että kirjasto tukee keksejä sekä linkki kirjaston sivuille. Myös Veikkauksen esimerkkikoodi kannattaa katsoa läpi.
Santtu55 kirjoitti:
voisiko edellä mainitun toteuttaa PHP:llä `???
Voisi. Kannattaa kuitenkin pysyä Pythonissa, jolla esimerkkikin on tehty.
ok kiitti, pitää tutkia.
Ainakaan tota request kirjastoa en ole saanut toimimaan.
Santtu55 kirjoitti:
Ainakaan tota request kirjastoa en ole saanut toimimaan.
Sen nimi on requests, kuten näkee esim. rivistä:
s = requests.Session()
Asenna se ennen käyttöä ja koodissa sen saa käyttöön rivillä:
import requests
Joo tiedän että kirjoitin tohon kirjaston väärin
ja olen kokeillut myös tota import toimintoa
mutta en ainakaan vielä ole saanut toimimaan
veikkaukseen päin.
Pitää jatkaa ton pythonin testausta kun varsinainen kieli jolla teen softaa ei ole tuo. Mutta pitää vaan löytää tapa tehdä noi haut JSON illa ja välittää parametrin JSOn koodiin pythonille.
Toi requests - kirjasto ei näytä kyllä toimivan tai ainakaan näyttäisi toimivaan kun ajaa tolla 'Run' jutulla joka tossa editorissa on.
Kokonaan toinen asia vielä on että voiko 'Python' - softalla tehdä koodia johon voi välittää parametrina tiedot, tunnuksessa, salasanasta ja linkistä josta haetaan tietoa ?
Tuollaiset arkiset jutut onnistuvat millä tahansa yleisellä ohjelmointikielellä.
Ihan vain sen vuoksi kyselin että jos tälltä olisi löytynyt apua, mutta eipä sitten taida löytyä. kiitos
Koodivinkeissä on esimerkki, miten PHP:n cURL-funktioilla voi käsitellä istuntoa, kirjautua sivustolle jne. Sitten vain katsot Veikkauksen esimerkeistä, millaista JSON-dataa eri osoitteisiin pitää lähettää eri tilanteissa.
Vaikea sinua on auttaa, kun et ole esittänyt mitään järkevää yksittäistä ongelmaa.
Santtu55 kirjoitti:
Ihan vain sen vuoksi kyselin että jos tälltä olisi löytynyt apua, mutta eipä sitten taida löytyä. kiitos
Jos haluat koodia, niin kysy koodia. Jos kysyt vain epämääräisesti "onko mahdollista", niin kukaan ei ymmärrä antaa sinulle koodia vastaukseksi. Toisaalta nämä todellakin ovat arkisia juttuja ja esimerkkitoteutus löytyy mille tahansa kielelle ihan googlettamalla. Näköjään jo täältä Putkastakin löytyi.
No niinpä esimerkkiä todellakin kaipaan asiaan.
Sitten vielä kysymys toi python näyttää hieman sekavalta, niin voiko python koodin kääntää exe koodiksi ja saako siihen välitettyä parametreja.
Koska tarkoitus olis kutsu tota muusta ohjelmasta.
Tai saisiko esimerkkikoodin joko pythonilla tai sitten php:llä ?
Kiitos. The_Alchemist ja muut.
ps. ei niin arkisia koska en varsinaisesti ole noita JSON, JAVA koodeja tehnyt.
Santtu55 kirjoitti:
voiko python koodin kääntää exe koodiksi
Pythonin exeksi kääntäminen onnistuu py2exe-moduulilla
Kiitos.
Pitää nyt sitten kokeilla saako tuolla pythonilla tota toimimaan laisinkaan.
Ellei joku täällä tiedä tapaa jolla toteuttaa toi PHP llä ?
Pythonin voi käynnistää toisesta ohjelmasta siinä missä minkä tahansa muunkin ohjelman. Pythonille tulee antaa ensimmäiseksi parametriksi polku py-tiedostoon. Loput parametrit välitetään suoritettavalle Python-koodille. Ne löytyvät sys.argv:stä. Exe:ksi kääntäminen on täysin turhaa.
Santtu55 kirjoitti:
Ihan vain sen vuoksi kyselin että jos tälltä olisi löytynyt apua, mutta eipä sitten taida löytyä. kiitos
Ohjasin sinut jo kertaalleen Veikkauksen sekä Requestsin dokumentaatioon. Sieltä löytyy vastaus kaikkiin esittämiisi kysymyksiin sekä esimerkkikoodia. Mikäli et ymmärrä jotain, voit kysyä tarkennusta yksityiskohtiin. Kerro samalla mahdollisimman tarkasti, mikä asia koodissa ei toimi ja miten haluaisit sen toimivan.
Epämääräisiin pyyntöihin sekä kysymyksiin, jotka antavat ymmärtää, ettei dokumentaatiota ole edes katsottu, täällä saa harvemmin asiallisia vastauksia.
Santtu55 kirjoitti:
Ellei joku täällä tiedä tapaa jolla toteuttaa toi PHP llä ?
Aivan varmasti tietää, ja Metabolix viittasikin PHP:llä tehtyyn koodivinkkiin. Kuten jo vastasin, kannattaa pysyä Pythonissa, jos kokemusta ei ole PHP:stä sen enempää, koska Veikkauksen esimerkitkin ovat Pythonia.
ok, kiitos, mutta tarvitseeko asentaa aina python jos käyttää py koodia ilman pythonia ? yleensähän exe ei vaadi itse pythinia asennettuna.
Vai olenko ymmärtänyt tämän pythonin väärin ?
Lisäys: Olen nyt kokeilemassa tuota ja olen lukenut dokumentaation moneenkin kertaan ja katsonut jopa python oppaan täällä, mutta toistaiseksi tekee ihan älyttömiä virheitä. Mutta palaan noihin myöhemmin.
Lisäys: tai sitten en osaa käyttää tota shell juttua testaukseen
Lisäys:
veikkaus.py on siis python file nimi ja sisältää def main
>>> veikkaus.py -h Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> veikkaus.py -h NameError: name 'veikkaus' is not defined >>> main -h Traceback (most recent call last): File "<pyshell#1>", line 1, in <module> main -h NameError: name 'h' is not defined >>>
Mod. lisäsi kooditagit!
Jos se on exe, et tarvitse tulkkia, jos .py tarvitset.
Python on tulkattava kieli, jonka ohjelmakoodi suoritetaan tulkin avulla. Exe-paketin luominen tarkoittaa Pythonin tapauksessa sitä, että ohjelmakoodin mukaan liitetään tulkki ja tarvittavat kirjastot. Vaikka ohjelmaa ei näin käännetä binääriksi, etuna on ohjelman jakelun helpottaminen.
Santtu55: Älä kirjoita tiedoston nimeä Python-komentokehotteessa, vaan kirjoita käyttöjärjestelmän komentotulkissa:
python veikkaus.py
Tai jos paketoit koodisi exe-muotoon, kirjoita sen exe-tiedoston nimi.
>>> python veikkaus.py SyntaxError: invalid syntax >>>
kokeilin siis tota tota python shellillssä ja antoi tuon ilmoituksen, koko testi koodi tässä: editoin 'Edit with IDLE' ja sen jälkeen run (F5) johon kirjoitan ton kutsun mikäli siis oikein ymmärsin ( tai todennäköisesti väärin )
import sys import getopt """ import requests import json import copy import time import datetime """ max_input = 25 veikka = "https://www.veikkaus.fi" headers = { 'Content-type':'application/json', 'Accept':'application/json', 'X-ESA-API-Key':'ROBOT' } wager_template = { "type":"normal", "drawId":"", "gameName":"", "selections":[], "stake":0 } def parse_arguments ( arguments ): optlist, args = getopt.getopt(arguments, 'ha:u:p:g:d:f:s:') params = { "username":"", "passowrd":"", "game":"", "draw":"", "input":"", "stake":0 } for o, a in optlist: if o == '-h': print "-h prints this help" print "-a <action> (PLAY, WINSHARE, LIST_DRAWS)" print "-u <username>" print "-p <password>" print "-g <game> (MULTISCORE, SCORE, SPORT)" print "-d <draw number>" print "-f <input file> containing the wagers" print "-s <stake> (in cents, same stake used for all wagers)" sys.exit(0) elif o == '-a': params["action"] = a elif o == '-u': params["username"] = a elif o == '-p': params["password"] = a elif o == '-g': params["game"] = a elif o == '-d': params["draw"] = a elif o == '-f': params["input"] = a elif o == '-s': params["stake"] = int(a) return params #def main( arguments ): params = parse_arguments( arguments ) if params["action"] == "HAESALDO": print "Haetaan saldo" elif params["action"] == "HAETIETO": print "Haetaan tieto"
Lisäys: Ihan siis vain testaan miten toi toimii ensin.
Mod. lisäsi kooditagit!
Santtu55 kirjoitti:
>>> python veikkaus.py
SyntaxError: invalid syntax
>>>kokeilin siis tota tota python shellillssä ja antoi tuon ilmoituksen
Niin kokeilit ja se on väärin tehty. Python-komentotulkki eli Python Shell on huono paikka ajaa itsenäisiä kooditiedostoja, eikä sitä tehdä noin. Oikea tapa on tehdä näin (vaihda työhakemisto oikeaksi):
C:\Users\YourName> python veikkaus.py
Ilman kooditägejä näyttää siltä, että sisennykset varmaan puuttuvat joistakin kohdista. Lisäksi näyttää siltä, että käytät vieläkin Python Shell-komentoriviä. Käytä mieluummin käyttöjärjestelmän omaa komentoriviä (ks. kuva).
Yep, tota cmd juttua käytin myös muttei palauttanut mitään.
Testaan ja tutkin sillä.
Kiitoksia.
Josko saisi jotain näkyvää tälläkin kielellä.
Lisäys: Toisaalta miksi Pythonissa on toi Shell ja mikähän sen tarkoitus mahtaa olla
Lisäys: sisennykset on se vain kopioitui tuohon noin
Santtu55 kirjoitti:
Lisäys: sisennykset on se vain kopioitui tuohon noin
Kokeilepa käyttää seuraavalla kerralla kooditageja. Koodin luettavuus paranee silloin aika merkittävästi.
Vielä kerran, ajoin tätä ton cmd kautta mutta ei palauta mitään main ikkunasta niin miten pitäisi kutsua. Tulostaa ainoastaan ton mikä ulmopuolella. Tässä koodi, ihan simppeli.
import sys import getopt import copy """ -- koe argumentit --- """ def tee_argu ( argu ): optlist, args = getopt.getopt(argu, 'ha:f' ) params = { "input":"" } for o, a in optlist: if o == '-h': print "-h tulostaa tämän helpin" sys.exit(0) elif o == "-f": params["input"] = a return params """ -- pääohjelma --- """ def main( argu ): params = tee_argu( argu ) print "Ollaan täällä" print "Ollaan täällä"
ton tiedoston nimi: VeikkausJSON.py
kokeilin cmd VeikkausJSON.py -h
tai VeikkausJSON.py -f
mutta ainoastaan toi viimeinen rivi tulee mutta ei mene pääohjelmaan ???
Lisäys: Ja kyllä toi tässä kirjoitus editorissa johon tuon kopion oli oikein, siis noi jäsennykset.
Lisäys: Kokeilin laittamalla tohon kooditagit - python
Mod. lisäsi kooditagit, koska et osannut!
Santtu55 kirjoitti:
mutta ainoastaan toi viimeinen rivi tulee mutta ei mene pääohjelmaan ???
Jos et kutsu main-funktiota, sitä ei suoriteta. Pythonissa mitään funktiota ei suoriteta automaattisesti, toisin kuin esim. C-kielessä.
Pastea se koko python-koodisi noiden kooditagien sisään, lue keskustelun ohjeet.
Testasin eilen Python 3:n standardikirjaston avulla (ilman ylimääräisiä, asennettavia kirjastoja) tuota Veikkauksen rajapintaa. Alla oleva koodi on tiedostossa veikkaus.py:
#!/usr/bin/env python3 import urllib.request import http.cookiejar import io import gzip import json def get_opener(): cj = http.cookiejar.CookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) opener.addheaders = [('Accept', 'application/json'), ('Content-Type', 'application/json'), ('X-ESA-API-Key', 'ROBOT')] return opener def sport_list_fetch(url_opener): f = url_opener.open('https://www.veikkaus.fi/api/v1/sport-games/draws?game-names=SPORT') f_info = f.info() f_data = f.read() if ('Content-Encoding', 'gzip') in f_info.items(): # response is gzipped bi = io.BytesIO(f_data) gf = gzip.GzipFile(fileobj=bi, mode='rb') f_data = gf.read() return f_data def test_sport_list_fetch(): opener = get_opener() sport_list = sport_list_fetch(opener) # bytes object sport_list = sport_list.decode() # from bytes to UTF-8 JSON string (python 3 default) sl_json = json.loads(sport_list) print(json.dumps(sl_json, sort_keys=True, indent=4)) def main(): test_sport_list_fetch() if __name__ == '__main__': main()
Tuon ajaminen siis vaatii, että Python 3 on asennettuna. Kun koodi suoritetaan komennolla...
python3 veikkaus.py
...tulostuvan tekstin alku näyttää tältä:
{ "draws": [ { "brandName": "6", "closeTime": 1415984100000, "drawTime": 1415916000000, "gameName": "SPORT", "gameRuleSet": { "additionalPrizeTierAvailable": true, "additionalPrizeTierPrice": 10, "basePrice": 10, "maxPrice": 300000, "oddsType": "VARIABLE", "quickPickAvailable": true }, "id": "51502", "name": "Jalkapallovakio", "openTime": 1415764800000, "reducedSystems": [ { "groupId": "1", "id": "R00040009_12", "numberOfDoubleSelections": 0, "numberOfRows": 9, "numberOfSingleSelections": 8, "numberOfTripleSelections": 4 },
Tervehdys taas,
Kiitos Chiman, toi avasi näkemystä python koodista, mutta yksi kysymys jota noista JSON / JAVA ympyröistä olen tässä tänään etsinyt on seuraava:
"closeTime": 1416106500000,
kun aika esitetään noin niin miten se on pakattu ja koska toi aika esim. on Veikkauksen sivuilla 16.11.2014 klo 4:55 .
Pitäisi siis jostain löytää kaava ton avaamiseen, ei python koodia vaan oikea kaava, mistähän tuota voisi etsiä ja kaivella ?
millisekunteja vuodesta 1970 luultavasti.
1416106500000 / 1000 => 1416106500 sekuntia 1416106500 / 86400 => 16390,12153 päivää 16390 / 365 => 44,9044 vuotta
Ehkä mielekkäämpää on laskea nykyisen ajan (vuodesta 1970) ja closedTime erotusta vaikka millisekunteina. Tällä saisi ainakin selville koska kyseinen peli sulkeutuu.
Kiitos , tuota vähän ajattelinki ja laskinkin mutta en päässyt aivan yhteisymmärrykseen tosta alkuajasta.
Lisäys: 1.1.1970 - 16.11.2014 , välillä on 16390 päivää , joten eikä toi aika pitäisi siis alkaa tuolla ?
Lisäys: Kannattaa unohtaa äskeinen päätelmä
UNIX-aika tarkoittaa useissa käyttöjärjestelmissä (mm. Linux ja muut POSIX-yhteensopivat järjestelmät) käytettävää ajan tallennustapaa. Se ilmaisee ajan sekunteina ajanhetkestä 1. tammikuuta 1970 kello 00:00:00 UTC.
Javascriptissä käytetään "UNIX-aikaa" kerrottuna tuhannella, eli millisekunteja tuosta edellä määritellystä alkuhetkestä.
Ok, kiitos tiedosta. Nyt aukesi.
Ei se nyt ole vain tuhannella kerrottuna vaan kyllä ne millisekunnitkin voivat olla mitä vain väliltä 0-999.
The Alchemist kirjoitti:
Ei se nyt ole vain tuhannella kerrottuna vaan kyllä ne millisekunnitkin voivat olla mitä vain väliltä 0-999.
Vaan millä luvulla?
Voihan se sekuntimääräkin, jonka kertomisesta puhuin, olla suuremmalla tarkkuudella kuin kokonaislukuna.
Moi, toi aika / pvm hoidossa ja tulee oikeat tulokset.
Palaan vielä mahdollisesti itse tohon python - asiaan.
Kiitokset avusta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.