1

这是我的问题:

完全从后端,我想使用 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一个

提前谢谢你,斯蒂芬

4

1 回答 1

1

Yammer 访问令牌是“长期存在的”,除非明确撤销,否则不会过期。(链接,见 C 部分)。这意味着您可以简单地存储一个访问令牌并将其用于 API。

当您查看应用程序的注册页面时,您应该能够在其中一个设置页面上生成开发人员令牌。用那个。

有关我如何在后端上下文中使用 Yammer API 的示例,请查看:https ://derekgusoff.wordpress.com/2017/10/31/create-a-yammer-group-with-microsoft-flow /

于 2018-12-26T18:12:30.333 回答