-Title: Bitfactors Bensinpris-API
+Title: Litt informasjon om Bitfactors Bensinpris-API
Tags: norsk
Date: 2011-12-09 12:00
<p>For noen måneder siden lanserte Bitfactory en
-<ahref="http://www.bitfactory.no/bensinpris.html">mobilapp for å få
+<a href="http://www.bitfactory.no/bensinpris.html">mobilapp for å få
tilgang til bensinpriser</a> på landets bensinstasjoner.
Informasjonen appens brukere har samlet inn har så langt kun vært
tilgjengelig for brukerne av app-ene, og API for å hente ut
langt.</p>
<p>Utrolig nok er det i følge
-<a href="http://www.dn.no/energi/article2194526.ece">Dagens
+<ahref="http://www.dn.no/energi/article2194526.ece">Dagens
Næringsliv</a> og
-<a href="http://www.finnmarkdagblad.no/nyheter/article5323140.ece">Finnmark
+<ahref="http://www.finnmarkdagblad.no/nyheter/article5323140.ece">Finnmark
Dagbladet</a> bensinstasjoner som nekter å oppgi prisene sine på
telefon, slik at det ikke finnes en fornuftig måte å få tak i prisene
-på uten å samle dem inn på stedet.<p>
-
-<p>Jeg tok meg derfor litt tid for å revers-utvikle protokollen for å
-gjøre den innsamlede informasjonen tilgjengelig for flere.
-Protokollen bruker HTTP og normal forms-notasjon for POST. Her er
-API-kallene jeg har identifisert så langt.</p>
+på uten å samle dem inn på stedet. Flere har dugnader på gang for å
+samle inn prisinformasjon om bensin, men så vidt jeg kan se er det kun
+<ahref="http://www.dinside.no/php/oko/bensin/vis_prisliste.php">dinside.no</a>
+og Bitfactorys App som får regelmessige oppdateringer. Dinsides
+oversikt er tilgjengelig på web for de som vil følge med, mens
+bitfactorys informasjon er ikke enkelt tilgjengelig.<p>
+
+<p>Jeg tok meg derfor litt tid for å revers-utvikle protokollen for
+Bitfactorys mobilapp for å gjøre den innsamlede informasjonen
+tilgjengelig for flere. Protokollen bruker HTTP og normal
+forms-notasjon for POST. Her er API-kallene jeg har identifisert så
+langt.</p>
<b>stasjonsDatabaseUpdateStamp</b>
-GET http://www.bitfactory.no/Bensin/ver1.1.stasjonsDatabaseUpdateStamp
-
-Vet ikke helt hva dette API-kallet gjør. Navnet gjør at jeg tror den
-rapporterer når listen over stasjoner sist ble endret. Returverdien
-er et tall som pr. nå er 1319145491. Mitt gjett er at dette er
-sekunder siden 1. januar 1970 som kan konverteres til en leselig dato
-med <tt>perl -e 'print scalar(localtime(1319145491)), "\n"'</tt>.
-Dagens verdi konverterer da til "Thu Oct 20 23:18:11 2011".
+<p><tt>GET http://www.bitfactory.no/Bensin/ver1.1.stasjonsDatabaseUpdateStamp</tt></p>
+
+<p>Vet ikke helt hva dette API-kallet gjør, men navnet gjør at jeg
+tror den rapporterer når listen over stasjoner sist ble endret.
+Returverdien er et tall som pr. nå er 1319145491. Mitt gjett er at
+dette er sekunder siden 1. januar 1970 som kan konverteres til en
+leselig dato med <tt>perl -e 'print scalar(localtime(1319145491)),
+"\n"'</tt>. Dagens verdi konverterer da til "Thu Oct 20 23:18:11
+2011".</p>
+
+<b>GetXMLDatabase</b>
+
+<p><tt>echo password=X43uP9KS_3ZqR | POST http://www.bitfactory.no/Bensin/GetXMLDatabase.php
+
+<p>Henter ned listen med stasjoner på XML-format. Argumentet er
+password som muligens følger med i programpakken og eventuelt
+genereres av app-en. Nedlasting med samme passord flere ganger ser
+ikke ut til å fungere. Selve listen ser slik ut (klippet):</p>
+
+<pre>
+<?xml version="1.0" encoding="UTF-8"?>
+<STASJONSDATABASE>
+<STASJON>
+<NAME></NAME>
+<ADDRESS></ADDRESS>
+<ID>0</ID>
+<LATITUDE>0.000000</LATITUDE>
+<LONGITUDE>0.000000</LONGITUDE>
+<COMPANY></COMPANY>
+</STASJON>
+<STASJON>
+<NAME>Statoil Best Eidsvoll Verk</NAME>
+<ADDRESS>Gamle Trondheimsvei 339 2074 Eidsvoll Verk</ADDRESS>
+<ID>1</ID>
+<LATITUDE>60.303902</LATITUDE>
+<LONGITUDE>11.168100</LONGITUDE>
+<COMPANY>Best</COMPANY>
+</STASJON>
+[...]
+<STASJON>
+<NAME>Esso Andenes</NAME>
+<ADDRESS>Falcksgate 9, 8480 Andenes</ADDRESS>
+<ID>1822</ID>
+<LATITUDE>69.320999</LATITUDE>
+<LONGITUDE>16.118700</LONGITUDE>
+<COMPANY>Esso</COMPANY>
+</STASJON>
+</STASJONSDATABASE>
+</pre>
<b>GetBanStatus</b>
-echo UDID=Android-123456789012345 | POST http://www.bitfactory.no/Bensin/ver1.1.GetBanStatus.php
+<p><tt>echo UDID=Android-123456789012345 | POST http://www.bitfactory.no/Bensin/ver1.1.GetBanStatus.php</tt></p>
-Vet ikke helt hva dette API-kallet gjør. Navnet gjør at jeg tror den
-rapporterer om telefonen med UDID oppgitt som argument er bannlyst fra
-tjenesten. Bannlysning gjør antagelig at telefonen ikke kan brukes
-til å registrere bensinpriser, men det er også mulig det blokkerer for
-å se på priser. Eneste POST-argument er UDID, som ser ut til å være
-den unike ID-en til en mobil-enhet. Returnverdi er 'NO' for alle
-UDID-verdier jeg har testet. Gjetter på at alternativ returverdi er
-'YES'.
+<p>Vet heller ikke helt hva dette API-kallet gjør. Navnet gjør at jeg
+tror den rapporterer om telefonen med UDID oppgitt som argument er
+bannlyst fra tjenesten. Bannlysning gjør antagelig at telefonen ikke
+kan brukes til å registrere bensinpriser, men det er også mulig det
+blokkerer for å se på priser. Eneste POST-argument er UDID, som ser
+ut til å være den unike ID-en til en mobil-enhet. Returnverdi er 'NO'
+for alle UDID-verdier jeg har testet. Gjetter på at alternativ
+returverdi er 'YES', men har ikke sett en slik verdi så langt.</p>
<b>PriserVedStasjoner</b>
-echo 'stasjoner=810,364&day=0' | POST http://www.bitfactory.no/Bensin/ver1.1.PriserVedStasjoner.php
+<p><tt>echo 'stasjoner=810,364&day=0' | POST http://www.bitfactory.no/Bensin/ver1.1.PriserVedStasjoner.php</tt></p>
-Dette kallet henter ut priser registrert på en eller flere
+<p>Dette kallet henter ut priser registrert på en eller flere
bensinstasjoner. Den tar to POST-argumenter, "stasjoner" som er
kommaseparert liste over stasjons-IDer (numeriske), og "day" som bør
settes til "0" for å få ut informasjon om priser. Usikker på hva
-tallet betyr.
+tallet betyr, men mistenker det har med hvor langt tilbake i tid det
+skal hentes ut informasjon.</p>
-Resultatet som kommer tilbake er en kommaseparert liste for hver
+<p>Resultatet som kommer tilbake er en kommaseparert liste for hver
enkelt stasjon, med <br> som skillemarkør mellom hver stasjon.
-Ikke helt sikker på hva alle feltene er. Her er mine gjett:
-
-Felt 1: Bensinstasjons-ID
-Felt 2: Antagelig en bensinpris, flyttall med punktum som desimalskille.
-Felt 3: Et klokkeslett, format HH:MM?
-Felt 4: Telefon-ID på formen Android-123456789012345 eller hex-kodet streng/MD5-sum
-Felt 5: tall, uviss betydning. muligens relatert til day-verdien.
-Felt 6: uviss betydning
-Felt 7: uviss betydning
-Felt 8: uviss betydning
-Felt 9: uviss betydning
-Felt 10: Samme som felt 2
-Felt 11: Samme som felt 3
-Felt 12: Samme som felt 4.
-Felt 13: tall, uviss betydning. Kanskje det samme som felt 5?
-
-Jeg mistenker det egentlig er bensinstasjons-ID og deretter tre
-blokker for bensin og/eller disel. Gjetter på at felt 6-9 er for
-disel og derfor ikke var registrert for de bensinstasjonene jeg har
-sjekket ut så langt.
+Ikke helt sikker på hva alle feltene er. Her er mine gjett:</p>
+
+<table>
+<tr><ht>Felt</ht><ht>Beskrivelse</ht></tr>
+<tr><td>1</td><td>Bensinstasjons-ID</td></tr>
+<tr><td>2</td><td>Pris for blyfri 95 oktan, flyttall med punktum som desimalskille.</td></tr>
+<tr><td>3</td><td>Klokkeslett da prisen ble oppdatert, format HH:MM. </td></tr>
+<tr><td>4</td><td>Telefon-ID på formen Android-123456789012345 eller hex-kodet streng/MD5-sum</td></tr>
+<tr><td>5</td><td>tall, uviss betydning. muligens relatert til day-verdien.</td></tr>
+<tr><td>6</td><td>Pris for blyfri 98-oktan?</td></tr>
+<tr><td>7</td><td>samme som felt 3</td></tr>
+<tr><td>8</td><td>samme som felt 4</td></tr>
+<tr><td>9</td><td>samme som felt 5</td></tr>
+<tr><td>10</td><td>Pris for disel</td></tr>
+<tr><td>11</td><td>Samme som felt 3</td></tr>
+<tr><td>12</td><td>Samme som felt 4</td></tr>
+<tr><td>13</td><td>Samme som felt 5</td></tr>
+</table>
+
+<p>En stasjonsoppføring består dermed av av bensinstasjons-ID og
+deretter tre blokker for 95-oktan bensin, 98-oktan bensin og
+disel.</p>
<b>PriserVedStasjon</b>
-echo 'id=736&day=0' | POST http://www.bitfactory.no/Bensin/ver1.1.PriserVedStasjon.php
+<p><tt>echo 'id=736&day=0' | POST http://www.bitfactory.no/Bensin/ver1.1.PriserVedStasjon.php</tt></p>
-Ser ut til å returnere informasjon for en enkelt bensinstasjon.
+<p>Ser ut til å returnere informasjon for en enkelt bensinstasjon.
Formatet er dato på formen "08_12_2011" for 2011-12-08, og noe som ser
-ut som samme format som fra PriserVedStasjoner.
-
-For stasjoner der intet er registrert returnerer den "NO RESULTS".
-
-08_12_2011,12.52,10:35,Android-358697040191281,2, , , , ,12.52,10:35,Android-358697040191281,2
+ut som samme format som fra PriserVedStasjoner. For stasjoner der
+intet er registrert returnerer den "NO RESULTS".</p>
<b>AllePriser</b>
-echo day=0 | POST http://www.bitfactory.no/Bensin/ver1.1.AllePriser.php
-
-Returnerer av og til "NO RESULTS". Ellers returnerer den en dato på
-formen "Thursday_08_12_2011" skilt med <br> og deretter en liste
-med stasjoner på samme format som PriserVedStasjoner.
+<p><tt>echo day=0 | POST http://www.bitfactory.no/Bensin/ver1.1.AllePriser.php</tt></p>
+
+<p>Returnere liste med av alle stasjoner det er registrert oppdaterte
+priser på siste 24 timer. Returnerer "NO RESULTS" når listen er tom.
+Ellers returnerer den en dato på formen "Thursday_08_12_2011" skilt
+med <br> og deretter en liste med stasjoner på samme format som
+PriserVedStasjoner.</p>
+
+<!--
+
+Ide til SQL-skjema for å ta vare på informasjonen.
+CREATE TABLE station (
+ integer id,
+ text name,
+ text group,
+ text address,
+ text homepageurl,
+ gpscoord location,
+);
+
+CREATE TABLE types (
+ INTEGER id,
+ INTEGER name,
+);
+
+CREATE TABLE pris (
+ INTEGER station_id REFERENCES station(id),
+ INTEGER type,
+ DATETIME when_collected,
+ FLOAT price,
+)
+
+INSERT INTO types (id, name) VALUES (1, 'Blyfri95');
+INSERT INTO types (id, name) VALUES (2, 'Disel');
+-->