这是我的问题:
完全从后端,我想使用 Yammer API,而不需要任何真正的用户操作。为此,首先我必须检索一个令牌。
要检索令牌,我必须登录。从后端我使用com.meterware.httpunit pacakge发送 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 引擎构建的。在普通的互联网浏览器中没有问题。但是当我在后端时,我从 org.mozilla.rhino (v1.7.10) 获得的 Javascript 引擎无法正确执行脚本......脚本没有执行 -> 表单没有已构建-> 我无法发布它-> 我无法检索令牌-> 我无法从我的服务器在 yammer 上发布内容... :(
当然,我已经在我的 HttpUnitOptions 中启用了脚本:
HttpUnitOptions.setScriptingEnabled(true);
在那里,我从 office365 登录页面得到的错误:
原型={redirectIfNecessary:function(e){window.top!=window&&window.top.location.replace(e.href)}},t.default=i},vP7g:function(e,t,r){"使用strict";var i=o(r("Jpbm")),n=o(r("6Tns"));function o(e){return e&&e.__esModule?e:{default:e}}(new i .default).redirectIfNecessary(window.location),(new n.default).redirectIfNecessary(window.location)}},[8]);' 失败:org.mozilla.javascript.EcmaError: TypeError: Impossible dappeler la method "{1}" de {0} 默认).redirectIfNecessary(window.location)}},[8]);' 失败:org.mozilla.javascript.EcmaError: TypeError: Impossible dappeler la method "{1}" de {0} 默认).redirectIfNecessary(window.location)}},[8]);' 失败:org.mozilla.javascript.EcmaError: TypeError: Impossible dappeler la method "{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登录页面发出的post请求,但到目前为止......太糟糕了......
我真的需要你的帮助。我想至少解决这三个陈述中的一个:
- 使javascripting工作或:
- 正确模拟从 office365 登录页面发出的请求或:
- 完全绕过office365登录,只使用yammer一个
提前谢谢你,斯蒂芬