Wat info van tvshowtime extracten?

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Xthemes.us
  • Registratie: Juli 2004
  • Laatst online: 25-06 18:56
Voor mijn vriendin heb ik een webpagina met daarop alle dingen zie ze leuk vind en daar wou ik nou ook de televisieseries die ze tracked via TVShowTime opzetten.
Klein probleempje - voor persoonlijke dingen verlenen ze geen API-access waarvoor een key nodig is die ze zelf verstrekken, dat gaat hem dus helaas niet worden. Nou lukt het me wel om via CURL in te loggen en op de kalender pagina uit te komen maar ook hier een klein probleempje.

Blijkbaar doen ze het deel wat ik wil hebben geheel in javascript, ofwel ik heb wat meer nodig dan CURL en DomDocument. Nou lukt het me wel om het stukje javascript waar alle series en informatie daarover te extracten maar ik kan niet uitvogelen waar ze de informatie vinden voor de "My shows" (de series die je zelf kijkt) vandaan word gehaald.

Wat ik heb:
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
77
    $postData = sprintf("username=%s&password=%s&redirect_path=%s",
        'HARDCODED_USERNAME',
        'HARDCODED_PASSWORD',
        'http://www.tvshowtime.com/en/user/6937016/calendar');
    $curl = curl_init('www.tvshowtime.com/signin');            
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); //Resolve redirects
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postData );
    $result = curl_exec($curl);
    
    /**
    * @param String $str HTML of tvshowtime's calendar.
    */
    function getCalendarObject($str)
    {
        $strNew = "";
        
        $separator = "\r\n";
        $identifier = 'calendar : \'';
        $line = strtok($str, $separator);
        
        while ($line !== false) 
        {
            if(strpos($line, $identifier)!==false) //Only care for the line with the calendar.
            {
                # do something with $line
                $strNew = str_replace('\\', '', $line);
                
                //Only need the array with the information so cut off the rest.
                $iIdentifier = strlen($identifier)+4;
                $strNew = substr($strNew, $iIdentifier); //Cut off $identifier
                $strNew = substr($strNew, 0, strrpos($strNew, ']')+1); //Don't need the stuff after 
            }
            $line = strtok( $separator );
        }
        
        return $strNew;
    }
    
    /**
     * Makes a definition list out of the properties of the given stdClass
     */
    function prettyPrint(stdClass $jBit)
    {
        $dl = "<dl>";
        
        $arrValues = get_object_vars($jBit);
        foreach($arrValues as $key => $value)
        {
            $dl .= '<dt style="font-weight: bold;">'.$key.'</dt>';
            if($value instanceof stdClass)
                $dl .= prettyPrint($value);
            //else if(is_string($value) && strpos($value, '.jpg')>0)                
            //    $dl .= '<dd><img src="'.$value.'" /></dd>';
            else
                $dl .= '<dd>'.print_r($value ,true).'</dd>';
        }
        
        return $dl.'</dl>';
    }
    
    //Find the javascript used to build up the calendar in the DOM.
    $document = new DOMDocument();
    @$document->loadHTML($result);
    $scriptNodes = $document->getElementsByTagName('script');
    $calendarJsNode = $scriptNodes->item(4); //4th script node is the one with the Calendar object
    $calendarJsNodeString = strip_tags($document->saveHTML($calendarJsNode)); //Strips off surrounding <script> tags.
    
    $strJson = getCalendarObject($calendarJsNodeString);
    $json = json_decode(html_entity_decode($strJson));
    
    foreach($json as /** @VAR stdClass */ $jBit)
    {
        echo prettyPrint($jBit);
        echo '<hr/>';
    }


en dat werkt (met een echte username/password), maar dan krijg ik de output van alle series maar ik kan niet weervinden waar deze lijst naar een "My Shows" view wordt gemaakt. Dit vind waarschijnlijk ergens plaats in hun calendar.js maar ik kan niet achterhalen op basis waarvan. Ik heb ook gekeken of de cookies wellicht een lijst met IDs ofzoiets bevat maar dat lijkt niet het geval te zijn.

MSI GX640 - 8GB RAM, Radeon 5970, 80GB SSD


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Xthemes.us schreef op woensdag 23 november 2016 @ 22:38:
Ik heb ook gekeken of de cookies wellicht een lijst met IDs ofzoiets bevat maar dat lijkt niet het geval te zijn.
Nee, waarom zou 't? Je kunt zoiets toch prima server-side in een tabelletje bijhouden? Veel meer dan een sessie-id heb je niet nodig in een (sessie)cookie; server-side associeer je dat met een gebruiker en diens voorkeuren en shows en whatever. Dus in een cookie zou ik 't ook niet zoeken; dat zou wel de laatste plek zijn waar ik zou kijken. En de kans is groot dat er dus überhaupt weinig te kijken valt; je kunt niet 'achter de schermen' kijken bij ze ;)

Maar los daarvan: wat vindt TVShowTime er eigenlijk überhaupt van dat je zo hun beperkingen probeert te omzeilen? Je geeft zelf aan:
Xthemes.us schreef op woensdag 23 november 2016 @ 22:38:
Klein probleempje - voor persoonlijke dingen verlenen ze geen API-access waarvoor een key nodig is die ze zelf verstrekken, dat gaat hem dus helaas niet worden.
Ik ken heel die site niet, noch hun gebruikte technieken, noch hun voorwaarden, noch de rest, maar als ze een API bieden maar geen keys uitgeven omdat je niet daarvoor in aanmerking komt dan ben je dus op deze manier bezig met (een vorm van een) beveiligingen omzeilen en andere vormen van (internet)misbruik.

[ Voor 18% gewijzigd door RobIII op 24-11-2016 00:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 08-10 23:48

Ventieldopje

I'm not your pal, mate!

Het scrapen van data voor persoonlijk gebruikt lijkt mij toch niet zo erg? Je verkrijgt niet eens onrechtmatig toegang tot de data (hacken)...

Nou ken ik de website ook niet maar als javascript écht nodig is zou je kunnen kijken om Selenium te gaan gebruiken.

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


  • Xthemes.us
  • Registratie: Juli 2004
  • Laatst online: 25-06 18:56
Ze hebben niet gereageerd op mijn verzoek tot contact, ik heb ze uitgelegd wat de bedoeling is en ze de tip gegeven een widget aan te bieden voor b.v. tumblr. En ze verzocht om een API-key mochten ze dit niet willen aanbieden maar daar is niet op gereageerd.

Afijn het is zeer small scale gebruik, letterlijk 2 verzoeken per dag en de bedoeling is alle links etc keurig naar hun eigen site te laten gaan.
Nee, waarom zou 't? Je kunt zoiets toch prima server-side in een tabelletje bijhouden? Veel meer dan een sessie-id heb je niet nodig in een (sessie)cookie; server-side associeer je dat met een gebruiker en diens voorkeuren en shows en whatever. Dus daar zou ik 't ook niet zoeken.
Wellicht niet geheel goed uitgelegd. De informatie is allemaal geheel lokaal nadat de pagina is geladen en wordt puur in Javascript uitgevoerd. De developer tools geven geen enkele netwerk activiteit weer, de 'my shows' moeten dus ergens in een cookie of javascript staan.

Ik ben echter niet bepaald thuis in javascript debugging/tracing en veel verder dan het stukje waar een calendar view via één of andere templating engine wordt opgebouwd kom ik niet. De evenlistener voor de onchange van de dropdown heb ik nog niet teruggevonden.

[edit]
Ik zat inderdaad te kijken naar oplossingen als zombiejs en zo te zien bied Selenium ook zoiets maar dat is wel een beetje overkill. Wie weet kom ik daar uiteindelijk wel op uit, ik ben er echter vrij zeker van dat informatie ergens te vinden moeten zijn in de data die al geladen wordt en dan ook te gebruiken moet zijn met een stuk minder overhead.

[ Voor 13% gewijzigd door Xthemes.us op 24-11-2016 01:44 ]

MSI GX640 - 8GB RAM, Radeon 5970, 80GB SSD


Verwijderd

Wellicht niet geheel goed uitgelegd. De informatie is allemaal geheel lokaal nadat de pagina is geladen en wordt puur in Javascript uitgevoerd. De developer tools geven geen enkele netwerk activiteit weer, de 'my shows' moeten dus ergens in een cookie of javascript staan.
Als je "Private Browsing" opent, daarna iets zoals Tamper Data opent en daarna naar die website ga, zie jij dan wel HTTP requests naar die server?

  • Xthemes.us
  • Registratie: Juli 2004
  • Laatst online: 25-06 18:56
Verwijderd schreef op donderdag 24 november 2016 @ 06:51:
[...]


Als je "Private Browsing" opent, daarna iets zoals Tamper Data opent en daarna naar die website ga, zie jij dan wel HTTP requests naar die server?
Dat is bijzonder, via tamperdata komen er meer netwerk connecties naar voren, op de volgende URL wordt alle data keurig aangereikt in JSON.
http://www.tvshowtime.com...&nb_days=21&mode=my-shows

Als ik Chrome gebruik en Chrome's developer tools dan kan ik die URL ook zien onder netwerk connecties, op de één of andere manier vergeet Firefox de verbinding te vermelden. Na installatie van tamperdata wordt er ook iets vreemds gedaan met de font rendering in Firefox (op alle sites en sommige delen van de UI) en ik heb al langer het probleem dat youtube mijn Firefox crashed.. denk dat het hoog tijd is om Firefox geheel te resetten. Bedankt voor de tip :) moet vanaf hier zeer makkelijk zijn.

MSI GX640 - 8GB RAM, Radeon 5970, 80GB SSD


Verwijderd

Xthemes.us schreef op donderdag 24 november 2016 @ 12:41:
[...]

Dat is bijzonder, via tamperdata komen er meer netwerk connecties naar voren, op de volgende URL wordt alle data keurig aangereikt in JSON.
http://www.tvshowtime.com...&nb_days=21&mode=my-shows

Als ik Chrome gebruik en Chrome's developer tools dan kan ik die URL ook zien onder netwerk connecties, op de één of andere manier vergeet Firefox de verbinding te vermelden. Na installatie van tamperdata wordt er ook iets vreemds gedaan met de font rendering in Firefox (op alle sites en sommige delen van de UI) en ik heb al langer het probleem dat youtube mijn Firefox crashed.. denk dat het hoog tijd is om Firefox geheel te resetten. Bedankt voor de tip :) moet vanaf hier zeer makkelijk zijn.
Ik heb nog nooit een probleem gehad met font rendering, dus dat is waarschijnlijk inderdaad je Firefox profiel. Tamper Data toont overigens alle requests die Firefox maakt, ook bijvoorbeeld van Google auto-complete en extenties. Nu je die URL heb, is het waarschijnlijk inderdaad heel makkelijk.

Acties:
  • 0 Henk 'm!

  • Xthemes.us
  • Registratie: Juli 2004
  • Laatst online: 25-06 18:56
Ja hoor, werkt prima nu. tvshowtime vind een redirect direct naar de JSON blijkbaar niet leuk dus dat moet in een apart verzoek maar het werkt uitstekend. Voor het geval iemand anders hetzelfde van plan is:
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
        $date = date('Y-m-d');
    $url = 'http://www.tvshowtime.com/en/user/6937016/calendar';
    $dataUrl = sprintf(
        'http://www.tvshowtime.com/calendar/data?start_date=%s&nb_days=21&mode=my-shows',
        $date);
    $postData = sprintf(
        "username=%s&password=%s&redirect_path=%s",
        'USERNAME@live.co.uk', //username
        'PASSWORD', //password
        $url); //redirect_path
    
    //Step 1 - Connect and sign into the calendar.
    $curl = curl_init('www.tvshowtime.com/signin');            
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_COOKIEJAR, '/tmp/tvshowtime.cookie');
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); //Resolve redirects
    curl_setopt($curl, CURLOPT_POSTFIELDS, $postData );
    $result = curl_exec($curl);
    $json = json_decode(html_entity_decode($result));
    
    //Step 2 - Fetch the personalised information.
    curl_setopt($curl, CURLOPT_URL, $dataUrl);
    $jsonResult = curl_exec($curl);
    header('Content-type: application/json');
    die($jsonResult);

MSI GX640 - 8GB RAM, Radeon 5970, 80GB SSD

Pagina: 1