这是我的问题:
实际上来自后端,我想使用Yammer API,而不需要任何真正的用户操作。要做到这一点,首先我必须检索一个令牌。
要检索令牌,我必须登录。从后端端我使用com.meterware.httpunit pacakge发送http请求并接收响应。
所以我发出GET请求来检索yammer登录页面。然后,以编程方式填写并提交登录表单。
你可以在这里找到一个实现的例子:qazxsw poi
看起来像 :
Yammer-Java-SDK.
不幸的是,我所针对的Yammer项目被嵌入到Office365中。因此,当我提交原始的yammer登录表单时,我作为响应,Office365登录页面。它可以是正确的:检索office365表格,填写并提交它......但它不是!
借助JavaScript引擎构建office365登录表单。在普通的互联网浏览器中没有问题。但是当我在后端时,我从org.mozilla.rhino(v1.7.10)获得的Javascript引擎无法正确执行脚本...脚本未执行 - >表单不是内置 - >我无法发布 - >我无法检索令牌 - >我无法从我的服务器上发布yammer上的东西...... :(
我已经在我的HttpUnitOptions中启用了脚本:
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();
在那里,我从office365登录页面得到的错误:
引起:com.meterware.httpunit.ScriptException:Script'webpackJsonp([77],{“6Tns”:function(e,t,r){“use strict”; Object.defineProperty(t,“__ esModule”,{value :!0}); var i = function(){}; i.redirectPatterns = [“/ uploaded_files /”],i.prototype = {threadRegex:new RegExp(“threadId =([0-9A-Za-z]] + = {0,3})“,”i“),isForeignRegex:new RegExp(”foreign = true“,”i“),redirectIfNecessary:function(e){”“!== e.hash &&(this.isForeign (e)?this.redirectToForeign(e):this.redirectWithPatterns(e))},redirectWithPatterns:function(e){for(var t = i.redirectPatterns,r = 0,n = t.length; r1)}} ,t.default = i},8:function(e,t,r){e.exports = r(“vP7g”)},Jpbm:function(e,t,r){“use strict”; Object.defineProperty (t,“_ _ esModule”,{value:!0}); var i = function(){}; i.prototype = {redirectIfNecessary:function(e){window.top!= window && window.top.location.replace(e .href)}},t.default = i},vP7g:function(e,t,r){“use strict”; var i = o(r(“Jpbm”)),n = o(r(“6Tns “));函数o(e){return e && e .__ esModule?e:{default:e}}(new i.default).redirectIfNecessary(window.location),(new n.defaul吨).redirectIfNecessary(window.location的)}},[8]);”失败:org.mozilla.javascript.EcmaError:TypeError:不可能的dappelerlaméthode“{1}”de {0}
这里是捕获和重新抛出根异常的函数:
来自:com.meterware.httpunit.javascript.ScriptingEngineImpl
HttpUnitOptions.setScriptingEnabled(true);
Context对象来自:org.mozilla.javascript.Context,这里是它的javadoc:
此类表示正在执行的脚本的运行时上下文。在执行脚本之前,必须创建Context实例并将其与将要执行脚本的线程相关联。 Context将用于存储有关脚本执行的信息,例如调用堆栈。使用调用(ContextAction)或enter()方法将上下文与当前线程相关联。
支持不同形式的脚本执行。脚本可以直接从源代码进行评估,也可以先编译然后再执行。还支持交互式执行。
脚本执行的某些方面,例如类型转换和对象创建,可以通过Context的方法直接访问。
在后端方面,我试图模拟office365登录页面发出的帖子请求,但到目前为止......太糟糕了......
我真的需要你的帮助。我想解决这3个陈述中的至少一个:
先谢谢你,Stephane
Yammer访问令牌是“长期存在的”,除非明确撤销,否则不会过期。 (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();
}
}
)。这意味着您只需存储一个访问令牌,并将其用于API。
当您查看应用程序的注册页面时,您应该能够在其中一个设置页面上生成开发人员令牌。用那个。
有关如何在后端上下文中使用Yammer API的示例,请查看:link, see section C