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 中的问题。
我正在尝试实现一个机器人来发送主动消息。我在 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 中的问题。