Все ваши любимые инструменты (кто-нибудь из elmah.io?) Интегрируются с такими инструментами обмена сообщениями в Интернете, как Slack. Современным компаниям важно получать уведомления в Slack при регистрации новых ошибок, сбоях сборки, привлечении клиентов и т. Д. В этом посте я покажу вам, как создать веб-приложение ASP.NET Core, которое позволяет Пользователь авторизует свою рабочую область Slack, выбирает канал и отправляет сообщения на этот канал с C #.

Вероятно, вы уже пробовали подключать онлайн-приложения к Slack. Вы начинаете с нажатия кнопки авторизации, приложение перенаправляет вас в Slack, где вы входите в систему и выбираете канал. Затем Slack перенаправляет вас обратно в приложение, и интеграция настраивается. Приложение теперь может публиковать сообщения на выбранном канале. Вот пример того, как настроить это на веб-сайте ASP.NET Core.

Начните с перехода на https://api.slack.com/apps и нажмите кнопку «Создать новое приложение». В модальном окне выберите вариант «С нуля». Дайте приложению правильное имя и выберите рабочую область. Наконец, нажмите кнопку «Создать приложение»:

Это создаст новое приложение Slack. Не закрывайте страницу с базовой информацией, поскольку она содержит идентификатор приложения и секрет, которые нам понадобятся в ближайшее время.

Создайте новый веб-сайт ASP.NET Core. В этом примере я выбрал проект MVC, но это также может быть проект другого типа. Включите большую кнопку авторизации на главной странице:

[pastacode lang=»c» manual=»%3Ca%20href%3D%22%2Fhome%2Fauthorizeslack%22%20class%3D%22btn%20btn-primary%20btn-lg%22%3EAuthorize%20Slack%3C%2Fa%3E» message=»» highlight=»» provider=»manual»/]

Создайте действие AuthorizeSlack в классе HomeController:

[pastacode lang=»c» manual=»public%20IActionResult%20AuthorizeSlack()%0A%7B%0A%20%20%20%20return%20Redirect(%0A%20%20%20%20%20%20%20%20%22https%3A%2F%2Fslack.com%2Foauth%2Fv2%2Fauthorize%3Fclient_id%3DYOUR_CLIENT_IDscope%3Dincoming-webhook%22)%3B%0A%7D» message=»» highlight=»» provider=»manual»/]

Конечная точка перенаправляет пользователя на страницу авторизации Slack. Вам нужно будет заменить YOUR_CLIENT_ID на идентификатор клиента, указанный на странице базовой информации в вашем приложении Slack. Включая область входящих веб-перехватчиков, мы запрашиваем у Slack разрешение на отправку сообщений в канал Slack с использованием URL-адреса веб-перехватчика.

Slack необходимо знать, куда перенаправить пользователя после того, как пользователь предоставит авторизацию. Вернитесь в приложение Slack и выберите пункт меню OAuth & Permission. Под разделом URL-адреса перенаправления включите следующий URL-адрес:

localhost: 44329 — это имя хоста и номер порта, назначенные моему локальному приложению. Вы хотите заменить их значениями из вашего кода. Чтобы это работало как на локальных машинах, так и в различных средах (промежуточная, производственная и т. Д.), Вы можете включить в список дополнительные URL-адреса перенаправления.

Вернитесь к своему коду и реализуйте действие SlackCallback в классе HomeController:

[pastacode lang=»c» manual=»public%20async%20Task%3CIActionResult%3E%20SlackCallback(string%20state%2C%20string%20code%20%3D%20null%2C%20string%20error%20%3D%20null)%0A%7B%0A%20%20%20%20%2F%2F%20TODO%0A%7D» message=»» highlight=»» provider=»manual»/]

Это конечная точка GET, которая будет запрошена Slack. Чтобы никто не запрашивал эту страницу в браузере, нам нужно убедиться, что запрос пришел из Slack. Для этого настройте новый HttpClient в методе ConfigureServices в классе Startup:

[pastacode lang=»c» manual=»public%20void%20ConfigureServices(IServiceCollection%20services)%0A%7B%0A%20%20%20%20services.AddHttpClient()%3B%0A%20%20%20%20%2F%2F%20…%0A%7D» message=»» highlight=»» provider=»manual»/]

Затем вставьте HttpClient в конструктор HomeController:

[pastacode lang=»c» manual=»private%20readonly%20HttpClient%20httpClient%3B%0A%0Apublic%20HomeController(HttpClient%20httpClient)%0A%7B%0A%20%20%20%20this.httpClient%20%3D%20httpClient%3B%0A%7D» message=»» highlight=»» provider=»manual»/]

Включите следующий код в метод SlackCallback:

[pastacode lang=»c» manual=»var%20response%20%3D%20await%20httpClient.GetFromJsonAsync%3CSlackResponse%3E(%0A%20%20%20%20%24%22https%3A%2F%2Fslack.com%2Fapi%2Foauth.v2.access%3Fclient_id%3DYOUR_CLIENT_ID%26client_secret%3DYOUR_CLIENT_SECRET%26code%3D%7Bcode%7D%22)%3B%0Avar%20ok%20%3D%20response.ok%3B%0Aif%20(!ok)%20return%20Redirect(%22%2F%22)%3B%0Avar%20webhookUrl%20%3D%20response.incoming_webhook%3F.url%3B%0Aif%20(string.IsNullOrWhiteSpace(webhookUrl))%20return%20Redirect(%22%2F%22)%3B%0A%0A%2F%2F%20TODO%3A%20Store%20webhookURL%20somewhere» message=»» highlight=»» provider=»manual»/]

Код использует внедренный HttpClient для запроса конечной точки api / oauth.v2.access. Запрос включает ваш IP-адрес клиента, секрет клиента и код, предоставленный для действия SlackCallback по запросу Slack. Секрет клиента также находится в вашем приложении Slack.

Я использую помощники System.Net.Http.Json для сопоставления ответа JSON непосредственно с небольшим строго типизированным объектом, созданным исключительно для этой единственной цели:

[pastacode lang=»c» manual=»private%20class%20SlackResponse%0A%7B%0A%20%20%20%20public%20bool%20ok%20%7B%20get%3B%20set%3B%20%7D%0A%20%20%20%20public%20Webhook%20incoming_webhook%20%7B%20get%3B%20set%3B%20%7D%0A%7D%0A%0Aprivate%20class%20Webhook%0A%7B%0A%20%20%20%20public%20string%20url%20%7B%20get%3B%20set%3B%20%7D%0A%7D» message=»» highlight=»» provider=»manual»/]

Логическое значение ok указывает, принимает ли Slack вызов или нет. Значение incoming_webhook.url включает URL-адрес, созданный из Slack. Вам нужно будет где-то сохранить этот URL-адрес, чтобы отправлять сообщения на выбранный канал Slack.

Чтобы проверить сгенерированный URL-адрес веб-перехватчика, включите следующий код перед возвратом из метода SlackCallback:

[pastacode lang=»c» manual=»await%20httpClient.PostAsJsonAsync(webhookUrl%2C%20new%20%7B%20text%20%3D%20%22Hello%20from%20app%22%20%7D)%3B» message=»» highlight=»» provider=»manual»/]

Это будет использовать сгенерированный URL-адрес веб-перехватчика для публикации сообщения в Slack с приветствием.

Вот полный код класса HomeController:

[pastacode lang=»c» manual=»public%20class%20HomeController%20%3A%20Controller%0A%7B%0A%20%20%20%20private%20readonly%20HttpClient%20httpClient%3B%0A%0A%20%20%20%20public%20HomeController(HttpClient%20httpClient)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20this.httpClient%20%3D%20httpClient%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20IActionResult%20Index()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20View()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20IActionResult%20AuthorizeSlack()%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20return%20Redirect(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22https%3A%2F%2Fslack.com%2Foauth%2Fv2%2Fauthorize%3Fclient_id%3DYOUR_CLIENT_ID%26scope%3Dincoming-webhook%22)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20private%20class%20SlackResponse%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20public%20bool%20ok%20%7B%20get%3B%20set%3B%20%7D%0A%20%20%20%20%20%20%20%20public%20Webhook%20incoming_webhook%20%7B%20get%3B%20set%3B%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20private%20class%20Webhook%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20public%20string%20url%20%7B%20get%3B%20set%3B%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20async%20Task%3CIActionResult%3E%20SlackCallback(string%20state%2C%20string%20code%20%3D%20null%2C%20string%20error%20%3D%20null)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20var%20response%20%3D%20await%20httpClient.GetFromJsonAsync%3CSlackResponse%3E(%0A%20%20%20%20%20%20%20%20%20%20%20%20%24%22https%3A%2F%2Fslack.com%2Fapi%2Foauth.v2.access%3Fclient_id%3DYOUR_CLIENT_ID%26client_secret%3DYOUR_CLIENT_SECRET%26code%3D%7Bcode%7D%22)%3B%0A%20%20%20%20%20%20%20%20var%20ok%20%3D%20response.ok%3B%0A%20%20%20%20%20%20%20%20if%20(!ok)%20return%20Redirect(%22%2F%22)%3B%0A%20%20%20%20%20%20%20%20var%20webhookUrl%20%3D%20response.incoming_webhook%3F.url%3B%0A%20%20%20%20%20%20%20%20if%20(string.IsNullOrWhiteSpace(webhookUrl))%20return%20Redirect(%22%2F%22)%3B%0A%0A%20%20%20%20%20%20%20%20%2F%2F%20Store%20webhook%20URL%20somewhere%0A%0A%20%20%20%20%20%20%20%20await%20httpClient.PostAsJsonAsync(webhookUrl%2C%20new%20%7B%20text%20%3D%20%22Hello%20from%20app%22%20%7D)%3B%0A%0A%20%20%20%20%20%20%20%20return%20Redirect(%22%2F%22)%3B%0A%20%20%20%20%7D%0A%7D» message=»» highlight=»» provider=»manual»/]