{"id":5808,"date":"2016-04-08T17:45:10","date_gmt":"2016-04-08T15:45:10","guid":{"rendered":"http:\/\/www.b.shuttle.de\/hayek\/hayek\/jochen\/wp\/blog-de\/?p=5808"},"modified":"2019-07-18T11:24:31","modified_gmt":"2019-07-18T09:24:31","slug":"wenn-einem-programmierer-beim-abruf-von-pass-telekom-de-langweilig-wird","status":"publish","type":"post","link":"https:\/\/wp.jochen.hayek.name\/blog-de\/2016\/04\/08\/wenn-einem-programmierer-beim-abruf-von-pass-telekom-de-langweilig-wird\/","title":{"rendered":"wenn einem Programmierer beim Abruf von pass.telekom.de langweilig wird \u2026"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Auf pass.telekom.de kann man abfragen, wieviel von seinem Monats-\u00dcbertragungsvolumen bei Telekom\/Mobilfunk bereits verbraucht ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein Programmierer macht das allerdings in einer Kommandozeile (bzw. in einer &#8220;Shell&#8221;) wie folgt:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ curl http:\/\/pass.telekom.de<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nun, die Server-Software checkt aber, welcher Browser gerade als Client fungiert, und wenn curl sich nicht &#8220;verkleidet&#8221;, dann meutert &#8220;der Server&#8221;, also &#8220;verkleiden&#8221; wir uns als ein gebr\u00e4uchlicher Browser:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ curl\u00a0<span style=\"line-height: 1.75\">--user-agent 'Mozilla\/5.0'\u00a0http:\/\/pass.telekom.de<\/span><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Heraus kommt ein Schwall von HTML, das nicht f\u00fcr den menschlichen Betrachter aufbereitet ist. Und eigentlich interessiert den Programmierer doch eh genau sein Verbrauch. Und weil sauberes HTML auch XML ist, kann er einen h\u00fcbschen XPath-Ausdruck anwenden, um an seinen gew\u00fcnschten Wert zu kommen:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ xml sel -t -v '\/\/div[@class = \"barTextBelow color_default\"]\/span'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nun, er schickt den Output der Web-Seiten-Abfrage (&#8220;curl \u2026&#8221;) in diese xml-Utility \u2013 er nennt das in seinem Denglisch &#8220;Pipen&#8221;:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ curl --user-agent 'Mozilla\/5.0' http:\/\/pass.telekom.de |\n  xml sel -t -v '\/\/div[@class = \"barTextBelow color_default\"]\/span'<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Bei mir kam da gerade &#8220;905,68&nbsp;MB&#8221; heraus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die o.a. xml-Utility hei\u00dft \u00fcbrigens &#8220;<em>XMLStarlet Toolkit: Command line utilities for XML<\/em>&#8220;.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/xmlstar.sourceforge.net\">http:\/\/xmlstar.sourceforge.net<\/a><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Tja, wie Daniel hier beisteuerte, kann man auch diese URL abfragen, und bekommt dann JSON:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"http:\/\/pass.telekom.de\/api\/service\/generic\/v1\/status\">http:\/\/pass.telekom.de\/api\/service\/generic\/v1\/status<\/a><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;jq .&#8221; macht einen Pretty-Print auf das JSON:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ jq . pass.telekom-de--status.json \n{\n \"nextUpdate\": 300,\n \"subscriptions\": [\"speedon\",\"tns\"],\n \"title\": \"SpeedOn\",\n \"passName\": \"Your Telekom data plan\",\n \"passStage\": 1,\n \"validityPeriod\": 2,\n \"initialVolume\": 2147483648,\n \"initialVolumeStr\": \"2\u00a0GB\",\n \"usedVolume\": 761470212,\n \"usedPercentage\": 36,\n \"usedVolumeStr\": \"726.19\u00a0MB\",\n \"usedAt\": 1462968935000,\n \"remainingSeconds\": 1751820,\n \"remainingTimeStr\": \"20 days 6 hours\",\n \"downSpeed\": 150000,\n \"downSpeedStr\": \"150\u00a0Mbit\/s\",\n \"upSpeed\": 10000,\n \"upSpeedStr\": \"10\u00a0Mbit\/s\"\n}\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Aber man kann auch genau den Key &#8220;<em>usedVolumeStr<\/em>&#8221; abfragen:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ jq .usedVolumeStr pass.telekom-de--status.json \n\"726.19&nbsp;MB\"\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und so geht es in einem Rutsch:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ curl --user-agent 'Mozilla\/5.0' http:\/\/pass.telekom.de\/api\/service\/generic\/v1\/status | jq .usedVolumeStr\n\"726.19\u00a0MB\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Und jq gibt es hier:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/stedolan.github.io\/jq\">https:\/\/stedolan.github.io\/jq<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Auf pass.telekom.de kann man abfragen, wieviel von seinem Monats-\u00dcbertragungsvolumen bei Telekom\/Mobilfunk bereits verbraucht ist. Ein Programmierer macht das allerdings in einer Kommandozeile (bzw. in einer &#8220;Shell&#8221;) wie folgt: $ curl http:\/\/pass.telekom.de Nun, die Server-Software checkt aber, welcher Browser gerade als Client fungiert, und wenn curl sich nicht &#8220;verkleidet&#8221;, dann meutert &#8220;der Server&#8221;, also &#8220;verkleiden&#8221; wir [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_share_on_mastodon":"0"},"categories":[652],"tags":[1037,1038,1364,1365],"class_list":["post-5808","post","type-post","status-publish","format-standard","hentry","category-deutsche-telekom","tag-jq","tag-json","tag-xmlstartlet","tag-xpath"],"share_on_mastodon":{"url":"","error":""},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/paO0l8-1vG","jetpack_likes_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/posts\/5808","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/comments?post=5808"}],"version-history":[{"count":3,"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/posts\/5808\/revisions"}],"predecessor-version":[{"id":10141,"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/posts\/5808\/revisions\/10141"}],"wp:attachment":[{"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/media?parent=5808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/categories?post=5808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wp.jochen.hayek.name\/blog-de\/wp-json\/wp\/v2\/tags?post=5808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}