Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

SSL secured site scrapen mbv. cURL (PHP)

Pagina: 1
Acties:

Onderwerpen


  • Bitbored
  • Registratie: Oktober 2008
  • Laatst online: 08-07 15:05
<voorgeschiedenis>
Agenda's zijn geweldig, echter, ze in orde houden is soms lastiger dan het lijkt.
Zeker als je een lessenrooster hebt waar totaal geen logische volgorde in zit.
Vaarwel wekelijks herhalen optie :(

Van een hogeschool met een volledige afdeling genaamd informatica en techniek had ik verwacht dat de agenda open was voor synchronisatie met allerhande platformen, op zijn minst Microsoft outlook of een of andere Android app.

Maar niets is minder waar: de agenda van mijn hogeschool bestaat gewoon uit html pagina's, die enkel te bereiken zijn nadat je je wachtwoord ingevoerd hebt, en daarbovenop nog eens ssl secured zijn ook.
Over privacy gesproken.
Wat ze echter niet erg vinden is het feit dat je de uurroosters van alle andere klassen over de gehele campus ook gewoon kan bekijken.
</voorgeschiedenis>

Mijn doel is dus: De ssl secured html pagina's waarop mijn uurrooster te vinden is scrapen met behulp van cURL, waarna ik er een handige iCAL kalender van kan maken.

Echter, zelfs na dagenlang proberen, testen, en coderen, heb ik nog steeds niet veel vorderingen gemaakt met de eerste stap: het inloggen met cURL op de website van m'n school.

Dit is de code van de klasse die ik gebruik om me in te loggen op en te scrapen van de site:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
class Secure_Crawler
    {
    private $loginUrl = 'https://idp.katho.be/idp/view/login.htm';
    private $options = array( );
    private $connected = false;

    function __construct ()
    {
        $cookies = '/cookie.txt';
        $this->options = array(
            CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],
            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(
            'username' =>  $username,
            'password' => $password));
        $options[CURLOPT_FOLLOWLOCATION] = true;
        $options[CURLOPT_SSL_VERIFYPEER] = false;
        curl_setopt_array($ch, $options);
        curl_exec($ch);
        curl_close($ch);

        $this->connected = true;
    }
    function store ($url, $file)
    {
        $ch = curl_init();
    }
    function get ($url)
    {
        if (!$this->connected)
            throw new Exception("login failed");

        $ch = curl_init();

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

        curl_close($ch);

    return $results;
    }

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

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


Hoewel er in de cookie.txt wel degelijk een sesievariabele komt te staan, ben ik blijkbaar toch niet ingelogd, aangezien ik bij het scrapen van de site enkel

Found
The document has moved here.

te zien krijg (hier is hierbij een link naar de inlogpagina).

Is er iemand die me kan helpen om dit project werkend te krijgen?
Heeft er iemand ervaring met het scrapen van ssl secured sites?
Ziet er iemand grove fouten in mijn code?

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Kan je ook de code geven waarin je je class gebruikt? Construct je de class meerdere keren en heb je dan die unlink() ook in de echte code?

{signature}


  • bas-r
  • Registratie: April 2005
  • Laatst online: 15:26
Printje van de pagina maken is geen optie?

Ik weet het, je bent een tweaker, en je weet dat het 'kan', maar is dit zo zinvol?

Verwijderd

bas-r schreef op zondag 06 maart 2011 @ 21:37:
Printje van de pagina maken is geen optie?

Ik weet het, je bent een tweaker, en je weet dat het 'kan', maar is dit zo zinvol?
Ik heb iets soortgelijks gemaakt voor mijn jaar en opleiding (dus eigenlijk voor mezelf). Daarmee publiceerde ik een .ics file die gewoon in m'n iPhone/iCal geladen kon worden :P. Dus als je het goed doet, is het wel zinvol :).

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Volgens mij sla je een pagina over. Als ik de url 'https://idp.katho.be/idp/view/login.htm' open dan krijg ik een foutmelding. Ga ik via 'https://www.katho.be/Shibboleth.sso/WAYF/katho?target=https://www.katho.be/loginhandler.aspx?actie=loginok' (dit zit achter de login knop op de homepage) dan werkt het wel goed. 'Shibboleth.sso' is een single sign on product en daar maakt die login.htm pagina vermoedelijk ook gebruik van. Ik denk dat je eerst even die andere url moet openen voordat je mag inloggen op deze pagina.

Skill is when luck becomes a habit.


  • BCC
  • Registratie: Juli 2000
  • Nu online

BCC

PHP? Dan is http://sourceforge.net/projects/snoopy/ je vriendje voor alle scraping zaken.

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


  • Bitbored
  • Registratie: Oktober 2008
  • Laatst online: 08-07 15:05
bas-r schreef op zondag 06 maart 2011 @ 21:37:
Printje van de pagina maken is geen optie?

Ik weet het, je bent een tweaker, en je weet dat het 'kan', maar is dit zo zinvol?
De reden dat ik het in php doe is opdat ik er een php applicatie van kan maken, die iedereen op mijn school kan gebruiken.
En het lijkt me ook een mooi eindproject php...
eek schreef op zondag 06 maart 2011 @ 21:42:
Ik denk dat je eerst even die andere url moet openen voordat je mag inloggen op deze pagina.
Eventjes getest, maar blijkt weinig succes te hebben...
Bedankt voor de tip, lijkt me interessant om te proberen...

Hieronder nog even mijn index pagina (waarin de klasse wordt gebruikt);

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Uurrooster Exporter</title>
    </head>
    <body>
    <?php

    //echo $_SERVER['HTTP_USER_AGENT'];
    include ("crawler.php");
    include ("password.php");
    $crawler = new Secure_Crawler();
    $content = $crawler->get('https://www.katho.be/Shibboleth.sso/WAYF/katho?target=https://www.katho.be/loginhandler.aspx?actie=loginok');
    $crawler->login('1003844331', $password);
    
    $content = $crawler->get('https://apps.katho.be/vhti/uurroosters/09/c/c00002.htm');
    
    //$content = $crawler->get('https://cygnus.cc.kuleuven.be/webapps/portal/frameset.jsp');
    echo $content;
    ?>
    </body>
</html>


Nee, de inhoud van password.php wordt hier niet geplaatst.

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 28-11 22:59

alienfruit

the alien you never expected

Ik zou het eens proberen met het volgende erbij:

PHP:
1
2
3
4
5
6
// meer debug informatie weergeven
curl_setopt($ch, CURLOPT_VERBOSE, true);
// forceren van het gebruik van HTTP/1.0
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content- 
Type:application/x-www-form-urlencoded"));


Misschien moet je een referer opgeven? Anders even goed kijken welke headers er worden verzonden met Charles?

[ Voor 13% gewijzigd door alienfruit op 07-03-2011 09:14 ]


  • Cartman!
  • Registratie: April 2000
  • Niet online
PHP:
1
$options[CURLOPT_SSL_VERIFYPEER] = false;


Je begrijpt dat je nu dus de controle die je bij SSL juist wilt teniet doet?

  • Peedy
  • Registratie: Februari 2002
  • Laatst online: 06-11-2024
Ik heb voor de roosters van de Rijksuniversiteit Groningen ook zo'n tool gemaakt, hier te vinden; www.collegekalender.nl

Dit is een stuk code dat ik daarvoor gebruik met gebruik van de PEAR HTTP Client class (ook SSL met inlog);

PHP:
1
2
3
4
5
6
7
8
9
10
11
    $variablesLogin = array (
        'StudentNr0' => $data['student1'],
        'Password' => base64_decode($data['pass1']),
        'login' => ' Login '
    );

    $http = new HTTP_Client();
    $http->post("https://www.rug.nl/rest-van-de-url",$variablesLogin); // First login
    $http->post("https://www.rug.nl/success"); // Go to secured page
    $response = $http->currentResponse();
    echo $response['body'];

[ Voor 7% gewijzigd door Peedy op 07-03-2011 09:37 ]


  • Bitbored
  • Registratie: Oktober 2008
  • Laatst online: 08-07 15:05
Ugh, geweldig, eindelijk tijd, 2 nieuwe systemen om te testen, en dan ligt de server van m'n school plat X|

Even voor de duidelijkheid: zowel snoopy als PEAR maken gebruik van cURL niet?
Dus ze hebben ook de extra instelling op de server nodig zodat cURL kan worden uitgevoerd...

Weet iemand wat de standaard instelling is omtrent cURL op een commerciële apache webhost?

Hoe dan ook, bedankt voor de reacties, ik hoop dat ik snel terug kan testen...

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Cartman! schreef op maandag 07 maart 2011 @ 09:32:
PHP:
1
$options[CURLOPT_SSL_VERIFYPEER] = false;


Je begrijpt dat je nu dus de controle die je bij SSL juist wilt teniet doet?
Het enige wat je hier zegt is dat als curl het certificaat niet kent, (een waarschuwing die je soms ook in je browser krijgt), hij toch mag doorgaan. Aangezien je zelf kiest naar welke site je gaat, zie ik hier niets mis mee.

  • Bitbored
  • Registratie: Oktober 2008
  • Laatst online: 08-07 15:05
Tharulerz schreef op donderdag 10 maart 2011 @ 01:32:
[...]


Het enige wat je hier zegt is dat als curl het certificaat niet kent, (een waarschuwing die je soms ook in je browser krijgt), hij toch mag doorgaan. Aangezien je zelf kiest naar welke site je gaat, zie ik hier niets mis mee.
Inderdaad, en aangezien de browser op m'n mobile telefoon (opera mobile) begint te flippen als ik me wil inloggen, heb ik deze optie maar aangezet.

Maar het maakt in principe niet veel uit denk ik.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Toevallig laatste tijd ook met cURL bezig... ik raad je aan om Fiddler te downloaden en goed te kijken welke headers er meegestuurd worden als je gewoon normaal via je browser inlogt... en dan diezelfde headers meesturen met je cURL requests deed voor mij het truukje (.ASPX page waarbij ik de viewstate moest meesturen om verder dan de loginpagina te komen).
Pagina: 1