jonahwh / tesla-api-client

Tesla API docs and Java client
18 stars 10 forks source link

Help Getting Started #3

Closed nlogozzo closed 4 years ago

nlogozzo commented 5 years ago

I was able to add this api to my java project however, i'm unable to figure out how to authenticate a Tesla user account with an email and password to be able to get a vehicle and start doing some commands on the vehicle. Most Tesla apis have a getting started or usage section and this one does not. Can someone provide me with example code on how to use this api?

jonahwh commented 4 years ago

Hi @nlogozzo

Sorry for the late reply, I didn't have notifications on for this repo 😢. This is untested, but should get you in the right direction. I'll add it to the README too.

import com.github.jonahwh.ApiClient;
import com.github.jonahwh.tesla_api_client.AuthenticationApi;
import com.github.jonahwh.tesla_api_client.VehicleCommandsApi;
import com.github.jonahwh.tesla_api_client.VehiclesApi;
import com.github.jonahwh.tesla_api_client.model.CreateAccessTokenRequest;
import com.github.jonahwh.tesla_api_client.model.CreateAccessTokenResponse;
import com.github.jonahwh.tesla_api_client.model.GetVehiclesResponse;

import org.jetbrains.annotations.NotNull;

import java.io.IOException;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

class Scratch {
    public static void main(String[] args) throws IOException {
        // Anonymous API Client for Authentication
        ApiClient anonymousApiClient = new ApiClient();
        anonymousApiClient.createDefaultAdapter();
        anonymousApiClient.configureFromOkclient(new OkHttpClient.Builder().build());

        // Authenticated API Client
        ApiClient authedApiClient = new ApiClient();
        authedApiClient.createDefaultAdapter();
        authedApiClient.configureFromOkclient(
                new OkHttpClient.Builder().addInterceptor(new AuthenticationInterceptor()).build()
        );

        AuthenticationApi authApi = anonymousApiClient.createService(AuthenticationApi.class);
        VehiclesApi vehiclesApi = authedApiClient.createService(VehiclesApi.class);
        VehicleCommandsApi commandsApi = authedApiClient.createService(VehicleCommandsApi.class);

        // TESLA_CLIENT_ID and TESLA_CLIENT_SECRET are available here: https://pastebin.com/YiLPDggh
        CreateAccessTokenRequest request = new CreateAccessTokenRequest()
                .grantType("password") // Do not change
                .clientId("TESLA_CLIENT_ID")
                .clientSecret("TESLA_CLIENT_SECRET")
                .email("email@example.com") // Tesla API User's email
                .password("password123"); // Tesla API User's password

        CreateAccessTokenResponse body = authApi.createOauthToken(request).execute().body();
        if (body != null) {
            // Tesla API Access Token for this account. You'll need to make this available to the
            // AuthenticationInterceptor
            String accessToken = body.getAccessToken();

            // Get the list of vehicles in the user's account
            GetVehiclesResponse vehicles = vehiclesApi.getVehicles().execute().body();
            if (vehicles != null) {
                // Get the ID of the first vehicle in the user's account.
                String vehicleId = vehicles.getResponse().get(0).getVehicleId();

                // Flash that vehicle's headlights
                commandsApi.flashLights(vehicleId);
            }
        }

    }
}

class AuthenticationInterceptor implements Interceptor {
    @NotNull
    @Override
    public Response intercept(@NotNull Chain chain) {
        Request.Builder builder = chain.request().newBuilder();

        // TODO: Get accessToken from CreateAccessTokenResponse here
        String accessToken = "";

        builder.addHeader("Authorization", String.format("Bearer %s", accessToken));
    }
}