Skip to content

Instantly share code, notes, and snippets.

@nkreer

nkreer/db-ticketmail.php

Last active Aug 23, 2020
Embed
What would you like to do?
Script to generate an email to Deutsche Bahn's Mobilitätsservicezentrale about seating reservations using the booking number
<?php
// Script to fetch DB ticket data
// used to auto-compose emails to
// Deutsche Bahn's MSZ to book
// seating reservations.
// Based on n0emis's work, thanks a lot:
// https://md.n0emis.eu/88-aRNOHQ0ajwvz-secaCw#
// User configuration
// What types of trains are reservations possible for?
define("REQUEST_FOR_TYPES", ["ICE", "IC", "EC", "ECE"]);
// The generated email base text - include custom seating wishes here
define("EMAIL_TEXT", "Sehr geehrte Damen und Herren,
ich würde gerne für folgende Verbindung(en) je zwei Sitzplatzreservierungen tätigen:
{{connections}}
Gerne an einer Tischgruppe außerhalb des Ruhebereiches und wenn möglich, in einem Abteil.
Bitte teilen Sie mir zusätzlich, sofern für Sie machbar, nocheinmal separat die Platz- und Wagennummern sowie die ungefähre Position der Plätze im Zug mit, damit wir sie schneller finden können.
Eine Kopie meines Schwerbehindertenausweises mit Merkzeichen B liegt Ihnen bereits vor. Meine Buchungsnummer lautet {{booking-id}}.
Weitere Hilfeleistungen sind für diese Fahrt nicht notwendig.
Herzlichen Dank und bleiben Sie gesund!");
// Script
$remoteUrl = "https://fahrkarten.bahn.de/mobile/dbc/xs.go?";
$userAgent = "DB Navigator/1019138 CFNetwork/1107.1 Darwin/19.0.0";
// Ask the user for ticket details
$bookingCode = getUserInput("Buchungsnummer");
$lastName = getUserInput("Nachname d. Reisenden");
// Make a request to get ticket data
$queryBody = '<?xml version="1.0"?><rqorderdetails version="1.0"><rqheader ts="'.date("Y-m-d").'T'.date("H:i:s").'" l="de" v="19100000" d="iPad7,5" os="iOS_13.6.1" app="NAVIGATOR"/><rqorder on="'.strtoupper($bookingCode).'"/><authname tln="'.strtoupper($lastName).'"/></rqorderdetails>';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $remoteUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $queryBody);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Host: fahrkarten.bahn.de',
'Content-Type: application/x-www-form-urlencoded',
'Connection: keep-alive',
'Accept: */*',
'User-Agent: '.$userAgent,
'Accept-Language: de-de',
'Accept-Encoding: Accept-Encoding: gzip, deflate, br'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Request the XML
$serverOutput = curl_exec($ch);
curl_close($ch);
// Parse the XML and get the information we need
$xml = new DOMDocument();
$xml->loadXML($serverOutput);
$trains = $xml->getElementsByTagName("train");
// Iterate over the trains and add them to the request string
$trainString = "";
foreach($trains as $train){
$values = $train->childNodes;
// Preprocessing the information compile a comprehensive array
$trainData = [];
foreach($values as $value){
$trainData[$value->localName] = $value->textContent;
}
// Get departure of the train
$departure = $train->getElementsByTagName("dep");
$departure = $departure[0]; // There is only one departure per train
// Format dates & time so they make sense to the agent
$trainData["date"] = date("d.m.Y", strtotime($departure->attributes->getNamedItem("dt")->textContent));
$trainData["time"] = date("H:i", strtotime($departure->attributes->getNamedItem("t")->textContent));
// Get start
$trainData["from"] = $departure->getElementsByTagName("n")[0]->textContent;
// Get destination
$trainData["to"] = $train->getElementsByTagName("arr")[0]->getElementsByTagName("n")[0]->textContent;
// If usable, assemble string and append to the request
if(in_array($trainData["gat"], REQUEST_FOR_TYPES)){
$trainString .= $trainData["date"]." ".$trainData["time"]." Uhr: ".$trainData["gat"]." ".$trainData["zugnr"]." von ".$trainData["from"]." nach ".$trainData["to"]."\n";
}
}
echo "\n\n --- GENERATED EMAIL - SEND TO msz@deutschebahn.com --- \n\n";
// Output the email
$requestString = str_replace(["{{connections}}", "{{booking-id}}"], [$trainString, $bookingCode], EMAIL_TEXT);
echo $requestString;
echo "\n\n --- END OF EMAIL --- \n\n";
// Open thunderbird with pre-filled info
shell_exec("thunderbird -compose to='msz@deutschebahn.com',format=text,subject=Sitzplatzreservierung,body='".rawurlencode($requestString)."'");
// Utility functions
function getUserInput(string $prompt){
echo $prompt.": ";
// Read from stdin and return user input
return trim(fgets(STDIN));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.