关于如何从与会者和机器人之间的对话中获取此 ID 的任何想法?
Any idea on how to get this id from the conversation between attendee and bot?
上下文:
BotFramework (C# SDK) + Messenger 通道,机器人处理两种类型的用户:与会者(Messenger 用户)和组织者(Facebook 页面的管理员)。
用例:
当与会者请求人工支持(使用我的机器人菜单中的选项)时,组织者将收到一条消息。
在那条消息中,我想添加一个按钮,组织者点击后将执行以下操作:
- 停止自动回复该用户
- 将组织者重定向到 Facebook 的页面收件箱,并选择对话(与会者和机器人之间)
我做了什么:
我成功完成了停止自动回复的部分
我卡住了如何将组织者重定向到 FB 页面收件箱中的正确对话
技术上:
当我查看 Facebook 页面时,link 似乎是我应该为我的操作生成的,如下所示:https://www.facebook.com/mypage-mypageId/inbox/?selected_item_id=someId
我的问题是我无法从我的机器人对话中找到 selected_item_id
的这个值。
由于 Facebook Graph API。
,您将能够 link 进入 Facebook 页面收件箱(使用正确的线程)
必须调用 /me/conversations
才能获取页面的对话(因此您必须将页面的 access_token 提供给 API 调用)。
然后在这些结果中,您必须与与会者的对话进行匹配。为此,您可以在机器人中使用 Activity 的 属性 id
(Activity.Id,而不是 Activity.Conversation.Id!) 因为这个值在你的机器人和 facebook 图表结果之间很常见(只需要添加 "m_" 来匹配):你可以在你的图表 API 结果中的一个 message.id
中找到它(注意:不是conversation.id)
然后您可以获得您发现的此对话的图表 API 结果的 link
值:"link": "\/myBotName\/manager\/messages\/?threadid=10154736814928655&folder=inbox"
在我的测试中
下面是一个对话框示例,它将在 link 中搜索特定消息 ID:
[Serializable]
public class FacebookGetLinkTestDialog : IDialog<string>
{
public async Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
}
public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var jsonString = "";
var link = "";
using (var client = new HttpClient())
{
using (var response = await client.GetAsync($"https://graph.facebook.com/v2.9/me/conversations?access_token=yourAccessTokenHere").ConfigureAwait(false))
{
jsonString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
var conversationList = Newtonsoft.Json.JsonConvert.DeserializeObject<ConversationsRootObject>(jsonString);
link = conversationList.data.Single(c => c.messages.data.Any(d => d.id.Equals("m_" + "yourActivityIdHere"))).link;
}
}
await context.PostAsync($"{link}");
}
}
public class ConversationsRootObject
{
public List<Conversation> data { get; set; }
public Paging paging { get; set; }
}
public class Conversation
{
public string id { get; set; }
public string snippet { get; set; }
public string updated_time { get; set; }
public int message_count { get; set; }
public int unread_count { get; set; }
public Participants participants { get; set; }
public FormerParticipants former_participants { get; set; }
public Senders senders { get; set; }
public Messages messages { get; set; }
public bool can_reply { get; set; }
public bool is_subscribed { get; set; }
public string link { get; set; }
}
public class Participant
{
public string name { get; set; }
public string email { get; set; }
public string id { get; set; }
}
public class Participants
{
public List<Participant> data { get; set; }
}
public class FormerParticipants
{
public List<object> data { get; set; }
}
public class Senders
{
public List<Participant> data { get; set; }
}
public class Messages
{
public List<FbMessage> data { get; set; }
public Paging paging { get; set; }
}
public class FbMessage
{
public string id { get; set; }
public string created_time { get; set; }
}
public class Cursors
{
public string before { get; set; }
public string after { get; set; }
}
public class Paging
{
public Cursors cursors { get; set; }
public string next { get; set; }
}
上下文:
BotFramework (C# SDK) + Messenger 通道,机器人处理两种类型的用户:与会者(Messenger 用户)和组织者(Facebook 页面的管理员)。
用例:
当与会者请求人工支持(使用我的机器人菜单中的选项)时,组织者将收到一条消息。
在那条消息中,我想添加一个按钮,组织者点击后将执行以下操作:
- 停止自动回复该用户
- 将组织者重定向到 Facebook 的页面收件箱,并选择对话(与会者和机器人之间)
我做了什么:
我成功完成了停止自动回复的部分
我卡住了如何将组织者重定向到 FB 页面收件箱中的正确对话
技术上:
当我查看 Facebook 页面时,link 似乎是我应该为我的操作生成的,如下所示:https://www.facebook.com/mypage-mypageId/inbox/?selected_item_id=someId
我的问题是我无法从我的机器人对话中找到 selected_item_id
的这个值。
由于 Facebook Graph API。
,您将能够 link 进入 Facebook 页面收件箱(使用正确的线程) 必须调用/me/conversations
才能获取页面的对话(因此您必须将页面的 access_token 提供给 API 调用)。
然后在这些结果中,您必须与与会者的对话进行匹配。为此,您可以在机器人中使用 Activity 的 属性 id
(Activity.Id,而不是 Activity.Conversation.Id!) 因为这个值在你的机器人和 facebook 图表结果之间很常见(只需要添加 "m_" 来匹配):你可以在你的图表 API 结果中的一个 message.id
中找到它(注意:不是conversation.id)
然后您可以获得您发现的此对话的图表 API 结果的 link
值:"link": "\/myBotName\/manager\/messages\/?threadid=10154736814928655&folder=inbox"
在我的测试中
下面是一个对话框示例,它将在 link 中搜索特定消息 ID:
[Serializable]
public class FacebookGetLinkTestDialog : IDialog<string>
{
public async Task StartAsync(IDialogContext context)
{
context.Wait(MessageReceivedAsync);
}
public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
var jsonString = "";
var link = "";
using (var client = new HttpClient())
{
using (var response = await client.GetAsync($"https://graph.facebook.com/v2.9/me/conversations?access_token=yourAccessTokenHere").ConfigureAwait(false))
{
jsonString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
var conversationList = Newtonsoft.Json.JsonConvert.DeserializeObject<ConversationsRootObject>(jsonString);
link = conversationList.data.Single(c => c.messages.data.Any(d => d.id.Equals("m_" + "yourActivityIdHere"))).link;
}
}
await context.PostAsync($"{link}");
}
}
public class ConversationsRootObject
{
public List<Conversation> data { get; set; }
public Paging paging { get; set; }
}
public class Conversation
{
public string id { get; set; }
public string snippet { get; set; }
public string updated_time { get; set; }
public int message_count { get; set; }
public int unread_count { get; set; }
public Participants participants { get; set; }
public FormerParticipants former_participants { get; set; }
public Senders senders { get; set; }
public Messages messages { get; set; }
public bool can_reply { get; set; }
public bool is_subscribed { get; set; }
public string link { get; set; }
}
public class Participant
{
public string name { get; set; }
public string email { get; set; }
public string id { get; set; }
}
public class Participants
{
public List<Participant> data { get; set; }
}
public class FormerParticipants
{
public List<object> data { get; set; }
}
public class Senders
{
public List<Participant> data { get; set; }
}
public class Messages
{
public List<FbMessage> data { get; set; }
public Paging paging { get; set; }
}
public class FbMessage
{
public string id { get; set; }
public string created_time { get; set; }
}
public class Cursors
{
public string before { get; set; }
public string after { get; set; }
}
public class Paging
{
public Cursors cursors { get; set; }
public string next { get; set; }
}