我正在使用 C# 和 Bot Framework SDK4,需要从与我的机器人的 1:1 聊天中获取用户电子邮件。是否可以?我能得到的似乎只有身份证和全名。
我已经尝试了此处列出的内容https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/bots/bots-context ,但 teamContext 只是返回 null。
ITeamsContext teamsContext = turnContext.TurnState.Get<ITeamsContext>();
string incomingTeamId = teamsContext.Team.Id;
string incomingChannelid = teamsContext.Channel.Id;
string incomingTenantId = teamsContext.Tenant.Id;
Run Code Online (Sandbox Code Playgroud)
那么是否有可能从与机器人聊天的当前用户那里获取用户电子邮件?
查看 Azure 门户中可能的连接提供程序,我确定我的用例需要“OAuth 2 通用提供程序”(而不是“通用 OAuth 2”提供程序)。但是,我似乎找不到任何有关模板应如何工作或将哪些变量传递给模板的文档。
我正在尝试设置与 Azure DevOps 的连接。首先,我尝试使用“Generic OAuth 2”提供程序,测试流程正常运行,直到 botframework 的令牌服务收到来自 Azure DevOps 的授权代码。它会将我重定向到“错误请求”页面。我可以从重定向的 URL 中获取授权代码,并按照 Azure DevOps 文档的描述构建令牌调用,并且它可以正常工作,所以我猜测这是 botframework 的令牌服务如何调用 Azure DevOps 的问题,因此我需要使用“OAuth 2 通用提供程序”,因为它允许我指定令牌服务如何调用 Azure DevOps。
理想情况下,这将添加到文档中的某个位置,或者更好的是作为 Azure 门户页面上的提示。
编辑:添加了页面的屏幕截图。您在该表单的“模板”字段中放置了什么?
我在 javascript 中生成一个 python 子进程(用于使用 Microsoft Botframework 编写 Bot),如下所示:
async function searchForRelevantDoc (context) {
var msg = context.activity.text;
var spawn = require('child_process').spawn,
py = spawn('python', ['../path/to/file.py', msg]),
output = '';
py.stdin.setEncoding = 'utf-8';
py.stdout.on('data',
(data) => {
output += data.toString();
console.log('output was generated: ' + output);
});
// Handle error output
py.stderr.on('data', (data) => {
// As said before, convert the Uint8Array to a readable string.
console.log('error:' + data);
});
py.stdout.on('end', async function(code){
console.log('output: ' + output);
console.log(`Exit code is: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Microsoft Azure Web 应用程序机器人设计为 QnA 机器人创建一个聊天机器人(使用 QnA 制造商作为知识库)。我找到了如何在代码中重写默认响应消息“常见问题解答中没有很好的匹配”。这不可能吗以类似的方式重写代码中某处的“您好和欢迎”默认消息?这就是我更改代码中“常见问题解答中没有良好匹配”默认消息的方法
System.AggregateException:“无法获取客户端凭据的令牌。(参数:连接字符串:RunAs=App;AppId=bc107559-ff62-4f67-8dd4-0dce6a0fe426,资源: https: //api.botframework.com,权限:。异常消息:尝试使用托管服务身份获取令牌。无法连接到实例元数据服务 (IMDS)。跳过对托管服务身份 (MSI) 令牌端点的请求。)'
内部异常:AzureServiceTokenProviderException:参数:连接字符串:RunAs=App;AppId=bc107559-ff62-4f67-8dd4-0dce6a0fe426,资源: https: //api.botframework.com,权限:。异常消息:尝试使用托管服务身份获取令牌。无法连接到实例元数据服务 (IMDS)。跳过对托管服务身份 (MSI) 令牌端点的请求。
当尝试向用户发送消息或获取用户详细信息时,会引发上述异常:
var messageText ="What can I help you with today?\nSay something like \"Book a flight from Paris to Berlin on March 22, 2020\"";
var promptMessage = MessageFactory.Text(messageText, messageText, InputHints.ExpectingInput);
return await stepContext.PromptAsync(nameof(TextPrompt), new PromptOptions { Prompt = promptMessage }, cancellationToken);
Run Code Online (Sandbox Code Playgroud)
异常在第三行抛出,即尝试向用户发送提示消息时
当我使用Call方法时,我的对话框确实已加载,但是,从模拟器我首先收到来自机器人的空消息,只有在我发送到机器人的下一条消息时才进入对话框对话.有什么想法会发生这种情况吗?
context.Call<MyDialog>(new FormDialog<MyDialog>(new MyDialog()), Afterwards);
Run Code Online (Sandbox Code Playgroud)
我打电话后,我想直接进入对话 context.Call
我正在使用MS bot框架并构建一个对话框表单.对于用户可用的选项,我使用枚举和此代码来构建表单:
return new FormBuilder<InsuranceDialogForm>()
.Message("Sure, I will need to ask you a couple of questions first.")
.Build();
Run Code Online (Sandbox Code Playgroud)
我的枚举看起来像这样:
public class InsuranceDialogForm
{
//[Prompt("Are you our customer?")]
//Disabled prompt because otherwise choice buttons won't appear
public IsCurrentCustomer IsCurrentCustomer;
//[Prompt("Which type of insurance do you need?")]
public InsuranceType InsuranceType;
//[Prompt("Which country are you travelling to?")]
public string TravelDestination;
//[Prompt("Please select one:")]
public InsurancePackage InsurancePackage;
}
public enum IsCurrentCustomer
{
Yes, No
}
public enum InsuranceType
{
Travel, Vehicle, Life
}
public …Run Code Online (Sandbox Code Playgroud) 我正在写一个可以说两种语言的机器人.因此,我需要使用两个单独的LUIS应用程序(每种语言一个).
Bot框架中的LuisDialog像这样初始化(来自Microsoft的例子):
[LuisModel("c413b2ef-382c-45bd-8ff0-f76d60e2a821", "6d0966209c6e4f6b835ce34492f3e6d9")]
[Serializable]
public class SimpleAlarmDialog : LuisDialog<object>
{
Run Code Online (Sandbox Code Playgroud)
但是,我需要使用动态应用程序ID和订阅密钥,具体取决于我确定的用户的语言.
两个LUIS应用程序中的所有方法,意图等都是相同的.
C#中的属性不能是动态的.
我可以将app和订阅密钥动态传递给LuisDialog而不是硬编码的另一种方法是什么?
我上周开始学习bot框架,我决定从默认的bot项目开始,它返回你的输入和它的字符数.但不幸的是,我无法在bot模拟器中测试bot应用程序.它不能只发送我的输入.每当我转发输入时,它都会显示"无法发送".我的端点url是http:// localhost:3979/api/messages /正确写在那里.可能有什么不对?我只是机器人框架和机器人构建的先驱.
我们正在更新我们的MBF机器人,以便在Azure Table Store中管理其状态.我们根据文档更改了代码以注册我们的表存储提供程序:
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
var builder = new ContainerBuilder();
var store = new TableBotDataStore("...");
builder.Register(c => store)
.Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
.AsSelf()
.SingleInstance();
builder.Register(c => new CachingBotDataStore(store,
CachingBotDataStoreConsistencyPolicy
.ETagBasedConsistency))
.As<IBotDataStore<BotData>>()
.AsSelf()
.InstancePerLifetimeScope();
var config = GlobalConfiguration.Configuration;
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
Run Code Online (Sandbox Code Playgroud)
现在,在对话框中我们使用以下来存储和加载用户数据:
context.PrivateConversationData.SetValue<UserData>(UserDataRepositoryKey, userData);
Run Code Online (Sandbox Code Playgroud)
有趣的是,对话状态似乎得到维护,但我们看不到任何东西是我们的Azure表,我真的怀疑任何调用是否进入该存储.关于如何以正确的方式使用状态,文档非常不清楚.
题:
我们的容器注册是否正确?它应该在app_start还是应该为每个请求注册?
我们在对话期间使用正确的方法存储状态吗?
botframework ×10
c# ×6
azure ×3
.net ×1
azure-language-understanding ×1
emulation ×1
enums ×1
javascript ×1
ngrok ×1
node.js ×1
oauth-2.0 ×1
python ×1