Facebook 你知道如何从与会者和机器人之间的对话中获取此id吗?
上下文: BotFramework(C#SDK)+Messenger频道,bot处理两种类型的用户:与会者(Messenger用户)和组织者(Facebook页面的管理员) 用例: 当与会者请求人工支持(使用我的机器人菜单中的选项)时,组织者将收到一条消息 在该消息中,我想添加一个按钮,该按钮在组织者单击后将执行以下操作:Facebook 你知道如何从与会者和机器人之间的对话中获取此id吗?,facebook,facebook-graph-api,botframework,facebook-messenger-bot,Facebook,Facebook Graph Api,Botframework,Facebook Messenger Bot,上下文: BotFramework(C#SDK)+Messenger频道,bot处理两种类型的用户:与会者(Messenger用户)和组织者(Facebook页面的管理员) 用例: 当与会者请求人工支持(使用我的机器人菜单中的选项)时,组织者将收到一条消息 在该消息中,我想添加一个按钮,该按钮在组织者单击后将执行以下操作: 停止bot对该用户的自动回复 将组织者重定向到Facebook的页面收件箱,并选择对话(在与会者和机器人之间) 我所做的: 我成功地完成了停止自动回复的部分 我被困在如何将
- 我成功地完成了停止自动回复的部分
- 我被困在如何将组织者重定向到FB页面收件箱中的正确对话
https://www.facebook.com/mypage-mypageId/inbox/?selected_item_id=someId
我的问题是,我无法从我的机器人的对话中找到所选项目id的此值。由于facebook Graph API,您将能够获得指向facebook页面收件箱的链接(使用正确的线程) 必须调用
/me/conversations
,才能获取页面的对话(因此您必须向API调用提供页面的访问令牌)
然后在这些结果中,你必须与与会者的对话相匹配。要做到这一点,您可以在bot(Activity.id,而不是Activity.Conversation.id!)中使用活动的属性id
,因为这个值在您的bot和facebook图形结果之间很常见(只需添加“m_”)即可匹配:您可以在图形API结果的一条message.id
中找到它(注意:不是Conversation.id)
然后,您可以获得您在我的测试中找到的此对话的图形API结果的链接值:“链接”:“\/myBotName\/manager\/messages\/?threadid=10154736814928655&folder=inbox”
下面是一个对话框示例,该对话框将搜索特定邮件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; }
}
[可序列化]
公共类FacebookGetLinkTestDialog:IDialog
{
公共异步任务StartAsync(IDialogContext上下文)
{
Wait(MessageReceivedAsync);
}
公共异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable参数)
{
var jsonString=“”;
var link=“”;
使用(var client=new HttpClient())
{
使用(var response=await client.GetAsync($)https://graph.facebook.com/v2.9/me/conversations?access_token=yourAccessTokenHere“”。配置等待(错误))
{
jsonString=await response.Content.ReadAsStringAsync().ConfigureAwait(false);
var conversationList=Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString);
link=conversationList.data.Single(c=>c.messages.data.Any(d=>d.id.Equals(“m_”+“yourActivityIdHere”))).link;
}
}
wait context.PostAsync($“{link}”);
}
}
公共类会话对象
{
公共列表数据{get;set;}
公共分页{get;set;}
}
公开课对话
{
公共字符串id{get;set;}
公共字符串片段{get;set;}
公共字符串已更新_time{get;set;}
公共int消息计数{get;set;}
公共int未读计数{get;set;}
公共参与者参与者{get;set;}
公共前参与者前参与者{get;set;}
公共发件人发件人{get;set;}
公共消息{get;set;}
公共bool可以回复{get;set;}
公共bool是{get;set;}
公共字符串链接{get;set;}
}
公开课参与者
{
公共字符串名称{get;set;}
公共字符串电子邮件{get;set;}
公共字符串id{get;set;}
}
公开课参与者
{
公共列表数据{get;set;}
}
公开课参与者
{
公共列表数据{get;set;}
}
公共类发送者
{
公共列表数据{get;set;}
}
公共类消息
{
公共列表数据{get;set;}
公共分页{get;set;}
}
公共类消息
{
公共字符串id{get;set;}
创建的公共字符串\u time{get;set;}
}
公共类游标
{
{get;set;}之前的公共字符串
{get;set;}之后的公共字符串
}
公共类分页
{
公共游标游标{get;set;}
公共字符串next{get;set;}
}
您在代码中向代理发送消息的位置?“所选项目id”的确切含义是什么?您会问:“如何从最初的对话中获取select_item_id”“但我没有上下文来理解所选项目的id实际上是什么。请解释。我编辑了我的问题。希望现在更清楚:)我应该在ID之间使用一些转换吗?因为他们不一样。我从graph收到的id如下所示:t_mid.someNumber:9b0f112e52
activity的id(activity.id):mid.$cAAP8wkY2a91i10BEQ1cpfr5erOvg
您没有在graph API的正确字段中查找。您提供的值是图形对话(顶层)的id
,这里我们尝试使用消息(底层)的id
,顺便说一句:这也适用于context.Activity.id。v3.8在哪里可以找到bot的活动(或activity.id)?我没有使用BotFramework/me/conversations,它现在已被弃用,并且使用v2.5+facebook API的应用程序无法调用它。