04.09.2008
Budget-Verbrauch mit PHP von “Mein T-Mobile” auslesen
Es gibt ja im App Store das kleine Helferlein “UsedBudget” von dem Alle schwärmen – ich kann mich diesem Gejubel aus mehreren Gründen nicht anschliessen:
- Das Design ist grauenhaft. So Leid es mir tut, aber ich finde die App potthässlich. Wofür gibt es den wunderschönen, konsistenten iPhone-UI-Look? Die Einstellungen sehen ja auch ordentlich aus – wieso kann der Hauptanzeige-Screen nicht auch hübsch sein?
- Es zeigt mir “nur” Minuten und SMS an, nicht den Datenverbrauch (außer im Complete S). Ja, das liegt am doofen T-Mobile, ich weiß. Trotzdem wäre das die einzige Information, die ich wirklich regelmäßig direkt am Gerät überprüfen wollen würde.
- Was das Programm leistet, geht auch viel einfacher – und umsonst.
Disclaimer: Alle genannten Punkte beziehen sich auf den aktuellen Stand der Dinge am heutigen 03.09.2008.
Das ist übrigens wirklich nicht böse gemeint, ich bin sicher, dass der Entwickler, Markus Schicker, genügend Leute mit dem Programm sehr glücklich macht. Es sind nur die Gründe, die das Programm für mich persönlich als nicht lohnenswert erscheinen lassen.
Nun aber zum interessanten Teil:
Ich habe mir bereits Monate vor dem App Store ein kleines PHP-Skript zusammengeschraubt, mit dem man ebenfalls den aktuellen Verbrauch aus “Mein T-Mobile” auslesen und anzeigen lassen kann. Ich hatte vor arbeite gerade daran, es mit ähnlichen Features (Angabe des Vertrags erledigt, Hochrechnungen für den Restmonat, etc.) wie “UsedBudget” auszustatten, aber mich dann irgendwann aus Zeitmangel von diesen Plänen verabschiedet und es so rudimentär wie es derzeit ist belassen weil hier so viel Feedback kommt. Man gibt seine Zugangsdaten ein und bekommt dann den bisherigen Monatsverbrauch an Minuten und SMS ausgegeben.
Das Skript kann man benutzen unter:
http://matrixagents.org/sandbox/myTMS/
Die Zugangsdaten werden in einem Cookie auf dem eigenen Rechner gespeichert, das Skript legt keine Daten dauerhaft auf meinem Server ab. Die Kommunikation des Skripts mit der T-Mobile-Seite läuft über HTTPS, genau wie bei UsedBudget auch. Wer dennoch Sicherheitsbedenken hat, kann den den nachfolgenden Quellcode nutzen, um das Skript auf seinem eigenen Rechner/Server zu nutzen.
Achtung: Eure PHP-Konfiguration muss cURL unterstützen!
Mit dem Code darf alles nicht-kommerzielle angestellt werden, was euch einfällt – solange die Quelle durch einen Link auf diesen Eintrag erkennbar ist. Wenn ihr was Tolles damit baut, freue ich mich über einen Hinweis, damit ich es hier auch verlinken kann.
Weitere Fragen, Kritik und Vorschläge könnt ihr gerne hier in den Kommentaren oder über das Kontakt-Formular loswerden.
- v0.6, 16.09.2008: Weitere Hochrechnungen, XML-Ausgabe stark erweitert, Code-Cleanup, Cache-Funktion
- v0.5, 10.09.2008: Hochrechnungen – bitte um Feedback, ob die Werte passen und was für Werte noch sinnvoll wären.
- v0.4, 09.09.2008: XML-Output
- v0.3, 07.09.2008: Unterstützung für mehrere Verträge, Grundlage für Hochrechnungen, Annahme von GET-Parametern
- v0.2, 06.09.2008: Überprüfung auf häufigste Fehlerquellen hinzugefügt
- v0.1, 03.09.2008: Erste Veröffentlichung
Quellcode: Download als ZIP-File

Cooles Teil, nur leider geht es es nur aus deinem Link heraus und nicht auf anderen Servern, gestern abend gings auch noch bei mir aber nu ist Schluss denn er zeigt mir dann keine Werte n, dia Anzeige hinter Minuten etc bleibt leer, ne Ahnung waruim das so ist?
Hi Serge,
war eventuell nur die “Mein T-Mobile”-Seite zeitweise nicht erreichbar? In dem Fall gibt es keinerlei Fehlermeldung oder Ähnliches, nur die Ausgabe klappt wie von dir beschrieben nicht.
Ansonsten weiß ich erstmal auch nicht genau, woran das liegen könnte.
Setz doch mal error_reporting(E_ALL); an den Beginn des Skripts und prüfe, ob PHP irgendwelche Fehlermeldungen ausspuckt.
Hi.
Ich bekomme immer diesen Fehler:
Fatal error: Call to undefined function: curl_init() in /mnt/web3/40/85/564385/htdocs/myTMS.php on line 39
Hat das etwas mit meiner php-Fähigkeit meines Servers zu tun (cURL)?
Jemand einen Tipp?
Hi spockdog,
ja, offenbar unterstützt deine PHP-Konfiguration cURL nicht.
Überprüfe mal die Ausgabe von phpinfo() und suche darin nach “cURL support” – dort muss enabled stehen, damit das Skript funktionieren kann.
Hi und danke für dein schnelles Feedbck.
ich hab die Fehler-Meldung eingesetzt und da ist kein Fehler, desweiteren habe ich auch nachgeschaut ob cURL bei mir aktiv ist und es ist aktiv, so zumindest php_info, weiter weiss ich nicht zumindest das Script was von deiner Seite erreichbar ist weiterhin funktioniert, ich weiss es echt nicht, desweiteren will ich das auf meiner Speziell für das iPhone entwickelten HP einsetzen, erreichbar unter http://iphone.baang.eu, da soll das rein, damit man alles in einem hat und das auch praktisch nutzen kann.
hier noch die Seite wo cih das teste:
http://iphone.baang.eu/a/t-mobile.php
Script funktioniert nicht.
Trotz Eingabe des richtigen Benutzernamens und Passwort bleiben allen angezeiten Werte leer.
Hallo nochmal.
Danke für den Tipp mit “phpinfo()”. Aber ich habe überhaupt keine Ahnung von PHP.
Wie überprüfe ich die Ausgabe von phpinfo()???
Bin bei Strato gehostet.
Coole Sache, sowas wollte ich auch schon basteln…
Serge, hast du irgendetwas am Code verändert? Oder ist sonst irgendetwas anders im Vergleich zu gestern, als es noch bei dir funktioniert hat?
Sprint, hast du mehr als eine Nummer unter “Mein T-Mobile”? Damit kommt das Skript scheinbar nicht zurecht.
spockdog, du musst nur ein PHP-File mit dem Befehl phpinfo(); erstellen und dieses dann aufrufen, dann siehst du die Details deiner PHP-Konfiguration.
ne ich habe dort gar nix vrändert, KA , gestern gings einmla und als ich heut anfangen wollte dies zu implementieren dann warendie WWerte leer und das blieben sie auch
hab dann dien Script nochmals gedownloaded und 1:1 kopiert und selbst den dDateinamen übernommen und dennoch war da nix zu sehen, kA, wenn es gar nicht gegangen wäre, dann wüsste ich bescheid aber gertern als ich es hier gefunden habe und sofort ausprobiert hatte, da ging es noch und auf einmal heute war ebbe, etl stimmt was mit meinen Zugangsdaten nicht, geht mein Script denn it euren Daten? Mal in die Runde gefragt^^
Naja, wenn es hier mit deinen Daten klappt, kann es daran ja eigentlich kaum liegen. Ich schau mir das Ganze heute Abend nochmal genauer an und bastele vielleicht ein kleines Debug-Skript, das auf verschiedene Fehlerquellen prüft. Oder ich bau die Prüfungen direkt in das Skript ein..
Hey das klingt ja klasse, ich freu mich drauf, btw: habs grad auf mmeinem Portal implementiert, leider nur als iFrame aber es soll schon mal verraten worauf ich in etwa hinaus wolle, also: enjoy ^^
So, die 0.2 ist jetzt online – sowohl der ZIP-Download als auch der Quelltext im Eintrag wurden aktualisiert. Es wird momentan auf drei verschiedene Fehlerquellen überprüft: Zu niedrige PHP-Version (cURL noch gar nicht verfügbar), cURL deaktiviert, Schreibrechte für Cookies nicht gesetzt.
Wer Probleme hat, möge bitte die neue Version testen und mir dann gegebenenfalls die Fehlermeldungen mitteilen. Ich hoffe, damit kommen wir den Problemen auf die Schliche.
Vielen Dank im voraus aber leider ohne Erfolg, er sagte zwar was von wegen Schreibrechte, aber als ich sie ihm gab wollte er dennoch keine Werte anzeigen, leider geht es nicht, schlag mich tot ich weiss nicht wieso, der Server ist bei Strato und mit SUSE 10.xxx was weiss ich und Plesk, doch dort ist PHP5 bereits aktiv und cURL ist wohl schon dabei gewesen, was ich da noch einstellen kann und muss entzieht sich meiner Kenntnis, leider, mal ne andere Frage: Wäre es möglich dein Script so umzubauen, dass es die Zugangsdten per $_GET annimmt, dann könnte ich dein Script auf deiner Seite verwenden wenn es dir nix ausmacht ^^Sorry für die dumme Frage aber mir gehen so langsam die Ideen aus, oder gibt es da evtl noch Parameter die für cURL eingestellt werden müssen?
Moin allerseits, ich hab ir heute nochmals das Script angeschaut, und gemerkt, dass bei mir das Array was die Werte erhalten soll, also $regs oder wie das auch heissst leer ist und keine werte enthält was darauf deutet dass der Fehler wohl schon bereit eher eintrifft, evtl beim Login oder so?
ROFL ich hab den Fehler gefunden:^^
Es kann auch nix kommen denn t-Mobile hat kurzerhand ihre Seite umziehen lassen und daher ist das auslesen der Werte unmäglich
hier die Fehlermeldung bzw der Inhalt den c<URL zum auswerten bekommt und daher nix findet:
This document you requested has moved temporarily.
It’s now at https://mein.t-mobile.de/cpc-sp/logon?ekp.targetPage=%2Fcpc%2FshowHomepage.do%3Fhp_anchor%3D178616321_1%26hp_menu%3Dkostenkontrolle%26mea_source%3D4400000001%26hp_sel_contr%3D178616321&mea_source=4400000001&mea_d=0
leider entzieht es sich meiner Fähigkeiten dies zu beheben da ich mit der URL nix anfangen kann, sorry
Ah, interessant – mit diesem Problem hatte ich es beim Basteln des Skripts schonmal zu tun. Das sollte sich lösen lassen, Danke für dein Nachforschen! Seltsam zwar, dass es bei mir trotzdem geht – vielleicht ist das wieder abhängig von der PHP-Konfiguration.
Werde vermutlich erst morgen dazu kommen es genauer zu untersuchen, aber ich bin zuversichtlich, dass darin die Lösung liegt.
Kein Problem, gerne, und desweiteren vermute ich, dasss t-Mobile mit den PHP-Referrent herumspielt was der Grund sein könnte, warum es bei dir geht und bei den anderen nicht, kA mal schauen wie du das Problem lösen kannst, dennoch danke für deine MMühen
Moin,
sehr coole Sache – leider funzt es auf meinem Server nicht, da CURLOPT_FOLLOWLOCATION nicht eingeschaltet ist (und lt. meinem Betreiber auch nicht wird, da damit ansonsten irgendwelche Abgrenzungen von div. Kundenhostings in Rutschen geraten würden).
Ich war mal so leichtfertig die Abfrage durch Deine Matrix zu schicken ;-). Allerdings scheint das Script (noch?) nicht die Möglichkeit dass hinter dem Login mehrere Verträge zur Auswahl warten zu berücksichtigen!? Ich hab leider auch noch nicht den richtigen Parameter gefunden um das mit in die URL einzubauen. Ansonsten würde nämlich ein relativ schlichtes Bookmark mit dem Inhalt
https://mein.t-mobile.de/cpc-sp/logon?ekp.targetPage=%2Fcpc%2FshowHomepage.do&mea_d=0&username=USERNAME&password=PASSWORT
ausreichen. USERNAME und PASSWORT halt mit den jeweiligen, individuellen Angaben ersetzen. Die Erweiterung der URI um &vertrag=TELEFONNUMMER reicht leider nicht :-/.
Gruß Stefan
hopsa – da hat sich ein überzähliges »j« hinter USERNAME eingeschmuggelt
Hab ich mal eben korrigiert.
Hi Stefan,
da bist du mir zuvorgekommen. Wollte gerade eben auch schreiben, dass es genau daran liegt: CURLOPT_FOLLOWLOCATION muss aktiv sein, da sonst der HTTP-Redirect von cURL nicht verfolgt wird.
Kannst du mir eventuell den HTML-Code von der Seite direkt nach dem LogIn und von der Kostenkontrolle-Seite zukommen lassen? Dann könnte ich versuchen, die Unterstützung für mehrere Verträge einzubauen, ich selbst habe ja “nur” einen Vertrag.
Serge, du müsstest dich also auch an deinen Hoster wenden, um herauszufinden, ob sie dir CURLOPT_FOLLOWLOCATION freischalten. Ansonsten werde ich das Skript bei mir jetzt ersteinmal so anpassen, dass es die Parameter auch per GET entgegennimmt.
So,
war gar nicht so kompliziert. Es sollte nun auch klappen, wenn mehrere Veträge unter einem Account verwaltet werden. Dazu muss die Rufnummer im Format 01702233445 angegeben werden, also am Stück, ohne jegliche Trennzeichen und Landesvorwahl.
Außerdem kann nun die Art des Vertrags angegeben werden – in der nächsten Version wird diese Angabe für Hochrechnungen herangezogen.
Die Parameter können außerdem per GET übermittelt werden, im Einzelnen sind das folgende:
user: Benutzername für “Mein T-Mobile”
pass: Passwort für “Mein T-Mobile”
nummer: Handynummer des Vertrags
vertrag: “s”, “m”, “l” oder “xl” – Groß-/Kleinschreibung egal.
action: Muss immer mit Wert “true” dazugehängt werden.
Bitte um Rückmeldung, ob soweit alles funktioniert, hab das relativ fix gemacht und nur kurz getestet.
Danke!
Hmm, so ganz scheints das noch nicht zu sein. Minuten und SMS bleiben (in der sandbox-Version) leer :-/. Lokal krieg ichs wegen CURLOPT_FOLLOWLOCATION halt immer noch nicht ans arbeiten. Gibts da einen Weg drumherum? Weiter: wenn ich die Parameter wie beschrieben an die URI hänge, komme ich auch noch nicht weiter als bisher. Wenn ich Zeile 188 aber richtig deute, hängt da noch irgendeine »Umrechung« dran?
Ich fürchte, ohne CURLOPT_FOLLOWLOCATION geht es nur, wenn man auf cURL komplett verzichtet. Prinzipiell wäre es nicht allzu dramatisch, da ich ja sowieso in einer bestimmten Reihenfolge vorab definierte URLs aufrufe. Der Redirect findet aber noch während des Login-Vorgangs statt, genau der Part, wegen dem cURL nötig ist.
Ok, dann also nochmal ans Debuggen – funktioniert demnach weiterhin nur mit einem einzigen Vertrag. Immerhin, auch diese Variante wird durch denselben Weg geschleust wie bei mehreren Verträgen, also so weit kann die Lösung nicht mehr weg sein.
“Umrechnung” ist zu viel gesagt, es wird nur aus 01702233445 der Wert “0170 2233445″ gemacht. Die Nummer steht auf der Vertragswahl-Seite ja in diesem Format, also mit trennendem Leerzeichen drin, und um an den korrekten Link zur gewünschten Nummer zu kommen, gehe ich natürlich über den Text des Links.
Jou besten Dank auch, geht nun bei mir via GET etc und ist Datenbank gestützt.
Einfach eben registrieren um die Zugangsdaten festzulegen, Profil anpassen und ab gehts:
http://iphone.baang.eu/
In der nächsten Version wird es bei der Abfrage über GET noch die Möglichkeit geben, sich die Daten als XML geben zu lassen – ich gebe dir vorab Bescheid, damit du deine Seite an dieses XML anpassen kannst. Denn an der Textausgabe werde ich vor allem wegen der Hochrechnungsanzeige noch schrauben, aber die XML-Daten sind immer im gleichen Format.
Außerdem habe ich heute nochmal gute 2 Stunden lang rumgesucht und viel ausprobiert – aber es gibt anscheinend keinen Weg ohne cURL und FOLLOWLOCATION. Leider ist letzteres im safe_mode automatisch deaktiviert – aber solang ich keine andere Lösung habe, einen HTTP-Post-Login an einem HTTPS-Server durchzuführen, kann ich von cURL nicht weg.
Hey das klingt ja super, so hätte ich die Möglichkeit via RSS reader die Wete abzugreifen ohne einen Grabber zu schreiben um die Werte entweder weiter zu verarbeiten oder optisch aufzuwerten, das klingt ja super.
btw: wie aktiviert man dieses CORL LOCATION et cauf einem ROOT server mit PLESK? Ne Ide?
Ich vermute mal, dass dein PHP im “Safe mode” läuft – du musst diesen abstellen. Dazu gehst du in deine php.ini und suchst nach “safe_mode”, dort steht vermutlich “On” und du musst es auf “Off” ändern. Danach den http-daemon neu starten.
Wenn es das nicht ist, kann es noch an open_basedir liegen, dann wäre es hilfreich, wenn du mir einen Blick auf deine phpinfo() gestatten würdest.
Die neue Version wird auch auf diese beiden Punkte überprüfen und gegebenenfalls mit einem Fehler abbrechen. Ich hoffe, dass ich bis morgen soweit fertig mit allem bin und sie dann online stellen kann.
Ok, doch schon fertig.
Der XML-Output steht jetzt auch, du bekommst ihn mittels folgender URL:
http://matrixagents.org/sandbox/myTMS/myTMS.php
?user=USERNAME
&pass=PASSWORT
&nummer=HANDYNUMMER
&vertag=VERTRAGSART
&action=true
&output=xml
Ich hab diesen Monat sehr wenig von meinem Budget genutzt, das Testen der Hochrechnungen ist nicht so leicht – passt da alles?
Und hat es mittlerweile nochmal jemand mit mehreren Verträgen ausprobiert?
verfolge den Thread nun schon ganz gespannt leider kann ich das Script wegen dem berüchtigten
CURLOPT_FOLLOWLOCATION
nicht nutzen. Einen HTTP Post Login kannst du mit der Klasse Snoopy.class.php machen zu finden unter:
http://www.m-software.de/snoopy.php
Ausserdem kann diese Klasse auch Browser informationen ändern und mit cookies umgehen
Beispielcode:
$snoopy = new Snoopy();
$submit_url = “http://www.irgendwas.de”;
$submit_vars["start_ort"] =”Berlin”;
$snoopy->submit($submit_url,$submit_vars);
$content =$snoopy->results;
Hi Florian,
ich werde mir, vorraussichtlich am Wochenende, das mal genauer anschauen. Ich fürchte nur, dass auch das wieder am HTTPS scheitern könnte. Wenn es aber einen Weg gibt, von cURL wegzukommen, dann werde ich schnellstmöglich das Skript so umstellen, dass es endlich noch mehr Leute auf dem eigenen Server nutzen können.
Vielen Dank für den Hinweis!
Habs grad mal versucht scheint bei https auch Probleme zu machen aber shaus dir vielleicht doch mal an.
hey ho, ich konnte das script bei ir nicht vrwenden wegen dem open basedir ding da, daher habe ich die get variante implementiert und einen grabber geschrieben der die werte rausholt und optisch anpasst, nun auch mit einem grafischen balken der die prozentuale Menge des verbrauchs anzeigt, sieht richtig schick aus aber lange rede kurzr sinn:: schau es euch selbst an:
http://iphone.baang.eu/
die registrierung ist nur um zugangsdaten festzulegen mehr nicht, sind nur 2 felder ausfüllen und das wars also viel Spass beim schauen^^
Ich hab mir gestern Snoopy genauer angeschaut – wie erwartet scheitert es am HTTPS. Mir ist nach wie vor keine Alternative zu cURL bekannt, die alle nötigen Features bringt. cURL muss daher vorerst bleiben, leider.
In den nächsten Tagen kommt nochmal eine neue Version mit ein paar Zahlenspielen mehr.
Heay Agent Smith, danke für dein Engegement und das du dich so bemühst ist klasse. Desweiteren habe ich dieses Script nun voll implemenntiert und heute die ganze Sache online gestellt und mit ein paqar netten Screenshtos aufgepeppelt, aber lange Rede kurzer Sinn: Schau es euch einfachs elbst an und denkt euch euren teil oder teilt ihn mir mit^^
http://www.baang.eu
der aktuellste Artiikle
So, Version 0.6 ist da – bringt ein paar neue Hochrechnungen, massiv erweiterte XML-Ausgabe und cached die Anfragen zum T-Mobil-Server (abstellbar, Cache-Gültigkeitsdauer auch einstellbar), um nicht so viel Last zu verursachen.
Hi,
woher hast du die Daten, damit man auf die t-mobile Server zugreifen kann? Gibt es eine bestimmt Schnittstelle, wenn Ja, wo kann ich deren funktionalität nachlesen?
Grüße
Hi,
da gibt es leider keine Schnittstelle, Nein. Ich simuliere stattdessen über PHP den Ablauf, als würde ich als Nutzer den Login per Browser durchführen und lese dann die HTML-Ausgabe ein. Das funktioniert über cURL, die Funktionalität sollte aus dem Quellcode relativ schnell ersichtlich sein. Wenn du mehr Fragen hast, nur zu – wenn ich helfen kann, gerne!
Das ist genau das was ich gesucht habe, denn leider bin ich nicht im Besitz einer Kreditkarte und komme an das “offizielle” usedbudget nicht ran.
Hier ist aber alles drin was ich wissen muß und es klappte ganz einfach, die URL in den Safari eingegeben und dann die Daten eingegeben und schon war alles da.
Gibt es die Möglichkeit da ein Logo einzugeben um es auf dem Home Screen gut erkennen zu können, noch ist da nur ein weißes Feld.
Würde mich freuen wenn mir jemand helfen könnte!!!
Ansonsten KLASSE TOLL GEMACHT!!!!
Ich werde mich im Laufe des Abends drum kümmern, dass ein “Home-Screen-kompatibles” Logo erscheint, probier einfach morgen nochmal, es zum Home Screen zuzufügen, dann sollte es klappen.
das wäre wirklich absolut Klasse!! Danke übrigens das Du so schnell geantwortet hast. Bin dann morgen mal wieder da!
lg
Klasse geworden das Bild für den Homescreen. Danke
Hallo,
wie kommt es das das gut gelungene Bild auf dem Homescreen nicht mehr da ist sondern nur ein Textausschnitt??
lg
noire
Grüße,
interessantes Tool. Könnte man mit diesem Tool als Basis (und ggf. einem eigenen Server) ein Vista Gadget erstellen? Würde liebend gerne meine Verträge (restliche Freiminuten) angezeigt bekommen – ohne laufend auf die T-Mobile-Seite zu switchen. Machbar?
Dragi
Hi,
leider hab ich nicht den Hauch einer Ahnung von Vista Gadgets, würde aber mal ganz prinzipiell und nach 3 Minuten Schnellrecherche mit Google behaupten, dass das irgendwie möglich ist, ja.
Hi AgentSmith,
sehr schönes Skript hast du da zusammengeschustert.
Ich betreibe das auf meiner eigenen Domain (ohne Login-Maske, dafür mit den entsprechenden Daten durch geschützte include-Datei), aber habe Probleme mit file_put_contents, wenn ich das nicht auskommentiere.
Gibt’s eine Möglichkeit die Cache-Funktion einfach komplett abzustellen?
Der genaue Fehler ist: “Fatal error: Call to undefined function: file_put_contents() in /kunden/71027_90765/webseiten/schoeck.org/privat/orgTMS.php on line 467″
Wenn ich das auskommentiere “file_put_contents($cacheName, implode(‘#’, array($usedMinutes, $usedSMS, $usedMB)));” dann funktioniert es zwar, aber ich bekomme einen division by 0 Fehler. Die meisten Angaben stimmen danach aber trotdem…
Irgendwie etwas komisch alles, evtl. fällt dir dazu ja was ein.
Hi,
um die Cache-Funktionalität komplett abzustellen, musst du nur ganz oben die Variable “useCache” auf FALSE stellen.