Все ваши любимые инструменты (кто-нибудь из 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, но это также может быть проект другого типа. Включите большую кнопку авторизации на главной странице:

<a href="/home/authorizeslack" class="btn btn-primary btn-lg">Authorize Slack</a>

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

public IActionResult AuthorizeSlack()
{
    return Redirect(
        "https://slack.com/oauth/v2/authorize?client_id=YOUR_CLIENT_IDscope=incoming-webhook");
}

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

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

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

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

public async Task<IActionResult> SlackCallback(string state, string code = null, string error = null)
{
    // TODO
}

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

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient();
    // ...
}

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

private readonly HttpClient httpClient;

public HomeController(HttpClient httpClient)
{
    this.httpClient = httpClient;
}

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

var response = await httpClient.GetFromJsonAsync<SlackResponse>(
    $"https://slack.com/api/oauth.v2.access?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&code={code}");
var ok = response.ok;
if (!ok) return Redirect("/");
var webhookUrl = response.incoming_webhook?.url;
if (string.IsNullOrWhiteSpace(webhookUrl)) return Redirect("/");

// TODO: Store webhookURL somewhere

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

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

private class SlackResponse
{
    public bool ok { get; set; }
    public Webhook incoming_webhook { get; set; }
}

private class Webhook
{
    public string url { get; set; }
}

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

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

await httpClient.PostAsJsonAsync(webhookUrl, new { text = "Hello from app" });

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

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

public class HomeController : Controller
{
    private readonly HttpClient httpClient;

    public HomeController(HttpClient httpClient)
    {
        this.httpClient = httpClient;
    }

    public IActionResult Index()
    {
        return View();
    }

    public IActionResult AuthorizeSlack()
    {
        return Redirect(
            "https://slack.com/oauth/v2/authorize?client_id=YOUR_CLIENT_ID&scope=incoming-webhook");
    }

    private class SlackResponse
    {
        public bool ok { get; set; }
        public Webhook incoming_webhook { get; set; }
    }

    private class Webhook
    {
        public string url { get; set; }
    }

    public async Task<IActionResult> SlackCallback(string state, string code = null, string error = null)
    {
        var response = await httpClient.GetFromJsonAsync<SlackResponse>(
            $"https://slack.com/api/oauth.v2.access?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&code={code}");
        var ok = response.ok;
        if (!ok) return Redirect("/");
        var webhookUrl = response.incoming_webhook?.url;
        if (string.IsNullOrWhiteSpace(webhookUrl)) return Redirect("/");

        // Store webhook URL somewhere

        await httpClient.PostAsJsonAsync(webhookUrl, new { text = "Hello from app" });

        return Redirect("/");
    }
}