Загрузите zip-файл из URI с аутентификацией и навигацией по нескольким промежуточным URL - PullRequest
0 голосов
/ 13 мая 2019

с нулевым опытом написания кода для доступа к URL, ниже приведена моя попытка решить мою проблему, поэтому, пожалуйста, потерпите меня.Чтобы объяснить сценарий - я пытаюсь автоматизировать процесс загрузки zip-файла с веб-сайта Всемирной организации здравоохранения.Путь к этому файлу следующий:

  1. Необходимо войти через страницу входа в microsoftonline
  2. После входа вы попадете на страницу пользовательской области
  3. Отздесь мне нужно перейти на страницу области загрузки, где находится файл

Вот попытка кода:

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.URL;

public class WHODataDownload{


    public static void main(String[] args) {

        // Install Authenticator
        MyAuthenticator.setPasswordAuthentication("username", "password");
        Authenticator.setDefault (new MyAuthenticator ());

        try {

            String url = "https://login.microsoftonline.com/whoumcprod.onmicrosoft.com/oauth2/authorize?client_id=bb2a2e3a-c5e7-4f0a-88e0-8e01fd3fc1f4&redirect_uri=https%3a%2f%2flogin.microsoftonline.com%2fte%2fwhoumcprod.onmicrosoft.com%2foauth2%2fauthresp&response_type=id_token&scope=email+openid&response_mode=query&nonce=2rEvxJKKHe4qFrsr%2feJh4g%3d%3d&nux=1&nca=1&domain_hint=whoumcprod.onmicrosoft.com&mkt=en-US&lc=1033&state=StateProperties%3deyJTSUQiOiJ4LW1zLWNwaW0tcmM6YWNjMzk4YzctZTdiNy00MTM0LWFjNDktMjgyZDg4NDJiOTc1IiwiVElEIjoiMWMwYTNjOTgtODY1Ny00YTEzLTlmMWMtNjMyYTE3MDc4YjJjIn0";

            URL obj = new URL(url);
            HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
            conn.setReadTimeout(5000);
            conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
            conn.addRequestProperty("User-Agent", "Mozilla");
            conn.addRequestProperty("Referer", "google.com");

            System.out.println("Request URL ... " + url);
            String cookies = conn.getHeaderField("Set-Cookie");

            // open the new connnection again
            URL newUrl = new URL ("https://www.who-umc.org/user-area/vigibase-extract-case-level/");
            conn = (HttpURLConnection) newUrl.openConnection();
            conn.setRequestProperty("Cookie", cookies);
            conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
            conn.addRequestProperty("User-Agent", "Chrome");
            conn.addRequestProperty("Referer", "google.com");

            URL downloadUrl = new URL("https://downloadarea.who-umc.org/download/product?id=1254");
            HttpURLConnection connection = (HttpURLConnection) downloadUrl.openConnection();
            connection.setRequestMethod("GET");
            InputStream in = connection.getInputStream();
            FileOutputStream out = new FileOutputStream("download.zip");
            copy(in, out, 1024);
            out.close();

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

public static void copy(InputStream input, OutputStream output, int bufferSize) throws IOException {
                byte[] buf = new byte[bufferSize];
                int n = input.read(buf);
                while (n >= 0) {
                  output.write(buf, 0, n);
                  n = input.read(buf);
                }
                output.flush();
              }


            }

Вот код аутентификатора:

import java.net.Authenticator;
import java.net.PasswordAuthentication;

public class MyAuthenticator extends Authenticator {  
    private static String username = "";
    private static String password = "";

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication (MyAuthenticator.username, 
                MyAuthenticator.password.toCharArray());
    }

    public static void setPasswordAuthentication(String username, String password) {
        MyAuthenticator.username = username;
        MyAuthenticator.password = password;
    }
}
...