﻿{"id":1064,"date":"2012-06-19T20:58:56","date_gmt":"2012-06-19T18:58:56","guid":{"rendered":"http:\/\/www.flapane.com\/blog\/?p=1064"},"modified":"2013-09-29T18:15:55","modified_gmt":"2013-09-29T17:15:55","slug":"interfaccia-in-php-per-runkeeper","status":"publish","type":"post","link":"https:\/\/www.flapane.com\/blog\/2012\/06\/interfaccia-in-php-per-runkeeper\/","title":{"rendered":"Interfaccia in PHP per Runkeeper e Sportstracklive"},"content":{"rendered":"<p style=\"text-align: justify;\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-full wp-image-1066 image\" title=\"runkeeper-500x365\" alt=\"\" src=\"https:\/\/www.flapane.com\/blog\/wp-content\/uploads\/2012\/06\/runkeeper-500x365.jpg\" width=\"491\" height=\"312\" \/><\/p>\n<p style=\"text-align: justify;\">Qualche giorno fa ho finalmente rispolverato la bicicletta e, approfittando del bel tempo, ho voluto fare un lungo giro costeggiando il mare.<\/p>\n<p style=\"text-align: justify;\">Visto che il contachilometri era scarico, ho cercato qualche App per Android che sfruttasse il GPS per registrare il percorso, la velocit\u00e0, l&#8217;altitudine, e cos\u00ec via. <strong><a href=\"http:\/\/www.runkeeper.com\" target=\"_blank\">Runkeeper<\/a><\/strong> \u00e8 subito saltato all&#8217;occhio: grafica accattivante, possibilit\u00e0 di condivisione social, App gratuita (anche se migliorabile).<br \/>\nSimile a Runkeeper, anche <strong><a title=\"fitness stats\" href=\"http:\/\/www.sportstracklive.com\/\" target=\"_blank\">Sportstracklive<\/a><\/strong> registra le vostre performance. Rispetto al primo, per\u00f2, ha un sito meno accattivante, ed una App per Android di gran lunga migliore (anche se a pagamento).<\/p>\n<p style=\"text-align: justify;\">Ho installato l&#8217;App, fatti i miei bei 35km, ed a casa ho caricato il mio percorso sul sito web di Runkeeper.<br \/>\nTuttavia, n\u00e8 Runkeeper n\u00e8 Sportstracklive offrono alcuna possibilit\u00e0 per integrare le statistiche della propria corsa sul proprio sito web (mentre \u00e8 possibile condividerla via Facebook o Twitter). Inoltre, non offrono alcuna API per interagire con i loro dati.<!--more--><\/p>\n<p style=\"text-align: justify;\">In pochi minuti liberi ho scritto una piccola applicazione in PHP, che permette di mostrare nella mia homepage le statistiche relative all&#8217;<strong>ULTIMA<\/strong> mia attivit\u00e0, corsa o bicicletta che sia.<\/p>\n<p style=\"text-align: justify;\">E&#8217;sufficiente inserire il proprio username, impostare il tempo di validit\u00e0 della cache (per evitare di sovraccaricare il sito), e potrete visualizzare subito le vostre statistiche!<\/p>\n<p style=\"text-align: justify;\">Un esempio, preso dalla mia homepage:<\/p>\n<div id=\"attachment_1069\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.flapane.com\/blog\/wp-content\/uploads\/2012\/06\/runkeeper_log.png\" rel=\"lightbox[1064]\"><img aria-describedby=\"caption-attachment-1069\" decoding=\"async\" loading=\"lazy\" class=\"size-medium wp-image-1069 image\" title=\"runkeeper_log\" alt=\"Interfaccia PHP per Runkeeper in funzione\" src=\"https:\/\/www.flapane.com\/blog\/wp-content\/uploads\/2012\/06\/runkeeper_log-300x231.png\" width=\"300\" height=\"231\" srcset=\"https:\/\/www.flapane.com\/blog\/wp-content\/uploads\/2012\/06\/runkeeper_log-300x231.png 300w, https:\/\/www.flapane.com\/blog\/wp-content\/uploads\/2012\/06\/runkeeper_log.png 334w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1069\" class=\"wp-caption-text\">Interfaccia PHP per Runkeeper in funzione<\/p><\/div>\n<p style=\"text-align: justify;\">Andiamo a dare un veloce sguardo al codice:<\/p>\n<span class=\"no_translate\"><\/span><\/p>\n<pre class=\"brush:php\">&lt;?\r\n\/* Sportstracklive.com data parser. It automatically shows data from the LAST activity for a given username. Set your username, cache file name, and expiration time of the cachefile.\r\n(c) Flapane.com - Feb-2013*\/\r\n\r\ndefine('SPORTSTRACK_USER','type_your_username');\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Runkeeper Username\r\n$expiretime=6; \u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0 \/\/ cache expire time in hours\r\n$cachename=\"sportstracklive.cache\"; \/\/name of the cachefile\r\n\r\n\/\/create the cachefile if it doesn't exist\r\nif (!file_exists($cachename)) {\r\n\u00a0\u00a0\u00a0\u00a0 $create = fopen($cachename, 'w');\r\n\u00a0\u00a0\u00a0 \u00a0 chmod (\"$cachename\", 0644); \/\/set chmod 644\r\n\u00a0\u00a0 \u00a0 fclose($create);\r\n}\r\n\r\n\/\/ Is the file older than $expiretime, or the file is new\/empty?\r\n$FileAge = time() - filectime($cachename);\u00a0\u00a0 \u00a0\/\/ Calculate file age in seconds\r\nif ($FileAge &gt; ($expiretime * 3600) || 0 == filesize($cachename))\r\n{\r\n\u00a0\u00a0 \u00a0include_once('simple_html_dom.php');\r\n\u00a0\u00a0 \u00a0$opts = array(\r\n\u00a0 'http'=&gt;array(\r\n\u00a0\u00a0\u00a0 'user_agent'=&gt;'Mozilla\/5.0 (Windows; U; Windows NT 5.1; en; rv:1.9.2.3) Gecko\/20100401 MRA 5.6 (build 03278) Firefox\/3.6.3 (.NET CLR 3.5.30729)',\r\n\u00a0\u00a0 \u00a0'Accept: text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8'\r\n\u00a0 )\r\n);\r\n\u00a0\u00a0 \u00a0$context = stream_context_create($opts);\u00a0\u00a0 \u00a0\/\/create an useragent for simple_html_dom\r\n\u00a0\u00a0 \u00a0$html = file_get_html('http:\/\/www.sportstracklive.com\/search?what=user%3A'.SPORTSTRACK_USER.'&amp;search=Search', 0, $context);\r\n\u00a0\u00a0 \u00a0$link = $html-&gt;find('.likeh4 lightGrey.', 0)-&gt;find('a', 0)-&gt;href;\u00a0\u00a0 \u00a0\/\/ Get the last activity link\r\n\u00a0\u00a0 \u00a0$link2 = file_get_html('http:\/\/www.sportstracklive.com'.$link, 0, $context);\r\n\u00a0\u00a0 \u00a0$activity_table = $html-&gt;find('td', 1);\u00a0\u00a0 \u00a0\/\/ Get the activity table stats\r\n\u00a0\u00a0 \u00a0$activity_table2 = $link2-&gt;find('table', 7);\u00a0\u00a0 \u00a0\/\/get other stats\r\n\u00a0\u00a0 \u00a0$activity_table3 = $link2-&gt;find('table', 8);\u00a0\u00a0 \u00a0\/\/get other stats (calories)\r\n\r\n\u00a0\u00a0 \u00a0$activity_date = strip_tags($activity_table-&gt;find('.lightGrey', 1)); \/\/last activity data\r\n\u00a0\u00a0 \u00a0$category= strip_tags($link2-&gt;find('.likeh2', 0)); \/\/activty type\r\n\u00a0\u00a0 \u00a0$distance= strip_tags($activity_table-&gt;find('.likeh2', 6)); \/\/total distance\r\n\u00a0\u00a0 \u00a0$moving_time= strip_tags($activity_table2-&gt;find('.likeh4', 2)); \/\/total moving time\r\n\u00a0\u00a0 \u00a0$avg_speed= strip_tags($activity_table2-&gt;find('.likeh4', 3)); \/\/average speed\r\n\u00a0\u00a0 \u00a0$avg_time_km= strip_tags($activity_table2-&gt;find('.likeh4', 4)); \/\/average moving pace\r\n\u00a0\u00a0 \u00a0$calories= strip_tags($activity_table3-&gt;find('.likeh4', 0)); \/\/calories\r\n\r\n\u00a0\u00a0 \u00a0\/\/ Now refresh the cachefile with newer content\r\n\r\n\u00a0\u00a0 \u00a0$stats = '&lt;a href=\"http:\/\/www.sportstracklive.com'.$link.'\" target=\"_blank\"&gt;Ultima attivit&amp;agrave;:&lt;b&gt; '.$activity_date.'&lt;\/b&gt;&lt;\/a&gt;&lt;br \/&gt;Tipo di attivit&amp;agrave;:&lt;b&gt; '.$category.'&lt;\/b&gt;&lt;br \/&gt;Distanza totale:&lt;b&gt; '.$distance.'&lt;\/b&gt;&lt;br \/&gt;Durata:&lt;b&gt; '.$moving_time.'&lt;\/b&gt;&lt;br \/&gt;Velocit&amp;agrave; media:&lt;b&gt; '.$avg_speed.'&lt;\/b&gt;&lt;br \/&gt;Tempo medio sul Km:&lt;b&gt; '.$avg_time_km.'&lt;\/b&gt;&lt;br \/&gt;Calorie bruciate:&lt;b&gt; '.$calories.'&lt;\/b&gt;&lt;br \/&gt;';\r\n\r\n\u00a0\u00a0 \u00a0$handle = fopen($cachename, 'wb');\r\n\u00a0\u00a0 \u00a0fwrite($handle, $stats);\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n}\r\n\r\n\/\/cachefile is fresh enough... outputting data\r\n$data=file_get_contents($cachename);\r\necho $data;\r\n?&gt;<\/pre>\n<p><span class=\"no_translate\"><\/span>\n<p style=\"text-align: justify;\">Come detto sopra, baster\u00e0 impostare il proprio username. Per comodit\u00e0, ho deciso di aggiornare la cache ogni 12 ore (720 minuti), tempo pi\u00f9 che sufficiente, visto che difficilmente vi allenerete due volte al giorno!<\/p>\n<p style=\"text-align: justify;\">Potete scaricare il file zip con tutto il necessario per mostrare le vostre statistiche, a questi indirizzi:<\/p>\n<p style=\"text-align: justify;\"><strong><a href=\"https:\/\/www.flapane.com\/blog\/wp-content\/uploads\/2012\/06\/runkeeper-parser.zip\">Runkeeper PHP parser<\/a><\/strong><\/p>\n<p style=\"text-align: justify;\"><strong><a href=\"https:\/\/www.flapane.com\/blog\/wp-content\/uploads\/2012\/06\/sportstracklive.zip\" target=\"_blank\">Sportstracklive PHP parser<\/a><\/strong><\/p>\n<p style=\"text-align: justify;\">Feedback, commenti e giudizi, sono i benvenuti!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ho installato l&#8217;App, fatti i miei bei 35km, ed a casa ho caricato il mio percorso sul sito web di Runkeeper.<br \/>\nTuttavia, il sito non offre alcuna possibilit\u00e0 per integrare le statistiche della propria corsa sul proprio sito web (mentre \u00e8 possibile condividerla via Facebook o Twitter).[&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":1069,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[7],"tags":[195,200,118,201,14,135],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.flapane.com\/blog\/wp-json\/wp\/v2\/posts\/1064"}],"collection":[{"href":"https:\/\/www.flapane.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.flapane.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.flapane.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.flapane.com\/blog\/wp-json\/wp\/v2\/comments?post=1064"}],"version-history":[{"count":0,"href":"https:\/\/www.flapane.com\/blog\/wp-json\/wp\/v2\/posts\/1064\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.flapane.com\/blog\/wp-json\/wp\/v2\/media\/1069"}],"wp:attachment":[{"href":"https:\/\/www.flapane.com\/blog\/wp-json\/wp\/v2\/media?parent=1064"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.flapane.com\/blog\/wp-json\/wp\/v2\/categories?post=1064"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.flapane.com\/blog\/wp-json\/wp\/v2\/tags?post=1064"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}