вот моя проблема:
С самого начала я хочу использовать API Yammer без каких-либо реальных действий пользователя. Для этого прежде всего мне нужно получить токен.
Для получения токена мне необходимо авторизоваться. Со стороны сервера я использую pacakge com.meterware.httpunit для отправки http-запросов и получения ответов.
Итак, я отправляю запрос GET для получения страницы входа в систему yammer.
Затем программно заполняю и отправляю форму авторизации.
Пример реализации можно найти здесь: Yammer-Java-SDK.
Похоже:
WebResponse resp = wc.getResponse(String.format(OAUTH_GET_ACCESS_TOKEN_URL, applicationKey));
// Retrieve, fill and submit Yammer login form
WebForm form = findLoginForm(resp.getForms());
form.setParameter("login", username);
form.setParameter("password", password);
resp = form.submit();
К сожалению, проект Yammer, на который я нацеливаюсь, вставлен в Office365. Поэтому, когда я отправляю исходную форму входа в систему yammer, в качестве ответа у меня появляется страница входа в Office365. Все могло быть в порядке: получить форму office365, заполнить и отправить ее ... но это не так!
Форма входа в office365 создается благодаря движку JavaScript. В обычном интернет-браузере проблем нет. Но когда я на стороне сервера, движок Javascript, который есть у меня из org.mozilla.rhino (v1.7.10), не может правильно выполнить скрипт ... Скрипт не выполняется -> форма не встроенный -> я не могу опубликовать его -> я не могу получить токен-> я не могу опубликовать что-либо на yammer с моего сервера ...: (
Конечно, я включил сценарии в свои HttpUnitOptions:
HttpUnitOptions.setScriptingEnabled(true);
И вот, ошибка, которую я получил со страницы входа в office365:
Вызывается: com.meterware.httpunit.ScriptException: Script
«WebpackJsonp ([77], { "6Tns": функция (е, т, г) {" Использование
строгий "; Object.defineProperty (т," __ esModule», {значение: 0}); вар
я = функция () {}; i.redirectPatterns = [ "/ uploaded_files /"], i.prototype = {threadRegex: новый
RegExp ( "ThreadId = ([0-9A-Za-Z] + = {0,3})", "я"), isForeignRegex: новый
RegExp ( "иностранный = истина", "я"), redirectIfNecessary: функция (е) { "" == e.hash && (this.isForeign (е) this.redirectToForeign (е): this.redirectWithPatterns (е)) }, redirectWithPatterns: функция (е) {для (вар
т = i.redirectPatterns, г = 0, п = t.length; г1)}}, t.default = я}, 8: функция (е, т, г) {e.exports = г ( "vP7g")} , Jpbm: функция (е, т, г) { "использование
строгий "; Object.defineProperty (т," __ esModule», {значение: 0}); вар
я = функция () {}; i.prototype = {redirectIfNecessary: функция (е) {window.top = окно && window.top.location.replace (e.href)}}, t.default = я}, vP7g: функция (е, т, г) { "использование
строгий "; var i = o (r (" Jpbm ")), n = o (r (" 6Tns ")); функция o (e) {return
е && е .__ esModule е: {по умолчанию: е}} (новый
i.default) .redirectIfNecessary (window.location), (новый
n.default) .redirectIfNecessary (window.location)}}, [8]);» не удалось:
org.mozilla.javascript.EcmaError: TypeError: Невозможная ошибка
метод "{1}" de {0}
Вот функция, где корневое исключение перехватывается и перебрасывается:
из: com.meterware.httpunit.javascript.ScriptingEngineImpl
public String runScript( String language, String script ) {
if (!supportsScriptLanguage( language )) return "";
try {
script = script.trim();
if (script.startsWith( "<!--" )) {
script = withoutFirstLine( script );
if (script.endsWith( "-->" )) script = script.substring( 0, script.lastIndexOf( "-->" ));
}
Context context = Context.enter();
context.initStandardObjects( null );
context.evaluateString( this, script, "httpunit", 0, null );
return getDocumentWriteBuffer();
} catch (Exception e) {
handleScriptException( e, "Script '" + script + "'" );
return "";
} finally {
discardDocumentWriteBuffer();
Context.exit();
}
}
Объект Context происходит от: org.mozilla.javascript.Context , и вот его javadoc:
Этот класс представляет контекст выполнения исполняемого скрипта.
Перед выполнением сценария необходимо создать экземпляр Context и
связан с потоком, который будет выполнять скрипт.
Контекст будет использоваться для хранения информации о выполнении
скрипт, такой как стек вызовов. Контексты связаны с
текущий поток, использующий методы call (ContextAction) или enter ().
Поддерживаются разные формы выполнения скрипта. Скрипты могут быть
оценивается непосредственно из источника или сначала компилируется, а затем позже
казнены. Также поддерживается интерактивное выполнение.
Некоторые аспекты выполнения скрипта, такие как преобразование типов и объект
создание, могут быть доступны напрямую через методы Context.
В серверной части я попытался смоделировать почтовый запрос, который отправляет страница входа в office365, но пока ... так плохо ...
Мне действительно нужна твоя помощь.Я хотел бы решить хотя бы одно из этих 3 утверждений:
- Сделать работу javascripting или:
- Правильно смоделировать запрос, отправленный со страницы входа в office365 или:
- Чтобы полностью обойти регистрацию в office365 и использовать только yammer один
Заранее спасибо, Стефан