aattola / tankille

Gas prices from Finland using reverse engineered api
1 stars 0 forks source link

JSON api #2

Open LassPar opened 1 month ago

LassPar commented 1 month ago

Is there any way to get any (JSON) data with HTTP GET reguest? I would like to get data from my area (Tampere) to NodeRed and make some home automations based on gas price.

aattola commented 1 month ago

Käytännössä vaatii oman käyttäjän ja aikaa tehdä oma. Valmista APIa joka ei vaatisi kirjautumista ei ole. Datan saaminen vaatii https://tankille.fi/ sovelluksn tilin.

import { Client } from '@jeffe/tankille'

const tankille = new Client()

async function getData () {
  await tankille.login({
    email,
    password
  })

   const data = await tankille.getStationsByLocation(
    {
      lat: 61.500, // nämä jostain esim. google mapsista. 
      lon: 23.800
    },
    15000 // metreinä
  )

}

Yllä oleva koodinpätkä hakee bensa-asemat 15km etäisyydellä tästä pisteestä.

Ja voihan sen itse implementoida myös.

POST https://api.tankille.fi/auth/login {"email": "sposti@orava.com", password: "salainen sana"}

POST https://api.tankille.fi/auth/refresh {"token": "token jonka sait auth/login routesta"}

GET https://api.tankille.fi/stations?location=LONGITUDE,LATITUDE&distance=15000

headereissa 'x-access-token':"auth/refresh/ saatu token"

LassPar commented 3 weeks ago

Itselleni ei typescript ole tuttua, niin yritän tuolla GET/POST komennoilla.

Sain tokenin, kun lisäsin "device": "Android SDK built for x86_64" parametrin headeriin.

Vastaus: refreshToken: "xxxx..."

Kun yritän tuota 2. kohtaa, auth/refresh vastauksena tulee: "message": "Unsupported client: update the app / päivitä sovellus"

Onko sulle tullut vastaan vastaava ja miten tuosta pääsisi yli?

aattola commented 3 weeks ago

Ilmeisesti siinä /auth/refresh kohdassa pitää myös lähettää headereissa User-Agent.

Itse käytän tätä: 'User-Agent': 'FuelFellow/3.6.2 (Android SDK built for x86_64; Android 9)',

On toiminut jo jonkin aikaa, en tiedä vaan kuinka pitkään.

LassPar commented 3 weeks ago

Yritin näillä tiedoilla:

POST https://api.tankille.fi/auth/login { "email":"<säpö>", "password":"", "User-Agent": "FuelFellow/3.7.1 (Android SDK built for x86_64; Android 9)", "device":"Android SDK built for x86_64 (03280ceb8a5367a6)" }

vastaus: { "refreshToken": "abcxxx..." }

POST https://api.tankille.fi/auth/refresh { "token":"abcxxx...", "User-Agent": "FuelFellow/3.6.2 (Android SDK built for x86_64; Android 9)", "device":"Android SDK built for x86_64 (03280ceb8a5367a6)" }

vastaus: { "code": 127, "message": "Unsupported client: update the app / päivitä sovellus." }

Kokeiltu myös FuelFellow/3.7.1, joka on ainakin itsellä kännykässä uusin versio, sama lopputulos.

aattola commented 3 weeks ago

Vastauksestasi päätellen niin vissiin laitat bodyyn tuon User-Agentin. Sen pitäisi mennä pyynnön header osioon.

Eli: POST api.tankille.fi/auth/refresh

pitää tehdä niin että body on

{
"token":"abcxxx...",
}

Ja seuraava on Headereissa "User-Agent": "FuelFellow/3.6.2 (Android SDK built for x86_64; Android 9)",

Tässä vielä demo javascriptillä:

const headerit = new Headers();
headerit.append("User-Agent", "FuelFellow/3.6.2 (Android SDK built for x86_64; Android 9)");
headerit.append("Content-Type", "application/json");

const body= JSON.stringify({
  "token": "<tokeni tähän>"
});

const requestOptions = {
  method: "POST",
  headers: headerit,
  body: body,
  redirect: "follow"
};

fetch("https://api.tankille.fi/auth/refresh", requestOptions)
  .then((response) => response.text())
  .then((result) => console.log(result))
  .catch((error) => console.error(error));

Curl komentona

curl --location 'https://api.tankille.fi/auth/refresh' \
--header 'User-Agent: FuelFellow/3.6.2 (Android SDK built for x86_64; Android 9)' \
--header 'Content-Type: application/json' \
--data '{"token": "<tokeni tähä>"}'