HyvelTjuven
HyvelTjuven

Reputation: 41

Java: Logging in to a website using Jsoup

First let me point out that I'm very new to programming so if I'm missing something obvious, I'm sorry.

I'm trying to write a program that lets you log in to this website but I'm having trouble figuring out how to input my own strings to the email and password fields. I'm also not quite sure on how to check if the login went through or not...

This is my code so far:

public static void main(String[] args) throws Exception {
    String loginURL = "https://www.skanetrafiken.se/inloggning?ReturnUrl=%2fmitt-konto%2fse-saldo-och-ladda-kort%2f"; // URL of the login page
    String accountURL = "https://www.skanetrafiken.se/mitt-konto/se-saldo-och-ladda-kort/"; // The URL you get to after successfully logging in

    Document res = Jsoup
            .connect(loginURL)
            .data("loginInputModel.Email", "[email protected]") //Not sure if these are the correct values to be changed or if this even changes them
            .data("loginInputModel.Password", "myPassword")
            .post();

    System.out.println(res); // What should be printed to check to see if it worked?
}

It's similar to a lot of the examples I've seen but it doesn't seem to work...

Upvotes: 4

Views: 656

Answers (1)

Mike Shauneu
Mike Shauneu

Reputation: 3289

For a site that supports HTTP basic access authentication you can access any page by sending the Authorization header in a request. Your site supports it and code could be following to access account page:

import java.io.IOException;
import java.util.Map;

import org.jsoup.Connection.Method;
import org.jsoup.Connection.Response;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class Test {

    public static void main(String[] args) throws IOException {

        // We need run initial request to obtain RequestVerificationToken
        String initialURL = "https://www.skanetrafiken.se/inloggning";
        Document doc = Jsoup
                .connect(initialURL)
                .get();

        String requestVerificationToken = doc.select("input[name=__RequestVerificationToken]").get(0).val();

        // Do login (all headers and more  important all  form fields should be populated)
        String loginURL = "https://www.skanetrafiken.se/inloggning/LoginPost/";
        Response res = Jsoup.connect(loginURL)
                .header("Accept", "*/*")
                .header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
                .header("Origin", "https://www.skanetrafiken.se")
                .header("X-Requested-With", "XMLHttpRequest")
                .header("Referer", "https://www.skanetrafiken.se/inloggning")
                .data("__RequestVerificationToken", requestVerificationToken)
                .data("loginInputModel.ReturnUrl", "")
                .data("loginInputModel.Role", "Private")
                .data("loginInputModel.Email", "<email>")
                .data("loginInputModel.Password", "<password>")
                .data("X-Requested-With", "XMLHttpRequest")
                .userAgent("Mozilla/5.0")
                .ignoreContentType(true)
                .method(Method.POST)
                .execute();

        // Keep logged in (store cookies for next calls)
        Map<String, String> cookies = res.cookies();

        // Request a desired page
        String accountURL = "https://www.skanetrafiken.se/mitt-konto/se-saldo-och-ladda-kort/";
        Document doc2 = Jsoup
                .connect(accountURL)
                .cookies(cookies)
                .get();

        // Work with the doc
        System.out.println(doc2);
    }
}

Upvotes: 2

Related Questions