【问题标题】:Mention channel using ms graph api使用 ms graph api 提及频道
【发布时间】:2021-01-14 16:08:54
【问题描述】:

我正在使用 ms graph,我需要与 ms 团队集成。在一种情况下,我必须向包含频道提及 (@) 的频道发送消息。目前我已经找到了如何使用 java 标记特定用户,但我不知道如何提及整个频道。在 ms 图中这样做是可能的,如果是的话怎么做?

更具体地说,这里是一个例子。假设我有一个名为 TestTeam 的团队,并且该团队有一个名为 testChannel 的频道。我需要发送一条包含@testChannel 的消息,并向该频道中的每个人发送通知。

同样在 slack api 中,我可以通过在消息中使用“”来执行此操作。

这是我用来标记用户的代码:

static void send_message(String text, String mentionName, String channelName, String teamName, String accessToken) {
  ensureGraphClient(accessToken);

  Team team = getTeam(accessToken, teamName);
  Channel channel = getChannel(accessToken, channelName, team);
  User user = getUser(accessToken, mentionName);
  if (userInChannel(user, team, channel)) {
     ChatMessage chatMessage = new ChatMessage();
     ItemBody body = new ItemBody();
     body.contentType = BodyType.HTML;
     body.content = String.format("%s.  <at id=\"1\">%s</at> ", text, mentionName);
     chatMessage.body = body;
     ChatMessageMention m = new ChatMessageMention();
     m.id = 1;
     IdentitySet st = new IdentitySet();
     Identity ide = new Identity();
     ide.id = user.id;
     ide.displayName = user.displayName;
     st.user = ide;
     m.mentioned = st;
     m.mentionText = mentionName;
     List<ChatMessageMention> cmmt = new LinkedList<>();
     cmmt.add(m);
     chatMessage.mentions = cmmt;
     graphClient.teams(team.id).channels(channel.id).messages()
           .buildRequest()
           .post(chatMessage);
  }

}

我也尝试过类似的方法来标记频道,但没有奏效:

     body.contentType = BodyType.HTML;
     body.content = String.format("%s. <at id=\"1\">%s</at> ", text, "myChannel");
     chatMessage.body = body;
     ChatMessageMention m = new ChatMessageMention();
     m.id = 1;
     IdentitySet st = new IdentitySet();
     Identity ide = new Identity();
     ide.id = "19%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx%40thread.tacv2";
     ide.displayName = "myChannel";
     st.user = ide;
     m.mentioned = st;
     m.mentionText = "myChannel";
     List<ChatMessageMention> cmmt = new LinkedList<>();
     cmmt.add(m);
     chatMessage.mentions = cmmt;
     graphClient.teams(team.id).channels(channel.id).messages()
           .buildRequest()
           .post(chatMessage);

【问题讨论】:

  • 那个频道是团队中的还是 slack 或者我们在谈论什么样的频道
  • 我说的是女士团队中的频道
  • 您可能想为您的问题提供更多上下文,最好包括一些代码示例。这会给你更好的答案。
  • 当然,让我编辑我的帖子
  • @Pantelisy 你为什么不发布你的代码,到那时你尝试了什么,如果有的话?

标签: java microsoft-graph-api


【解决方案1】:

简介:

玩过之后,这是最终的结果。这不是最终的答案,但希望能引导解决。

让我们开始一些介绍。

首先让我们定义我们的帖子网址:

POST https://graph.microsoft.com/beta/teams/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/channels/19:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@thread.tacv2/messages

现在让我们在图形 api 中提及用户:

{
    "body": {
        "contentType": "html",
        "content": "Hello World <at id=\"0\">Maytham Fahmi</at>"
    },
    "mentions": [
        {
            "id": 0, <- the index here should be the same as in the content message
            "mentionText": "Maytham Fahmi",
            "mentioned": {
                "user": {
                    "displayName": "Maytham Fahmi",
                    "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" <- this should be user user object id
                }
            }
        }
    ]
}

这是通过 Graph Api 测试和工作的。

现在我来到感兴趣的部分。发送到带有频道提及的频道如下所示:

{
    "body": {
        "contentType": "html",
        "content": "Hello World <at id=\"0\">General</at>"
    },
    "mentions": [
        {
            "id": 0, <- the index here should be the same as in the content message
            "mentionText": "General",
            "mentioned":  {
                        "conversation": {
                            "id": "19:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@thread.tacv2",
                            "displayName": "General",
                            "conversationIdentityType@odata.type": "#Microsoft.Teams.GraphSvc.conversationIdentityType",
                            "conversationIdentityType": "channel"
                        }
        }
    ]
}

团队中的结果,即从频道提及发送

这也适用于 Graph api explorer。

答案:

所以我们可以看到用户提到我们在IdentitySet 实例下使用User 对象,这对用户来说很好用。我已经使用 Microsoft.Graph 对其进行了 C# 测试。

这是问题Conversation 对象在 C# 中使用 Microsoft.Graph 时在 IdentitySet 下不存在。我很确定 Java 也是如此。如果你在 Java 中有那个对象,那么你应该能够做到。它可能不在 C# 中。

我有红色不同的地方,遗憾的是频道提及对象尚未在代码中实现,看起来像是一个错误或他们将随着时间的推移修复的功能。

一个变通的解决方案是,你有图形 api json 有效负载,你可以制作一个 Java 客户端来将 Jsons 发布到 url,然后你的工作就完成了。

注意:我看过我们的解决方案,它也不支持提及。

灵感链接:

注意,如果您一般需要发送通知,您可以使用webhooks

【讨论】:

  • 这在 GUI 中有效,但我需要通过 ms graph api 来完成。我试过了,结果是“这是一条消息@myChannel”。没有提到只是文字
  • C#也可以上传代码示例?我试过这个,但似乎没有用。我更新了我的示例以显示我当前正在使用的内容
  • 当然可以,但我可以问一个问题。您要发送的消息是用于通知还是您正在开发应用程序。我问你是否只需要它来通知的原因有一个非常简单的解决方案,我可以与你分享
  • 我们需要发送任务进度通知。虽然频道未修复,但我们可能会向不同的频道或团队发送带有不同文字和提及的消息
  • 对此我很抱歉,但也许你错过了理解我。我知道如何向频道发送消息。我需要一个示例,说明如何向具有频道提及的频道发送消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多