Отправка формы входа OWA из Java

Меня интересует способ программного входа в OWA (Microsoft Outlook Web Access - почтовый веб-клиент) из кода Java и получения не более, чем счетчика непрочитанных входящих сообщений - я могу прочитать это число из источника HTML веб-страницы входящих сообщений - но проблема в том, чтобы попасть туда - войти в систему.

По сути, просматривая исходный код HTML страницы входа в OWA, я вижу, что существует элемент формы HTML:

<form action="owaauth.dll" method="POST" name="logonForm" autocomplete="off"> 

который отправляется элементом кнопки внутри него:

<input type="submit" class="btn" value="Log On" onclick="clkLgn()"> 

Из исследования сценария clkLgn() я обнаружил, что он отправляет файл cookie в документ, поэтому он может не иметь решающего значения:

function clkLgn()
{
    if(gbid("rdoPrvt").checked)
    {
        var oD=new Date();
        oD.setTime(oD.getTime()+2*7*24*60*60*1000);
        var sA="acc="+(gbid("chkBsc").checked?1:0);
        var sL="lgn="+gbid("username").value;
        document.cookie="logondata="+sA+"&"+sL+";expires="+oD.toUTCString();
    }
}

Как я могу отправить эту форму? Следующий код - моя попытка решить проблему, я могу установить HTTP-соединение, но, похоже, я не могу выставить правильный HTTP-запрос.

                URL urlObject = new URL(url);

                HttpURLConnection hConnection = (HttpURLConnection)urlObject.openConnection();
                HttpURLConnection.setFollowRedirects(true);
                hConnection.setDoOutput(true);
                hConnection.setRequestMethod("POST");

                PrintStream ps = new PrintStream(hConnection.getOutputStream());

                ps.print("username="+username+"&amp;password="+password);
                ps.close();


                hConnection.connect();

                if( HttpURLConnection.HTTP_OK == hConnection.getResponseCode() )
                {
                    InputStream is = hConnection.getInputStream();
                    OutputStream os = new FileOutputStream("output.html");
                    int data;
                    while((data=is.read()) != -1)
                    {
                      os.write(data);
                    }
                    is.close();
                    os.close();
                    hConnection.disconnect();
                }

Он просто продолжает возвращать ту же HTML-страницу входа в систему.

2 ответа

Решение

Этот JavaScript, безусловно, делает важную вещь: он добавляет cookie в документ. Достойный HTTP-клиент должен отправлять все допустимые куки-файлы по заголовкам при каждом HTTP-запросе. Вы должны сделать то же самое программно. Вы можете добавить заголовки, используя URLConnection#setRequestProperty(),

Кроме того, есть несколько вещей, которые необходимо учитывать при программной отправке форм: не следует пропускать скрытые поля ввода (input type="hidden"), они могут быть актуальны. Вы также должны отправить name=value пару кнопок отправки, которые вы хотите программно нажимать в качестве параметра запроса. Наконец, вы не должны использовать &amp; объединить пары параметров, но &,

Обратите внимание, что я не гарантирую, что это, наконец, сработает, что в OWA может быть какое-то другое предотвращение от ботов, но это должно решить как можно более серьезные проблемы.

Смотрите также:


Кстати, вы не задумывались о том, чтобы просто подключить его с помощью SMTP/IMAP API, такого как JavaMail?

Зачем проходить форму? MS недавно открыла исходный код клиента Java для своего API сервера Exchange.

http://blogs.office.com/2014/08/28/open-sourcing-exchange-web-services-ews-java-api/

https://github.com/OfficeDev/ews-java-api

Другие вопросы по тегам