Howto: Reserveer een tafel in Be Our Guest, nerdstyle

  12 March 2018 21:16:23        GetString()    , ,  No Comments.

Nu ik de reserveringen binnen heb kan ik dit wel met jullie delen. Door wat wind en regen ging onze vakantie naar Florida in september helaas niet door. Maar we gaan lekker in januari, onderdeel van deze vakantie is een week lang vertoeven op het resort van Walt Disney World. In het hoofd park Magic Kingdom ligt het be our guest restaurant wat nogal geliefd is. Hierdoor zijn de reserveringen vaak al ongeveer 90 dagen van te voren vol. Omdat de algemene tip voor het reserveren in dit restaurant ongeveer neerkomt op controleer gewoon meerdere keren of er plek is. Vaak worden er reserveringen vrij gegeven (mensen die de hele week elke dag reserveren omdat ze nog niet weten welke dag ze gaan.)


Omdat je de status van vrije tafels via de website van Walt Disney World kan bekijken is het niet heel erg moeilijk om dit te automatiseren. Ik ben begonnen met charles proxy het verkeer te analyzeren wat er heen en weer gestuurd werd bij het opvragen van de status.
In feite zijn er 3 belangrijke calls:
– Login call
– Datum check
– Tijd check
Natuurlijk hebben ze bij Disney wel een beetje over de beveiliging gedacht, ze hebben namelijk iets ingebouwd tegen CSRF. Daarom doen we eerst een request om deze key te achterhalen. Vervolgens doen we een inlog verzoek en slaan we deze gegevens op in de coockiejar. De inlog doet een redirect naar de Be Our Guest pagina, hier kunnen we een datum check doen (op alle data die in de array staan ingevuld). Snapt u het nog? Mooi! want de laatste check die we doen is even alle tijden langs fietsen. De tijd 80000714 staat voor diner.

Mocht hier een resultaat uit komen dan gaan we een bericht sturen. Maak hier een telegram bot aan volgens deze instructies. Vul vervolgens je API key en Telegram kanaal in het script. Dan is de laatste stap dat dit script automatisch getriggerd moet worden. Ik had hier een cronjob voor ingesteld die elke 15 minuten dit script af vuurde om te kijken of het werkt. Hoe je dit doet mag je lekker zelf uitzoeken want het moet niet te makkelijk worden natuurlijk

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
<?php
//Vul hieronder de data in waarin gezocht moet worden (amerikaanse datum jaar-maand-dag)
$searchdates = array (
"2018-01-21",
"2018-06-10");
$partySize = 2; //hoeveel mensen?

$username = urlencode('### USERNAME ###'); //Disney world username
$username = urlencode('### PASSWORD ###'); //disney world password

$telegrambotapi = "### API KEY ###"; // telegram api key
$chatkanaal = "### TELEGRAM CHAT KANAAL ###"; // telegram chat id


///------- Je mag hieronder prusten maar dan kun je het stuk maken. Succes!

$url = "https://disneyworld.disney.go.com/login/";
$cookie= "jar.txt"; //cookie jar
$hoei = ""; // hoei er is plek text
unlink($cookie); // pleur de cookie jar weg
// Get csrf token!
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
//
if (curl_errno($ch)) die(curl_error($ch));
$dom = new DomDocument();
$dom->loadHTML($response);
$tokens = $dom->getElementsByTagName("input");
for ($i = 0; $i < $tokens->length; $i++)
{
    $meta = $tokens->item($i);
    if($meta->getAttribute('name') == 'pep_csrf'){
                $token = $meta->getAttribute('value');
        }
}
echo $token ."\r\n";
$postinfo = 'pep_csrf='.trim($token).'&returnUrl=%2Fdining%2Fmagic-kingdom%2Fbe-our-guest-restaurant%2F&username='.$username.'&password='.$password.'&rememberMe=0&submit=';
//echo $postinfo."\r\n";//debug info
// Login to disney! en redirect to be our guest
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$html = curl_exec($ch);
if (curl_errno($ch)) die(curl_error($ch));
//file_put_contents("html.txt",$html);
    //print($html);
foreach($searchdates as $zoekdan){
        // Mooi laatste verzoek! kijk of er plek is in het restaurant:
        $url = "https://disneyworld.disney.go.com/finder/dining-schedules/type/dining/id/16660079%3BentityType%3Drestaurant/";
        $postinfo = 'searchDate='.$zoekdan.'&pep_csrf='.trim($token);
        //echo $postinfo."\r\n";//debug info
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        $htmlfinder = curl_exec($ch);
        if (curl_errno($ch)) die(curl_error($ch));
        curl_setopt($ch, CURLOPT_REFERER, 'https://disneyworld.disney.go.com/dining/magic-kingdom/be-our-guest-restaurant/');
        curl_setopt($ch, CURLOPT_POST, false );
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
        curl_setopt($ch, CURLOPT_URL, "https://disneyworld.disney.go.com/authentication/get-client-token/");
        $accestoken = curl_exec($ch);
        if (curl_errno($ch)) die(curl_error($ch));

        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');

        $url = "https://disneyworld.disney.go.com/finder/dining-availability/"; //80000712
        $postinfo = 'pep_csrf='.trim($token).'&searchDate='.$zoekdan.'&skipPricing=true&searchTime=80000714&partySize='.$partySize.'&id=16660079%3BentityType%3Drestaurant&type=dining';
        //echo $postinfo."\r\n";//debug info
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        $html = curl_exec($ch);
        if (curl_errno($ch)) die(curl_error($ch));
        //echo trim(strip_tags($html)) ."\r\n";
        if (strpos(trim(strip_tags($html)), 'No tables available around') !== false) {
                echo 'false';
        } else {
                //echo $html;
                $re = '/<span class="buttonText">(.*)< \/span>/m';
                preg_match_all($re, $html, $matches, PREG_SET_ORDER, 0);
                foreach ($matches as $match) {
                        $hoei .= $zoekdan. ": " .$match[1] ."\n";
                }
                // Print the entire match result
                //var_dump($matches);
                //$hoei = "";

        }
}
echo $hoei;
curl_close($ch);
if ($hoei != "") {
                $hoei = "WOOHOOO ER IS PLEK OP:\n\n" . $hoei . "\n\nKlikkerdeklik hierrrrrrrr:\nhttps://disneyworld.disney.go.com/dining/magic-kingdom/be-our-guest-restaurant/";
                $ch1 = curl_init();
                curl_setopt($ch1, CURLOPT_URL, "https://api.telegram.org/bot".$telegrambotapi."/sendMessage?chat_id=".$chatkanaal."&text=".urlencode($hoei));
                curl_exec($ch1);
                curl_close($ch1);
}
?>

Post Reply

Leave a Reply

Your email address will not be published. Required fields are marked *