Avatar billede SimonBStoevring Nybegynder
25. oktober 2010 - 17:16 Der er 30 kommentarer og
1 løsning

Hent cookies med cURL

Hej,

Jeg har et lignende spørgsmål kørende. Jeg har dog valgt at lave et nyt for en ordensskyld, da jeg er startet forfra med scriptet i forsøg på at kunne finde fejlen hen ad vejen, men allerede ved starten er det gået galt.

Jeg finder det altså rarer og mere overskuelt at starte endnu en tråd.

Jeg forsøger at hente de cookies, som som sættes på nedenstående side. De gemmes i cookie.txt - men der gemmes kun én cookie. Hvis man besøger siden via sin browser, vil man se, at der sættes tre cookies uden man logger ind - de sættes ved blot et besøg.

Siden er https://www.lectio.dk/lectio/285/login.aspx.

Tre cookies skulle gerne sættes: isloggedin3, lectiogsc, ASP.NET_SessionId, men kun lectiogsc sættes på min server.

Min kode er:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.lectio.dk/lectio/285/login.aspx');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_exec($ch);
curl_close($ch);
Avatar billede repox Seniormester
25. oktober 2010 - 17:25 #1
Prøv at kigge i denne tråd: http://www.eksperten.dk/spm/907205
Specifikt kommentar #7
Avatar billede SimonBStoevring Nybegynder
25. oktober 2010 - 18:31 #2
Mange tak for dit svar.

Jeg har forsøgt med dit eksempel, men der sættes stadig kun én cookie. Jeg har endda forsøgt at logge ind med dit script (som er mit mål til at ende med - at kunne logge ind på siden og gå til en underside) men der sættes stadig kun én cookie. Jeg har tilføjet CURLOPT_SSL_VERIFYHOST og CURLOPT_SSL_VERIFYPEER fordi det er en secure side.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://www.lectio.dk/lectio/285/login.aspx');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'm$Content$username2=**FJERNET**&m$Content$password2=**FJERNET**');
curl_setopt($ch, CURLOPT_COOKIEFILE, realpath("cookie.txt")); // realpath() er tilføjet, fordi at cURL skal bruge den fulde sti
curl_setopt($ch, CURLOPT_COOKIEJAR, realpath("cookie.txt")); // CURLOPT_COOKIEJAR er tilføjet, for ellers vil den ikke opsamle cookies til din cookiefil
curl_exec($ch); 

$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, 'http://www.lectio.dk/lectio/285/SkemaNy.aspx?type=elev&elevid=1628118635');
curl_setopt($ch2, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, false);certificate
curl_setopt($ch, CURLOPT_COOKIEFILE, realpath("cookie.txt"));
curl_setopt($ch, CURLOPT_COOKIEJAR, realpath("cookie.txt"));
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch2);
curl_close($ch2);
print $output;

Er der nogen, som har en idé om, hvorfor dette ikke virker? Den vil ikke engang sætte de tre cookies, som sættes, når man besøger via browseren. Den logger tilsyneladende heller ikke ind.

Dette er indholdet af cookie.txt efter et besøg:


# Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

www.lectio.dk    FALSE    /    FALSE    253402300799    lectiogsc    47904902-49f9-3fad-c8d0-84dd34656787
Avatar billede SimonBStoevring Nybegynder
25. oktober 2010 - 21:30 #3
Det lader til, at nogle cookies - eller i hvert fald cookien 'isloggedin3' bliver sat gennem JavaScript.

Kan jeg gøre noget mod dette?
Avatar billede repox Seniormester
25. oktober 2010 - 22:00 #4
Sandsynligvis ikke - det kræver jo en reel klient, og selvom om cURL kan meget, så erstatter det naturligvis ikke den faktiske klient. Prøv at spørge dem om de vil stille en webservice til rådighed.
Avatar billede coderdk Praktikant
25. oktober 2010 - 23:22 #5
Installér Live HTTP Headers i firefox og se hvad der sker, når du logger ind ;)
Avatar billede SimonBStoevring Nybegynder
26. oktober 2010 - 07:07 #6
repox, det var jeg også bange for. Jeg håbede blot, at der var et smuthul.

coderdk, det har jeg lige gjort og jeg forstår i og for sig godt, hvad der står, jeg er bare ikke sikker på, hvordan jeg skal bruge det i mit script. Er der noget helt konkret, jeg bør holde øje med?
Avatar billede coderdk Praktikant
26. oktober 2010 - 12:41 #7
Hvis du skal have login til at virke, skal du nok prøve at sende nogenlunde det samme i din POST ;)

Jeg har haft mange problemer med disse .NET-sider, men det lykkedes da jeg scrapede __EVENTTARGET, __EVENTARGUMENT og __VIEWSTATE - Altså hent loginsiden, find de tre hidden fields, og POST dem sammen med dit login etc.
Avatar billede SimonBStoevring Nybegynder
26. oktober 2010 - 14:26 #8
coderdk, jeg vil da rigtig gerne have det til at virke :-)

Det må være dem her, du mener. Jeg ved bare ikke, hvad jeg skal sende med dem. Kan du sige mig hvilken værdi, de skal have?

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTIwODk5MDU2MDEPFgIeCUxvZ2luVmlldwIBFgJmD2QWBGYPZBYCAgUPFgIeBFRleHRlZAICDxYCHgxhdXRvY29tcGxldGUFA29mZhYCAg0PZBYCAgEPZBYCAgMPZBYEZg9kFgICAw9kFgQCAQ8WAh4JaW5uZXJodG1sBRdNYXJpYWdlcmZqb3JkIEd5bW5hc2l1bWQCBQ9kFgICAQ9kFgJmDxYCHgltYXhsZW5ndGgFAjUwZAIBD2QWAgIDDw8WAh4JTWF4TGVuZ3RoAjJkZBgBBRFtJENvbnRlbnQkTG9naW5NVg8PZGZklgPQSkMPt8eUoUVLKOoEGQ==" />
Avatar billede coderdk Praktikant
26. oktober 2010 - 14:50 #9
<?php
De skal have den værdi som de har første gang du går ind.

Først henter du loginsiden, gemmer cookies - vha preg_match find __EVENTVALIDATION og __VIEWSTATE og gem dem i nogle variable (det lader ikke til at __EVENTTARGET og __EVENTARGUMENT har noget i sig - send dem som tomme).

Dernæst lav din POST med dit brugernavn og kodeord, og send også de tre variable med den værdi du fandt :)


Prøv:

    define( "AGENT", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5
.30729)" );

    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, 'https://www.lectio.dk/lectio/285/login.aspx' );
    curl_setopt( $ch, CURLOPT_COOKIESESSION, 1 );
    curl_setopt( $ch, CURLOPT_HEADER, 1 );
    curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
    curl_setopt( $ch, CURLINFO_HEADER_OUT, 1 );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
    curl_setopt( $ch, CURLOPT_COOKIEFILE, "/tmp/cookiefile" );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, "/tmp/cookiefile" );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt( $ch, CURLOPT_VERBOSE, 1 );
    $cnt = curl_exec( $ch );
    curl_close( $ch );

    // Find viewstate og eventvalidation
    preg_match( "/__VIEWSTATE.*?value=\"(.*?)\"/i", $cnt, $m );
    $viewstate = urlencode( $m[1] );
    preg_match( "/__EVENTVALIDATION.*?value=\"(.*?)\"/i", $cnt, $m );
    $eventval = urlencode( $m[1] );
   
    $post = 'm%24Content%24username2=' . $DIT_BRUGERNAVN
          .'&m%24Content%24password2' . $DIT_PASSWORD;
          .'&__EVENTTARGET=m%24Content%24submitbtn2&__EVENTARGUMENT='
          .'&__VIEWSTATE=' . $viewstate
          .'&__EVENTVALIDATION=' . $eventval
          .'&m%24defaultformbtn=';

    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, 'https://www.lectio.dk/lectio/285/login.aspx' );
    curl_setopt( $ch, CURLOPT_REFERER, 'https://www.lectio.dk/lectio/285/login.aspx' );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt( $ch, CURLOPT_VERBOSE, 1 );
    curl_setopt( $ch, CURLOPT_HTTPGET, 0 );
    curl_setopt( $ch, CURLOPT_HEADER, 1 );
    curl_setopt( $ch, CURLINFO_HEADER_OUT, 1 );
    curl_setopt ($ch, CURLOPT_POST, 1 );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
        "Expect:"
        ,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        ,"Accept-Language: en"
        ,"Accept-Encoding: gzip,deflate"
        ,"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"
        ,"Keep-Alive: 115"
        ,"Connection: keep-alive"
    ) );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
    curl_setopt( $ch, CURLOPT_COOKIEFILE, "/tmp/cookiefile" );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, "/tmp/cookiefile" );
    $cnt = curl_exec( $ch );
    curl_close( $ch );

    echo "Resultat: " . $cnt;
Avatar billede coderdk Praktikant
26. oktober 2010 - 16:05 #10
Husk i øvrigt at sætte $DIT_BRUGERNAVN og $DIT_PASSWORD i min kode ;)
Avatar billede SimonBStoevring Nybegynder
26. oktober 2010 - 16:12 #11
coderdk, aha. Nu forstår jeg :-) Jeg har prøvet dit script uændret - dog med $DIT_BRUGERNAVN og $DIT_PASSWORD sat og jeg har ændret CURLOPT_COOKIEFILE og CURLOPT_COOKIEJAR til at lede efter 'cookie.txt'.

Det ser ikke ud til at virke, men giver mig et output jeg aldrig har set før.

Output kan ses på http://snuzzer.dk/lectio-get/coderdk.php.

Scriptet sætter følgende cookies i cookie.txt:

# Netscape HTTP Cookie File
# http://www.netscape.com/newsref/std/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

www.lectio.dk    FALSE    /    FALSE    253402300799    lectiogsc    567e0929-75b3-2734-fac2-9a93da87a2f2
www.lectio.dk    FALSE    /    TRUE    0    ASP.NET_SessionId    jsoisqyi0axyowean4w55lpc

Og koden.


    define( "AGENT", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)" );

    $DIT_BRUGERNAVN = '';  // fjernet
    $DIT_PASSWORD = '';  // fjernet

    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, 'https://www.lectio.dk/lectio/285/login.aspx' );
    curl_setopt( $ch, CURLOPT_COOKIESESSION, 1 );
    curl_setopt( $ch, CURLOPT_HEADER, 1 );
    curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
    curl_setopt( $ch, CURLINFO_HEADER_OUT, 1 );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
    curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt( $ch, CURLOPT_VERBOSE, 1 );
    $cnt = curl_exec( $ch );
    curl_close( $ch );

    // Find viewstate og eventvalidation
    preg_match( "/__VIEWSTATE.*?value=\"(.*?)\"/i", $cnt, $m );
    $viewstate = urlencode( $m[1] );
    preg_match( "/__EVENTVALIDATION.*?value=\"(.*?)\"/i", $cnt, $m );
    $eventval = urlencode( $m[1] );
   
    $post = 'm%24Content%24username2=' . $DIT_BRUGERNAVN
          .'&m%24Content%24password2' . $DIT_PASSWORD
          .'&__EVENTTARGET=m%24Content%24submitbtn2&__EVENTARGUMENT='
          .'&__VIEWSTATE=' . $viewstate
          .'&__EVENTVALIDATION=' . $eventval
          .'&m%24defaultformbtn=';
   
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, 'https://www.lectio.dk/lectio/285/login.aspx' );
    curl_setopt( $ch, CURLOPT_REFERER, 'https://www.lectio.dk/lectio/285/login.aspx' );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt( $ch, CURLOPT_VERBOSE, 1 );
    curl_setopt( $ch, CURLOPT_HTTPGET, 0 );
    curl_setopt( $ch, CURLOPT_HEADER, 1 );
    curl_setopt( $ch, CURLINFO_HEADER_OUT, 1 );
    curl_setopt ($ch, CURLOPT_POST, 1 );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
        "Expect:"
        ,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        ,"Accept-Language: en"
        ,"Accept-Encoding: gzip,deflate"
        ,"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"
        ,"Keep-Alive: 115"
        ,"Connection: keep-alive"
    ) );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
    curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
    $cnt = curl_exec( $ch );
    curl_close( $ch );

    echo "Resultat: " . $cnt;
Avatar billede SimonBStoevring Nybegynder
26. oktober 2010 - 16:12 #12
Den melder fejl i mit link, fordi det slutter med et punktum.

Output kan ses her:

http://snuzzer.dk/lectio-get/coderdk.php
Avatar billede coderdk Praktikant
26. oktober 2010 - 16:20 #13
Ah det er gzip'et... Prøv lige at tilføje flg linje til begge requests:

curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );

og ændr:

    curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
        "Expect:"
        ,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        ,"Accept-Language: en"
        ,"Accept-Encoding: gzip,deflate"
        ,"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"
        ,"Keep-Alive: 115"
        ,"Connection: keep-alive"
    ) );


til


    curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
        "Expect:"
        ,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        ,"Accept-Language: en"
        ,"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"
        ,"Keep-Alive: 115"
        ,"Connection: keep-alive"
    ) );
Avatar billede SimonBStoevring Nybegynder
26. oktober 2010 - 17:04 #14
coderdk, det ser ud til at have hjulpet lidt. Den printer nu kildekoden, men cookie.txt indeholder de samme to cookies og scriptet logger stadig ikke ind. Den giver dog en værdi til m$Content$username2 i kildekoden.

Jeg må indrømme, at jeg ikke ved, hvad næste skridt er.
Avatar billede coderdk Praktikant
26. oktober 2010 - 17:11 #15
Jeg tror du er nødt til at installere Live HTTP Headers til Firefox og capture mens du logger ind - Du er nødt til at emulere en browser og sende alle de ting med som den forventer ;)
Jeg går ud fra, at der bliver sat nogle ting vha javascript som bliver postet med i loginformen.
Avatar billede SimonBStoevring Nybegynder
26. oktober 2010 - 17:36 #16
Capture? Hvad mener du? :-)

Jeg er også rimelig sikker på, at der bliver sat nogle cookies med JavaScript - heriblandt 'isloggedin3'. Det må da bare være begrænset, hvad mere den kan forvente, der skal sættes ved log ind ;-)
Avatar billede coderdk Praktikant
26. oktober 2010 - 17:43 #17
Capture i Live HTTP Headers - Aktivér den i Tools | Live HTTP Headers
Avatar billede SimonBStoevring Nybegynder
26. oktober 2010 - 18:49 #18
Det her er hvad jeg får:

http://snuzzer.dk/pub/lectio-headers.txt
Avatar billede coderdk Praktikant
27. oktober 2010 - 00:41 #19
Ok, du bør lige ændre dit password, for det er med i dit dump...

Her er en version der virker, testet med dit brugernavn/password:


<?php

    define( "AGENT", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)" );

    define( 'DIT_BRUGERNAVN', '' );  // fjernet
    define( 'DIT_PASSWORD', '' );  // fjernet
   
    $loginUrl = 'https://www.lectio.dk/lectio/285/login.aspx';
   
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $loginUrl );
    curl_setopt( $ch, CURLOPT_COOKIESESSION, 1 );
    curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
    curl_setopt( $ch, CURLOPT_COOKIEFILE, "/tmp/cookie.txt" );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, "/tmp/cookie.txt" );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
    $cnt = curl_exec( $ch );
    curl_close( $ch );

    // Find viewstate og eventvalidation
    preg_match( "/__VIEWSTATE.*?value=\"(.*?)\"/i", $cnt, $m );
    $viewstate = urlencode( $m[1] );
    preg_match( "/__EVENTVALIDATION.*?value=\"(.*?)\"/i", $cnt, $m );
    $eventval = urlencode( $m[1] );
   
    $post = '__EVENTTARGET=m%24Content%24submitbtn2'
          .'&__EVENTARGUMENT='
          .'&__VIEWSTATE=' . $viewstate
          .'&__EVENTVALIDATION=' . $eventval
          .'&m%24Content%24username2=' . DIT_BRUGERNAVN
          .'&m%24Content%24password2=' . DIT_PASSWORD;
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $loginUrl );
    curl_setopt( $ch, CURLOPT_REFERER, $loginUrl );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt ($ch, CURLOPT_POST, 1 );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
    curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
    //curl_setopt( $ch, CURLOPT_USERPWD, DIT_BRUGERNAVN.':'.DIT_PASSWORD );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
        "Expect:"
        ,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        ,"Accept-Language: en"
        ,"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"
        ,"Keep-Alive: 115"
        ,"Connection: keep-alive"
    ) );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, "/tmp/cookie.txt" );
    curl_setopt( $ch, CURLOPT_COOKIEFILE, "/tmp/cookie.txt" );
    $cnt = curl_exec( $ch );
    curl_close( $ch );

    // Sørg for at udskrive som ren text, så vi ser HTML-koden
    header("Content-Type: text/plain");
    echo $cnt;
Avatar billede SimonBStoevring Nybegynder
27. oktober 2010 - 07:02 #20
coderdk, hov! Mange tak for påmindelsen! Jeg var slet ikke klar over, at den ville stå der.

Det ser fantastisk ud. Mange tak! Jeg tror, at det virker. Jeg har godt nok lige ændret /tmp/cookie.txt til cookie.txt for at få cookien gemt i cookie.txt i samme mappe som scriptet, så jeg kan se, hvad den sætter. Den sætter nu tre cookies - udover de to tidligere, så også 'LastLoginUserName'.

Den udskriver følgende:

http://snuzzer.dk/lectio-get/coderdk.php

Det ser ud som om, at den prøver at sende mig videre til forside.aspx, som man ryger til, når man er logget ind, så det er jo super! Jeg har ingen interesse i at komme omkring forsiden, men skal derimod til en anden underside - og så loope en masse undersider igennem for at hente noget data.

Er dette blot at lave en curl-forespørgsmål mere, som initialiserer på undersiden? Og så skal den vel også bare have CURLOPT_COOKIEJAR og CURLOPT_COOKIEFILE sat og ikke så meget andet hokus pokus?
Avatar billede coderdk Praktikant
27. oktober 2010 - 11:52 #21
Jeg har lavet en funktion du blot kan kalde. getPage - Men sørg for at sætte en referrer på, ellers mister du din session:

<?php

    define( "AGENT", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)" );

    define( 'DIT_BRUGERNAVN', '' );  // fjernet
    define( 'DIT_PASSWORD', '' );  // fjernet
 
    $loginUrl = 'https://www.lectio.dk/lectio/285/login.aspx';

    function getPage( $url, $referrer = FALSE )
    { 
        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, $url );
        if ( $referrer !== FALSE )
        {
            curl_setopt( $ch, CURLOPT_REFERER, $referrer );
        }
        {
            curl_setopt( $ch, CURLOPT_COOKIESESSION, 1 );
        }
        curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
        curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
        curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
        curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
        $cnt = curl_exec( $ch );
        curl_close( $ch );
        return $cnt;
    }
   
    $cnt = getPage( $loginUrl );

    // Find viewstate og eventvalidation
    preg_match( "/__VIEWSTATE.*?value=\"(.*?)\"/i", $cnt, $m );
    $viewstate = urlencode( $m[1] );
    preg_match( "/__EVENTVALIDATION.*?value=\"(.*?)\"/i", $cnt, $m );
    $eventval = urlencode( $m[1] );
 
    $post = '__EVENTTARGET=m%24Content%24submitbtn2'
          .'&__EVENTARGUMENT='
          .'&__VIEWSTATE=' . $viewstate
          .'&__EVENTVALIDATION=' . $eventval
          .'&m%24Content%24username2=' . DIT_BRUGERNAVN
          .'&m%24Content%24password2=' . DIT_PASSWORD;
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $loginUrl );
    curl_setopt( $ch, CURLOPT_REFERER, $loginUrl );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt ($ch, CURLOPT_POST, 1 );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
    curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
    //curl_setopt( $ch, CURLOPT_USERPWD, DIT_BRUGERNAVN.':'.DIT_PASSWORD );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
        "Expect:"
        ,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        ,"Accept-Language: en"
        ,"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"
        ,"Keep-Alive: 115"
        ,"Connection: keep-alive"
    ) );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
    curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
    $cnt = curl_exec( $ch );
    curl_close( $ch );
Avatar billede SimonBStoevring Nybegynder
27. oktober 2010 - 17:33 #22
coderdk, det ser umiddelbart rigtig godt ud. Den besøger bare ikke siden, som om den er logget ind.

Hvis du ser http://snuzzer.dk/lectio-get/coderdk.php så kan du se, at der står "Log ind" og når man er logget ind erstatter den naturligvis dette med "Log ud". Ikke at dette har noget at sige for mit brug, det er bare en let måde at se, om scriptet virker.

Jeg har taget dit script og kaldt getPage() på følgende URL:
https://www.lectio.dk/lectio/285/SkemaNy.aspx?type=elev&elevid=1628118635

Denne udskriver jeg så til sidst i scriptet.
Avatar billede coderdk Praktikant
27. oktober 2010 - 17:49 #23
Avatar billede SimonBStoevring Nybegynder
27. oktober 2010 - 20:42 #24
Det giver mig det samme at sætte referrer på.

$getStudent = getPage('https://www.lectio.dk/lectio/285/SkemaNy.aspx?type=elev&elevid=1628118635', 'https://www.lectio.dk/lectio/285/forside.aspx');

Den sættes også kun to cookies i cookie.txt, hvor det script du uploadede i nat (ved en 01-tiden) sætter tre. Kan det have noget at sige?
Avatar billede coderdk Praktikant
27. oktober 2010 - 23:32 #25
Sorry, der mangler en "else" - prøv at udskifte:

        if ( $referrer !== FALSE )
        {
            curl_setopt( $ch, CURLOPT_REFERER, $referrer );
        }
        {
            curl_setopt( $ch, CURLOPT_COOKIESESSION, 1 );
        }


med

        if ( $referrer !== FALSE )
        {
            curl_setopt( $ch, CURLOPT_REFERER, $referrer );
        }
        else
        {
            curl_setopt( $ch, CURLOPT_COOKIESESSION, 1 );
        }
Avatar billede SimonBStoevring Nybegynder
28. oktober 2010 - 07:32 #26
Ups! Det burde jeg da have set.

Resultatet er nu stadig det samme :-(

http://snuzzer.dk/lectio-get/coderdk.php

Og den sætter stadigvæk kun to cookies i cookie.txt. Jeg ved dog ikke, om det er af betydning?
Avatar billede coderdk Praktikant
29. oktober 2010 - 00:33 #27
Strange. Prøv at gå tilbage til den jeg lavede, og så brug den øverste cURL-del (minus COOKIESESSION)
Avatar billede SimonBStoevring Nybegynder
29. oktober 2010 - 07:33 #28
Ja, det er mærkeligt. Nu skal jeg lige være helt sikker på, hvad du mener. Skal jeg bruge den første del i dit første eksempel til getPage i stedet for den nuværende, så koden bliver som set nedenunder?

Det giver nøjagtig samme resultat.

<?php

    define( "AGENT", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)" );

    define( 'DIT_BRUGERNAVN', '' );  // fjernet
    define( 'DIT_PASSWORD', '' );  // fjernet
 
    $loginUrl = 'https://www.lectio.dk/lectio/285/login.aspx';

    function getPage( $url, $referrer = FALSE )
    {
        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_REFERER, $referrer );
        curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
        curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
        curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
        curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
        $cnt = curl_exec( $ch );
        curl_close( $ch );
        return $cnt;
    }

    $getStudent = getPage('https://www.lectio.dk/lectio/285/SkemaNy.aspx?type=elev&elevid=1628118635', 'https://www.lectio.dk/lectio/285/forside.aspx');

    // Find viewstate og eventvalidation
    preg_match( "/__VIEWSTATE.*?value=\"(.*?)\"/i", $cnt, $m );
    $viewstate = urlencode( $m[1] );
    preg_match( "/__EVENTVALIDATION.*?value=\"(.*?)\"/i", $cnt, $m );
    $eventval = urlencode( $m[1] );
 
    $post = '__EVENTTARGET=m%24Content%24submitbtn2'
          .'&__EVENTARGUMENT='
          .'&__VIEWSTATE=' . $viewstate
          .'&__EVENTVALIDATION=' . $eventval
          .'&m%24Content%24username2=' . DIT_BRUGERNAVN
          .'&m%24Content%24password2=' . DIT_PASSWORD;
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $loginUrl );
    curl_setopt( $ch, CURLOPT_REFERER, $loginUrl );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt ($ch, CURLOPT_POST, 1 );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
    curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
    //curl_setopt( $ch, CURLOPT_USERPWD, DIT_BRUGERNAVN.':'.DIT_PASSWORD );
    curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
        "Expect:"
        ,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
        ,"Accept-Language: en"
        ,"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"
        ,"Keep-Alive: 115"
        ,"Connection: keep-alive"
    ) );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
    curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
    $cnt = curl_exec( $ch );
    curl_close( $ch );

echo $getStudent;
?>
Avatar billede coderdk Praktikant
29. oktober 2010 - 13:13 #29
Jeg mente nu den uden getPage (som virkede)... Nu kan jeg ikke teste længere, da jeg går ud fra du har ændret password?

Prøv:

<?php

define( "AGENT", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)" );

define( 'DIT_BRUGERNAVN', '' );  // fjernet
define( 'DIT_PASSWORD', '' );  // fjernet

$loginUrl = 'https://www.lectio.dk/lectio/285/login.aspx';

// Første request
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $loginUrl );
curl_setopt( $ch, CURLOPT_COOKIESESSION, 1 );
curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
$cnt = curl_exec( $ch );
curl_close( $ch );

// Find viewstate og eventvalidation
preg_match( "/__VIEWSTATE.*?value=\"(.*?)\"/i", $cnt, $m );
$viewstate = urlencode( $m[1] );
preg_match( "/__EVENTVALIDATION.*?value=\"(.*?)\"/i", $cnt, $m );
$eventval = urlencode( $m[1] );

// Byg POST
$post = '__EVENTTARGET=m%24Content%24submitbtn2'
      .'&__EVENTARGUMENT='
      .'&__VIEWSTATE=' . $viewstate
      .'&__EVENTVALIDATION=' . $eventval
      .'&m%24Content%24username2=' . DIT_BRUGERNAVN
      .'&m%24Content%24password2=' . DIT_PASSWORD;
     
// LOGIN HER
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $loginUrl );
curl_setopt( $ch, CURLOPT_REFERER, $loginUrl );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt ($ch, CURLOPT_POST, 1 );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
    "Expect:"
    ,"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
    ,"Accept-Language: en"
    ,"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7"
    ,"Keep-Alive: 115"
    ,"Connection: keep-alive"
) );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
$cnt = curl_exec( $ch );
curl_close( $ch );

header("Content-Type: text/plain");
echo "FØRSTE REQUEST GAV:\n\n$cnt\n\n----------------------\n\n";

// Hent skema
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, "https://www.lectio.dk/lectio/285/SkemaNy.aspx?type=elev&elevid=1628118635" );
curl_setopt( $ch, CURLOPT_REFERER, "https://www.lectio.dk/lectio/285/forside.aspx" );
curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt( $ch, CURLOPT_USERAGENT, AGENT );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );
curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $ch, CURLOPT_ENCODING , "gzip" );
$cnt = curl_exec( $ch );
curl_close( $ch );

echo "ANDET REQUEST: $cnt";
Avatar billede SimonBStoevring Nybegynder
29. oktober 2010 - 16:35 #30
coderdk, mange tak skal du have! Nu lader det til at virke - den udskriver i hvert fald den rigtige kildekode!

Du skal have stor tak for din hjælp og din tålmodighed.

Nu skal jeg blot pusle lidt med at få cURL til at hente et billede. Tusinde tak! :-)
Avatar billede coderdk Praktikant
29. oktober 2010 - 16:36 #31
Så lidt :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester