Olen kyhännyt ohjelmaa, joka generoi vakioveikkauksen rivejä. Ongelmaksi on muodostunut se, miten rivit saisi siirrettyä veikkauksen on-net –palveluun. Generoidut rivit ovat .txt –tiedostossa muodossa:
1x21x21x21122
1x21x21x21122
jne.
Ohjelman tulisi aukaista uusi formi, jossa kysytään tekstitiedoston sijainti sekä ennen rivien lähetystä veikkauksen käyttäjätunnus ja salasana. Tämän jälkeen rivit siirrettäisiin veikkauksen järjestelmään kymmenen rivin 'kuponkeina'.
Kun en voi sinisin silmin väittää olevani erikoisen osaava VB-ohjelmoija niin kaikki apu tulisi enemmän kuin tarpeeseen. Mistä lähteä liikkeelle? API-funktioista? Olo on kuin suunnistajalla, joka on suossa reisiään myöten ilman karttaa ja kompassia...
Kannattaa lähteä liikkeelle tutustumalla winsock nimiseen komponenttiin, jonka saat lisättyä projektiin näin: project -> components -> microsoft winsock control 6.0 kohtaan rasti ja ok. Sitten lisäät sen vain normaalisti formille.
Kyseisellä komponentilla on mahdollista luoda yhteyksiä internetin ylitse. Tuolta koodivinkeistä löytyy esimerkkejä joihin kannattaa tutustua, jotta saat perustoiminnan selville.
Tämän jälkeen kannattaa lähteä selvittämään veikkauksen sivujen toimintaa lukemalla niiden lähdekoodeja (tarvitset oikeastaan vain skriptien nimet, joihin sitten tuolla winsockilla printtaat http-pyyntöjä). Http-protokollan toiminnasta löytyy lisää infoa vaikkapa täältä: http://www.w3.org/Protocols/rfc2616/rfc2616.html
'yksi tapa kysyä käyttäjältä jotakin.. Dim filepath As String filepath = InputBox("Missä on filu jemmattuna?", "Kerros nyt") MsgBox filepath
formien kanssa pelleilyä: load formin_nimi 'lataa formin muistiin formin_nimi.show 'asettaa formin näkyville formin_nimi.hide 'piilon meni unload formin_nimi 'poistaa formin muistista
Toi winsock rupeaa jo avautumaan, mutta mitäköhän toi:
"tarvitset oikeastaan vain skriptien nimet, joihin sitten tuolla winsockilla printtaat http-pyyntöjä"
meinaa? Löysin kyllä sivujen lähdekoodin, mutta en kyllä ymmärrä mikä siinä on se skriptin nimi, mitä pitäisi 'manipuloida'. Alla pätkä lähdekoodista:
<td><a title="Liverpool - Newcastle" href="" onclick="openCompWindow('sport', '1e74864b476861741c6327a99a906106', 1); return false;">Liverpool - Newcastle</a></td> <td class="coupon" onmouseover="highlight(this,true);" onmouseout="highlight(this,false);"> <div><label for="vakio-1-1">1 <input type="checkbox" name="vakio" id="vakio-1-1" value="1" onclick="updateLabel(this);" /> </label></div> </td>
Tossa se checkbox on se paikka mihin tietoa pitäisi siirtää ts. muuttaa boxi checked -tilaan. Mitenköhän tästä eteenpäin?
Ei alkuunkaan niin. Katsot form-tagin sisältä, minne se tiedot lähettää (action) ja miten (method). Sitten keräät kaikkien lomakkeen kenttien nimet ylös ja teet vaikka niiden nimiset muuttujat, joihin laitat sen, mitä kuhunkin kenttään haluat. Tähän asti kaikki siis tehty käsin. Sitten väsätään näistä tiedoista sopiva tekstinpätkä, joka lähetetään palvelimelle. Siitä esimerkkiä täällä (katso ohjelman lähdekoodista): http://www.vbforums.com/showthread.php?t=334645
Eli ensiksi koodiin määritellään noi HTTP-löpinät :
(tosta en tiedä onko oikeassa muodossa kun en ole päässyt vielä testaamaan)
siirrettävä = "POST " & " HTTP/1.1" & vbCrLf & _
"Host: " & Osoite & vbCrLf & _
"Connection: close" & vbCrLf & _
"Accept: */*" & vbCrLf & _
vbCrLf (+ tähän pötköön vissiin tulee lähetettävä tieto)
Sen jälkeen lähetetään tieto winsockilla:
Winsock1.SendData siirrettävä
Onko 'osoite' tuo alla olevassa koodissa actionin jälkeen?
<form name="sportf" action="/pelit?game=sport&op=checkGame" method="post" onsubmit="return isGameFolderSubmitValid();" >
Tän jälkeen on html:ssä on inputit:
<input type="hidden" name="I12" value="" />
Lähettääkö sivu noi kaikki inputtien valuet palvelimelle vai miten toi oikein hoituu? Mistä saa selville missä muodossa lähetettävä teksti(?) pitää olla? Onko toi em. lähetysperiaate edes lähellä oikeeta?
Jokseenkin tuohon tapaan. Osoite on juuri siinä actionin jäkeen, mutta se pitää muotoilla oikein. Erityisesti & on pelkkä &-merkki.
strHTTP = "POST http://www.jotakin.fi/blah.php?mita_lie=roskaa HTTP/1.0" & vbCrLf strHTTP = strHTTP & "Host: www.jotakin.fi" & vbCrLf strHTTP = strHTTP & "User-Agent: Mozilla" & vbCrLf 'yms. yms. strHTTP = strHTTP & vbCrLf 'tyhjä rivi strHTTP = strHTTP & "I12=&submit_nappi=laheta&muu_ruutu=on" 'Kaikki formin kentät
Mikähän vika tossa allaolevassa koodissa oikein on? Jos laitan hostin perään URI-osan ja sitten lähetettävät tiedot pötköön ja liimaan ne selaimeen niin homma hoituu.
Ohjelmalla ajettuna serveri ilmoittaa, että tieto ei ole oikeassa muodossa. Mistäköhän toi ero mahtaa johtua? Onko sillä mitään väliä lähettääkö tietoa HTTP- vai HTTPS-sivulle?
' rivin lähetys Private Sub cmdSend_Click() Dim strHTTP As String If blnConnected Then Exit Sub ' konfigurointi winsock.Protocol = sckTCPProtocol winsock.RemoteHost = "www.veikkaus.fi" winsock.RemotePort = 80 strHTTP = "POST /www4text?game=sport&op=checkGame&l=f HTTP/1.1" & vbCrLf strHTTP = strHTTP & "Host: www.veikkaus.fi" & vbCrLf strHTTP = strHTTP & "Transfer-Encoding: chunked" & vbCrLf strHTTP = strHTTP & "Content-Type: text/html" & vbCrLf strHTTP = strHTTP & vbCrLf strHTTP = strHTTP & "t=1&m=13&I11=1&I12=X&I13=2&I14=2&I15=1&I16=1&I17=X&I18=1&I19=2&I1a=2&I1b=2&I1c=1&I1d=2" txtRequest.Text = strHTTP winsock.Connect ' wait for a connection While Not blnConnected DoEvents Wend ' tietojen lähetys winsock.SendData strHTTP End Sub
Alla toi serverin vastaus:
HTTP/1.1 200 OK Date: Wed, 11 Jan 2006 17:54:54 GMT Server: Expires: Wed, 11 Jan 2006 18:04:54 GMT Set-Cookie: JSESSIONID=C7892CE17EB507BADF85204C80616835; Path=/ Pragma: Last-Modified: Wed, 11 Jan 2006 17:54:54 GMT Cache-control: Transfer-Encoding: chunked Content-Type: text/html 193 <html> <head> <title>Poikkeustilanne</title> <style type="text/css"> BODY, P, A, UL, TD, TH, H1, H2, H3 { font-family: Arial, Helvetica, Univers, sans-serif } </STYLE> </head> <body BGCOLOR="White" TEXT="Black" LINK="Blue" VLINK="Blue"> <blockquote> <h1> </h1> <h1>Virhetilanne</h1> <h2>Peliä ei syötetty oikeassa muodossa Veikkauksen järjestelmään. </h2> </blockquote> </body> </html>
Eikö postdataa lähettäessä pitäisi kertoa myös datan pituus (Content-length-headeri)?
Mites toi datan 'pituus' lasketaan?
Tollainen löyty:
The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs
mutta ei se kyllä mulle kerro mitään..
Eiks octet noissa tarkota yleensä tavua. Eli iha len("t=1&m=13&I11=1&I12=X&I13=2&I14=2&I15=1&I16
Aihe on jo aika vanha, joten et voi enää vastata siihen.