(отредактировано из-за ясности и добавлены пользовательские запросы)
Вы можете отправлять сообщения через 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(); }
}
имя пользователя и пароль - это учетные данные пользователя, которому вы хотите отправить сообщение (отправитель).
Исходная ситуация
Это мой клиент команды:
Писец 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, который дает мне всех пользователей и всю информацию о них.
Теперь вы можете видеть, что первый идентификатор: "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, где вы можете видеть, что я ничего не печатал. Я только что запустил свое маленькое приложение, и оно автоматически отправляет сообщения.
Надеюсь, это поможет вам. Не стесняйтесь комментировать, если вы что-то не понимаете! :)
С наилучшими пожеланиями!