Avatar billede Panum Nybegynder
05. oktober 2010 - 12:17 Der er 2 kommentarer

Screenscraping med login.

Hejsa,

Jeg skal bruge nogle "beskyttede" data, som jeg har tænkt med at hente via cURL. Der skal logges ind også hentes diverse data. Men mit problem er at med at få logge-ind'et til at virke.

Jeg fandt denne klasse til at gøre det jeg ønsker: http://dev.juokaz.com/php/scraping-login-requiring-websites-with-curl

Men kan ikke få det til at virke.

Siden jeg ønsker at logge ind på er: http://memberservice.sport-solutions.dk/login.aspx

[code]
<?php

/**
* Code example
*
* More info available in http://dev.juokaz.com/
*
* @author Juozas Kaziukenas <juozas@juokaz.com>
*/

class Secure_Crawler {

    private $loginUrl = 'http://memberservice.sport-solutions.dk/Login.aspx';

    private $options = array( );

    private $connected = false;

    function __construct () {

        $cookies = 'cookies_path.txt';

        $this->options = array(
            CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)',
            CURLOPT_HEADER => false, // Add response headers to return, for testing
            CURLOPT_RETURNTRANSFER => true, // Add html to return
            CURLOPT_COOKIEJAR  => $cookies,
            CURLOPT_COOKIEFILE => $cookies,
        );

    // Reset cookies
        @ unlink($cookies);
    }

    function login ($username, $password) {

        $ch = curl_init();

    $options = $this->options;
        $options[CURLOPT_URL] = $this->loginUrl;
        $options[CURLOPT_POST] = true;
    // Login form fields
        $options[CURLOPT_POSTFIELDS] = $this->getPostFields(
        array(
            'txbUsername' =>  $username,
            'txbPassword' => $password,
            'submit' => 'Button1'
        ));
        $options[CURLOPT_FOLLOWLOCATION] = false;
        curl_setopt_array($ch, $options);
        curl_exec($ch);

        //Close curl session
        curl_close($ch);

        $this->connected = true;
    }

    function get ($url) {

        if (!$this->connected)
            throw new Exception("Not connected");

        $ch = curl_init();

        //Get
        $options = $this->options;
        $options[CURLOPT_URL] = $url;
        curl_setopt_array($ch, $options);
        $results = curl_exec($ch);

        //Close curl session
        curl_close($ch);

    return $results;
    }

    private function getPostFields ($data) {

        $return = array();

        foreach ($data as $key => $field) {
            $return[] = $key . '=' . urldecode($field);
        }

        return implode('&', $return);
    }
}

?>
[/code]

Når jeg kører scriptet, bliver jeg redirected til /login.aspx (ligesom at jeg ikke er logget ind)
Avatar billede Panum Nybegynder
05. oktober 2010 - 12:22 #1
Her er koden i lidt mindre buggy-form:

<?php

/**
* Code example
*
* More info available in http://dev.juokaz.com/
*
* @author Juozas Kaziukenas <juozas@juokaz.com>
*/

class Secure_Crawler {

    private $loginUrl = 'http://memberservice.sport-solutions.dk/Login.aspx';

    private $options = array( );

    private $connected = false;

    function __construct () {

        $cookies = 'cookies_path.txt';

        $this->options = array(
            CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)',
            CURLOPT_HEADER => false, // Add response headers to return, for testing
            CURLOPT_RETURNTRANSFER => true, // Add html to return
            CURLOPT_COOKIEJAR  => $cookies,
            CURLOPT_COOKIEFILE => $cookies,
        );

    // Reset cookies
        @ unlink($cookies);
    }

    function login ($username, $password) {

        $ch = curl_init();

    $options = $this->options;
        $options[CURLOPT_URL] = $this->loginUrl;
        $options[CURLOPT_POST] = true;
    // Login form fields
        $options[CURLOPT_POSTFIELDS] = $this->getPostFields(
        array(
            'txbUsername' =>  $username,
            'txbPassword' => $password,
            'submit' => 'Button1'
        ));
        $options[CURLOPT_FOLLOWLOCATION] = false;
        curl_setopt_array($ch, $options);
        curl_exec($ch);

        //Close curl session
        curl_close($ch);

        $this->connected = true;
    }

    function get ($url) {

        if (!$this->connected)
            throw new Exception("Not connected");

        $ch = curl_init();

        //Get
        $options = $this->options;
        $options[CURLOPT_URL] = $url;
        curl_setopt_array($ch, $options);
        $results = curl_exec($ch);

        //Close curl session
        curl_close($ch);

    return $results;
    }

    private function getPostFields ($data) {

        $return = array();

        foreach ($data as $key => $field) {
            $return[] = $key . '=' . urldecode($field);
        }

        return implode('&', $return);
    }
}

?>
Avatar billede coderdk Praktikant
05. oktober 2010 - 16:40 #2
aspx-sider er ofte gladest for at__VIEWSTATE og __EVENTVALIDATION er med - start med at kalde siden, og gem cookies i et cookiejar (se cURL), og gem så de to variable - Derefter logger du ind hvor du også sender de to variable med, og bruger samme cookiejar.
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