简体   繁体   中英

Sending messages to specific users in Teams using Graph API

任何通过 Graph API 向 Teams 中的特定用户发送消息的端点?

(Edited because of clarity and added Custom-Requests)

You can send messages via Graph API to private users BUT there is a problem that you can't create a new chat between two users via the Graph API. This means that if you want to send a message from a user to a user, the chat must already exist. (Messages must first have been exchanged via the MSTeams client for a chat to exist)

So make sure that you have a open chat!

If so, have a look at this MSDoc (This document explains how you can list chats from a user): https://docs.microsoft.com/en-us/graph/api/chat-list?view=graph-rest-beta&tabs=http

After you have all your chats listed, you can have a look at this MSDoc (This document explains how you can send a message to a user): https://docs.microsoft.com/en-us/graph/api/chat-post-messages?view=graph-rest-beta&tabs=http

Pay attention to the permissions! For sending messages and listing chats there are only delegated permissions so far AND these calls are only available in BETA , so be carefull with it.


I can only provide you Java code for an example.

(For everything I do I use ScribeJava to get an Auth-Token) For delegated permissions you need to have a "User-Auth-Token". That means you have to use a Password-Credential-Grant like this:

private void _initOAuth2Service() 
{
    oAuth2Service = new ServiceBuilder(clientId)
            .apiSecret(clientSecret)
            .defaultScope(GRAPH_SCOPE)
            .build(MicrosoftAzureActiveDirectory20Api.custom(tenantId));


    //PASSWORD CREDENTIALS FLOW
    try 
    {
        oAuth2Token = oAuth2Service.getAccessTokenPasswordGrant(username, password);
    }
    catch (IOException e) { e.printStackTrace();  }
    catch (InterruptedException e) { e.printStackTrace(); }
    catch (ExecutionException e) {  e.printStackTrace(); }
}

username and password are the credentials from the user you want to send a message (sender).


Initial situation

This is my TeamsClient:

我的团队聊天部分

ScribeJava


Get all open chats

("me" in the URL is the user from above (sender).)

private Response _executeGetRequest()
{
final OAuthRequest request = new OAuthRequest(Verb.GET, "https://graph.microsoft.com/beta/me/chats");
        oAuth2Service.signRequest(oAuth2Token, request);
        return oAuth2Service.execute(request);
}

The response I get from this request looks like this:

{"@odata.context":"https://graph.microsoft.com/beta/$metadata#chats","value":[{"id":"{PartOfTheID}_{firstHalfOfUserID}-e52a55572b49@unq.gbl.spaces","topic":null,"createdDateTime":"2020-04-25T09:22:19.86Z","lastUpdatedDateTime":"2020-04-25T09:22:20.46Z"},{"id":"{secondUserChatID}@unq.gbl.spaces","topic":null,"createdDateTime":"2020-03-27T08:19:29.257Z","lastUpdatedDateTime":"2020-03-27T08:19:30.255Z"}]}

You can see that I have two open chats and get two entries back from the request.

Get the right conversatonID

You have to know that the id can be split in three sections. {JustAPartOfTheId}_{userId}@{EndOfTheId}. The {userId} is the id from your chatpartner (recipient).

This is a GraphExplorer response which gives me all users and all informations about them.

用户弗朗茨·鲍尔

Now you can see that the first ID: "id":"{PartOfTheID}_{firstHalfOfUserID}-e52a55572b49@unq.gbl.spaces"

matches the UserID after the "_".

You can split the ID at the "_" filter and find the ID you need.

Send Message to user

Now you know the right Id and can send a new request for the message like this:

final OAuthRequest request = new OAuthRequest(Verb.POST, "https://graph.microsoft.com/beta/chats/{PartOfTheID}_{firstHalfOfUserID}-e52a55572b49@unq.gbl.spaces/messages");
        oAuth2Service.signRequest(oAuth2Token, request);
        request.addHeader("Accept", "application/json, text/plain, */*");
        request.addHeader("Content-Type", "application/json");
        request.setPayload("{\"body\":{\"content\":\" " + "Hi Hi Daniel Adu-Djan" + "\"}}");
        oAuth2Service.execute(request);

GraphAPI-Custom-Requests

In the Graph-SDK is no opportunity to use the beta endpoint except for Custom-Requests. (For these requests I also use ScribeJava to get an Auth-Token)

Set the BETA-Endpoint

When you want to use the BETA-Endpoint you have to use the setEndpoint() function like this:

IGraphServiceClient graphUserClient = _initGraphServiceUserClient();
//Set Beta-Endpoint 
graphUserClient.setServiceRoot("https://graph.microsoft.com/beta");

Get all chats

try
    {
      JsonObject allChats = graphUserClient.customRequest("/me/chats").buildRequest().get();
    }
catch(ClientException ex) { ex.printStacktrace(); }

Same response like above

Same situation with the userId => split and filter

Send message

IGraphServiceClient graphUserClient = _initGraphServiceUserClient();
//Set Beta-Endpoint again
graphUserClient.setServiceRoot("https://graph.microsoft.com/beta"); 
try
    {
      JsonObject allChats = graphUserClient.customRequest("/chats/{PartOfTheID}_{firstHalfOfUserID}-e52a55572b49@unq.gbl.spaces/messages").buildRequest().post({yourMessageAsJsonObject});
    }
catch(ClientException ex) { ex.printStacktrace(); 
}

Here is a little GIF where you can see that I didn't type anything. I just started my little application and it sends messages automatically.

发送消息 Gif

I hope this helps you. Feel free to comment if you don't understand something! :)

Best regards!

As of now, We do not have any endpoint to send messages to specific users via Graph API.

You may submit/vote a feature request in the UserVoice or just wait for the update from the Product Team.

You can vote for a below feature requests which are already created. All you have to do is enter your email ID and vote.

https://microsoftteams.uservoice.com/forums/555103-public/suggestions/40642198-create-new-1-1-chat-using-graph-api

https://microsoftteams.uservoice.com/forums/555103-public/suggestions/39139705-is-there-any-way-to-generate-chat-id-by-using-grap

Update :

Please find below one more user voice created for the same in Microsoft Graph user voices and vote for it.

https://microsoftgraph.uservoice.com/forums/920506-microsoft-graph-feature-requests/suggestions/37802836-add-support-for-creating-chat-messages-on-the-user

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM