2

語境:關於如何從參與者和機器人之間的對話中獲取此ID的任何想法?

BotFramework(C#SDK)+信使通道,機器人處理兩種類型的用戶:參加者(Messenger用戶)和組織者(誰是Facebook的頁面的管理員)。

使用案例:

當與會者請求人的支持(用我的機器人的菜單中的選項),主辦單位將收到一條消息。

在這種消息,我想添加一個按鈕,將執行以下操作一次由主辦單位點擊:

  1. 阻止機器人自動回覆至用戶
  2. 重定向組織者Facebook的第收件箱中,與會話(與會者和機器人之間)選擇

我做了什麼:

  • 我成功做了部分停止自動回覆

  • 我就死在如何組織者重定向到正確的談話在FB頁面的收件箱

技術上:

當我在Facebook頁面中查看時,似乎應該爲我的動作生成的鏈接如下所示:https://www.facebook.com/mypage-mypageId/inbox/?selected_item_id=someId

我的問題是,我無法從我的機器人的對話中找到selected_item_id的這個值。

+0

您的代碼中的哪個位置將消息發送給代理?什麼是「selected_item_id」?你問:「如何從初始會話中獲得select_item_id」但我沒有上下文來理解selected_item_id實際上是什麼,請解釋一下 –

+0

我編輯了我的問題,希望它現在更清楚:) –

回答

2

感謝Facebook Graph API,您將能夠獲得Facebook頁面收件箱(使用正確的線程)的鏈接。

/me/conversations必須被調用才能獲得頁面的對話(因此您必須將頁面的access_token賦予API調用)。

然後在這些結果中,您必須與參加者的對話進行匹配。爲此,您可以在您的bot(Activity.Id,而不是Activity.Conversation.Id!)中使用活動的屬性id,因爲此值在您的bot和臉譜圖結果之間是常見的(只需添加「m_ 「匹配):你可以找到你的圖形API結果它一個message.id(請注意:不是conversation.id)

然後你就可以得到這個對話中的圖形API結果link值,可以發現:"link": "\/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; } 
} 
+0

我應該使用id因爲它們不一樣,我從圖中收到的id如下所示:'t_mid.someNumber:9b0f112e52' 來自acitivity(activity.Id)的id:'mid。$ cAAP8wkY2a91i10BEQ1cpfr5erOvg' –

+0

您沒有看到您提供的值是Graph' conversation'(頂層)的'id',這裏我們要做的鏈接是'message'的'id'(低層次) –

+0

問題解決!!非常感謝你!!!! –

相關問題