MS Graph APIを使用したTeamsへのメッセージ投稿

今回は、MS Graph APIを使用して、TeamsのChannelへメッセージを投稿する方法について試してみた。

前提として、投稿を行うには、TeamのIDとChannelのIDが必要となる

また、メンション付きメッセージにする場合は、Channel全体へのメンションはChannelのID,個人向けのメンションはADユーザーのObject IDが必要。ユーザーの場合はUserPrincipalNameでは無いので注意が必要。

投稿には、下記の権限が必要。

  • ChannelMessage.Send
  • Group.ReadWrite.All(下位互換性のためにのみサポート)

まず、投稿用のメッセージを作成する。

var msg = new ChatMessage
{
    Subject = "テストメッセージ",
	Body = new ItemBody
	{
		// メンションありの場合はHTMLにする必要あり
        ContentType = BodyType.Html,
		Content = """
        <at id="0">メンション先</at><br/>
        !!!テストです!!!<br/>
        """,
	},
	// 重要度
    Importance = ChatMessageImportance.High,
	// メンションの対象指定
    Mentions = new List<ChatMessageMention>() {
        new ChatMessageMention() {
            Id = 0,	// <at id="0">
            MentionText = "<メンション先の表示名>",
            Mentioned = new ChatMessageMentionedIdentitySet() {
				/* Channelにメンションする場合
                Conversation = new TeamworkConversationIdentity() {
                    Id = "<Channel ID>",
                    DisplayName = "<表示名>",
                    ConversationIdentityType = TeamworkConversationIdentityType.Channel
                }
				*/
                // ユーザーにメンションする場合
                User = new Identity() {
                    DisplayName = "<表示名>",
                    Id = "<ユーザーID>",    // UserPrincipalNameではなく、ObjectIdが必要!!
                }
            }
        }
    }
};

次にメッセージを投稿する。

※メッセージの送信元はGraphにログインしたユーザーとなる。

// Chanelにメッセージ投稿
await cli.Teams[<Team ID>]
        .Channels[<Channel ID>]
        .Messages
        .PostAsync(msg);
結果

ちなみに、メンション先の指定である、ChatMessageMention中のMentionTextと本文中の
<at id="・・・">[表示名]</at>[表示名]が合っていないと、例外が発生するようだ。この[表示名]は実際のユーザーの表示名やChannel名と異なっていても、メッセージ上には[表示名]が表示される。(ChatMessageMentionedIdentitySet中のDisplayNameは無視されるようだ・・・)

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。 好きなことだけ拾って投稿しているので、内容にはあまり期待しないでねw
カテゴリー: .NET, C#, Microsoft Graph, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください