Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Tiedon siirto nettisivulle

Sivun loppuun

Sinis [19.12.2005 13:09:46]

#

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

tuomas [19.12.2005 20:34:32]

#

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

Sinis [22.12.2005 11:52:02]

#

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?

Metabolix [22.12.2005 12:18:27]

#

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

Sinis [22.12.2005 15:57:52]

#

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&amp;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?

Metabolix [22.12.2005 16:18:38]

#

Jokseenkin tuohon tapaan. Osoite on juuri siinä actionin jäkeen, mutta se pitää muotoilla oikein. Erityisesti &amp; 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

Sinis [11.01.2006 19:42:49]

#

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>&nbsp;</h1>
<h1>Virhetilanne</h1>
<h2>Peliä ei syötetty oikeassa muodossa Veikkauksen järjestelmään.
</h2>
</blockquote>

</body>

</html>

sooda [12.01.2006 11:14:50]

#

Eikö postdataa lähettäessä pitäisi kertoa myös datan pituus (Content-length-headeri)?

Sinis [12.01.2006 11:36:48]

#

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

sooda [12.01.2006 12:05:04]

#

Eiks octet noissa tarkota yleensä tavua. Eli iha len("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" ) esimerkiks. Siis tuon postdatan pituus.


Sivun alkuun

Vastaus

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

Tietoa sivustosta