Java Bot SDK 为主动消息抛出 401 错误

Java Bot SDK throws 401 error for proactive message

我正在尝试实现一个机器人来发送主动消息。我在 NodeJS 中做了一个有效的概念验证:

const { BotFrameworkAdapter } = require('botbuilder');

const adapter = new BotFrameworkAdapter({
    appId: process.env.MicrosoftAppId,
    appPassword: process.env.MicrosoftAppPassword
});

adapter.onTurnError = async (error) => {
    console.error(error);
};

const cr = require('./test_cr.json');

adapter.continueConversation(cr, async (turnContext) => {
  await turnContext.sendActivity('Node SDK proactive message')
});

然而,当我尝试使用 Java SDK 重新创建此示例时,我得到 com.microsoft.bot.connector.rest.ErrorResponseException: Status code 401, {"message":"Authorization has been denied for this request."}

String appId = System.getenv("MicrosoftAppId");
String appPassword = System.getenv("MicrosoftAppPassword");

BotFrameworkAdapter bot = new BotFrameworkAdapter(new SimpleCredentialProvider(appId, appPassword));
ConversationReference cr = mapper.readValue(new File("test_cr.json"), ConversationReference.class);
CompletableFuture<Void> cf = bot.continueConversation(appId, cr, turnContext -> turnContext.sendActivity("Java SDK proactive message").thenApply(resourceResponse -> null));
cf.get();

两个示例的对话参考和应用凭据应该相同。我没有正确设置 Java 机器人吗?作为参考,我使用了一个非常准系统的对话参考:

{
  "channelId":"msteams",
  "serviceUrl":"https://smba.trafficmanager.net/amer/",
  "conversation":{
    "isGroup":true,
    "conversationType":"channel",
    "tenantId":"xxxxxx",
    "id":"xxxxxx"
  }
}

听起来这可能是 BotTrustServiceUrl 的问题。我无法解释,但在我的一个机器人中,我不得不添加这个额外的代码以使主动消息工作(特别是在重启后)。不确定这是否与您的问题相同,但对我有所帮助。

const { MicrosoftAppCredentials } = require('botframework-connector');

// Then in your proactive message section...

        const conversationReference = req.body.conversationReference;
        await adapter.continueConversation(conversationReference, async turnContext => {
            // If you encounter permission-related errors when sending this message, see
            // https://aka.ms/BotTrustServiceUrl

            MicrosoftAppCredentials.trustServiceUrl(conversationReference.serviceUrl);
            await turnContext.sendActivity(req.body.message);
        });

现在我还有另外两个不需要执行此操作的机器人。没有这个代码就不能工作的是使用旧的 SDK,所以可能是它,否则主动消息功能是相同的,所以我不确定。

编辑:我误读了问题,没有注意到您在使用 Java SDK 而不是 JavaScript SDK 时遇到了问题。但也许您可以使用相同的方法来查看这是否也解决了您在 Java 中的问题。