Отправка сообщений указанным c пользователям в командах с использованием Graph API - PullRequest
0 голосов
/ 03 марта 2020

Любая конечная точка для отправки сообщений определенным c пользователям в командах через Graph API?

1 Ответ

2 голосов
/ 25 апреля 2020

(отредактировано из-за ясности и добавлены пользовательские запросы)

Вы можете отправлять сообщения через Graph API частным пользователям НО существует проблема, из-за которой вы не можете создать новый чат между двумя пользователями через Graph API. Это означает, что если вы хотите отправить сообщение от пользователя к пользователю, чат уже должен существовать. (Сообщения должны быть сначала обменены через клиент MSTeams, чтобы чат существовал)

Поэтому убедитесь, что у вас есть открытый чат!

Если это так, взгляните на этот MSDo c (Этот документ объясняет, как вы можете перечислять чаты от пользователя): https://docs.microsoft.com/en-us/graph/api/chat-list?view=graph-rest-beta&tabs=http

После того, как вы перечислили все свои чаты, вы можете посмотреть на это MSDo c ( Этот документ объясняет, как вы можете отправить сообщение пользователю): https://docs.microsoft.com/en-us/graph/api/chat-post-messages?view=graph-rest-beta&tabs=http

Обратите внимание на разрешения! Для отправки сообщений и перечисления чатов существуют только делегированные разрешения И эти вызовы доступны только в BETA , поэтому будьте осторожны с ним.


Я могу предоставить вам Java код только для примера.

(Для всего, что я делаю, я использую Scribe Java, чтобы получить Auth-токен) Для делегированных разрешений вам необходимо иметь "User-Auth-Токен". Это означает, что вы должны использовать Password-Credential-Grant следующим образом:

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(); }
}

имя пользователя и пароль - это учетные данные пользователя, которому вы хотите отправить сообщение (отправитель).


Исходная ситуация

Это мой клиент команды:

My Teams Chat Section

Писец Java


Получить все открытые чаты

(«я» в URL - это пользователь сверху (отправитель).)

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);
}

Ответ, который я получаю от этого запроса, выглядит следующим образом:

{"@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"}]}

Вы видите, что у меня есть два открытых чата и я получаю две записи обратно из запроса.

Получите правильный идентификатор разговора

Вы должны знать, что идентификатор можно разделить на три части. {JustAPartOfTheId} _ {} @ идентификатор пользователя {EndOfTheId}. {UserId} - это идентификатор вашего собеседника (получателя).

Это ответ GraphExplorer, который дает мне всех пользователей и всю информацию о них.

User Franz Bauer

Теперь вы можете видеть, что первый идентификатор: "id": "{PartOfTheID} _ {firstHalfOfUserID} -e52a55572b49@unq.gbl.spaces"

соответствует идентификатору пользователя после "_".

Вы можете разделить идентификатор с помощью фильтра "_" и найти нужный идентификатор.

Отправить сообщение пользователю

Теперь вы знаете правильный идентификатор и можно отправить новый запрос на сообщение вроде этого:

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

В Graph-SDK нет возможности использовать конечная точка бета, за исключением пользовательских запросов. (Для этих запросов я также использую Scribe Java для получения Auth-токена)

Установите конечную точку BETA

Когда вы хотите использовать конечную точку BETA Вы должны использовать функцию setEndpoint () следующим образом:

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

Получить все чаты

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

Тот же ответ, что и выше

Та же ситуация с userId => split и filter

Отправить сообщение

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(); 
}

Вот маленький GIF, где вы можете видеть, что я ничего не печатал. Я только что запустил свое маленькое приложение, и оно автоматически отправляет сообщения.

Send Message Gif

Надеюсь, это поможет вам. Не стесняйтесь комментировать, если вы что-то не понимаете! :)

С наилучшими пожеланиями!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...