Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Python, Veikkaus API ja JSON?

Sivun loppuun

Santtu55 [07.11.2014 06:02:46]

#

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!

-tossu- [07.11.2014 20:58:16]

#

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.

Santtu55 [07.11.2014 23:51:46]

#

ok kiitti, pitää tutkia.

Ainakaan tota request kirjastoa en ole saanut toimimaan.

Chiman [08.11.2014 10:32:52]

#

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

Santtu55 [10.11.2014 02:27:34]

#

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.

Santtu55 [10.11.2014 11:45:48]

#

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 ?

The Alchemist [10.11.2014 22:42:04]

#

Tuollaiset arkiset jutut onnistuvat millä tahansa yleisellä ohjelmointikielellä.

Santtu55 [10.11.2014 23:31:10]

#

Ihan vain sen vuoksi kyselin että jos tälltä olisi löytynyt apua, mutta eipä sitten taida löytyä. kiitos

Metabolix [11.11.2014 00:03:02]

#

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.

The Alchemist [12.11.2014 09:38:45]

#

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.

Santtu55 [12.11.2014 15:17:06]

#

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.

qwerty12302 [12.11.2014 19:17:37]

#

Santtu55 kirjoitti:

voiko python koodin kääntää exe koodiksi

Pythonin exeksi kääntäminen onnistuu py2exe-moduulilla

Santtu55 [12.11.2014 20:46:12]

#

Kiitos.

Pitää nyt sitten kokeilla saako tuolla pythonilla tota toimimaan laisinkaan.

Ellei joku täällä tiedä tapaa jolla toteuttaa toi PHP llä ?

-tossu- [12.11.2014 22:41:40]

#

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.

Santtu55 [13.11.2014 00:40:32]

#

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!

Oskuz [13.11.2014 07:20:44]

#

Jos se on exe, et tarvitse tulkkia, jos .py tarvitset.

Chiman [13.11.2014 09:46:47]

#

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.

Santtu55 [13.11.2014 13:37:51]

#

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

Chiman [13.11.2014 15:07:18]

#

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

qwerty12302 [13.11.2014 16:25:10]

#

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

Santtu55 [13.11.2014 17:20:53]

#

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

jaketsu [13.11.2014 17:30:12]

#

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.

Santtu55 [13.11.2014 21:34:26]

#

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!

Chiman [13.11.2014 22:29:12]

#

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.

Chiman [14.11.2014 13:34:37]

#

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
                },

Santtu55 [16.11.2014 00:37:29]

#

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 ?

Teuro [16.11.2014 00:54:38]

#

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.

Santtu55 [16.11.2014 00:57:25]

#

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ä

Grez [16.11.2014 07:40:12]

#

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

Santtu55 [16.11.2014 11:01:53]

#

Ok, kiitos tiedosta. Nyt aukesi.

The Alchemist [16.11.2014 11:38:57]

#

Ei se nyt ole vain tuhannella kerrottuna vaan kyllä ne millisekunnitkin voivat olla mitä vain väliltä 0-999.

Grez [16.11.2014 12:25:57]

#

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.

Santtu55 [16.11.2014 18:00:07]

#

Moi, toi aika / pvm hoidossa ja tulee oikeat tulokset.

Palaan vielä mahdollisesti itse tohon python - asiaan.

Kiitokset avusta.


Sivun alkuun

Vastaus

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

Tietoa sivustosta