Featured image of post Comment poster un message avec l'API Slack et OAuth2 (Exemple d'implémentation en C++)

Comment poster un message avec l'API Slack et OAuth2 (Exemple d'implémentation en C++)

Explique comment poster un message via l'API Web Slack en utilisant le jeton OAuth de la Slack App. Présente la configuration de la portée et les étapes d'acquisition du jeton d'accès, jusqu'à un exemple de code concret d'implémentation en C++ utilisant WinHTTP.

✅ Méthode de publication à l’aide d’un jeton d’accès (Slack Web API)

Le “OAuth Token” (comme xoxb-…) de Slack est une clé pour publier des messages à l’aide de l’ API Web de Slack. Dans ce cas, contrairement à un Webhook, vous effectuez une requête POST vers le point de terminaison API Slack avec un en-tête Authorization: Bearer.


🔑 Prérequis nécessaires

Vous devez inclure chat:write dans les portées OAuth de l’application Slack :

Procédure de configuration

  1. Accédez à https://api.slack.com/apps
  2. Créez une application ou sélectionnez une application existante
  3. Sous “OAuth & Permissions” > Scopes → Ajoutez chat:write
  4. Cliquez sur “Install to Workspace” ou “Reinstall” et obtenez l’Access Token (ex : xoxb-xxxxxxxxxx)

💻 Code C++ (Publication sur l’API Slack avec WinHTTP)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <windows.h>
#include <winhttp.h>
#include <iostream>

#pragma comment(lib, "winhttp.lib")

bool PostSlackMessage(const std::wstring& accessToken, const std::string& channel, const std::string& text) {
    const wchar_t* host = L"slack.com";
    const wchar_t* path = L"/api/chat.postMessage";

    HINTERNET hSession = WinHttpOpen(L"SlackPoster/1.0",
                                     WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                                     WINHTTP_NO_PROXY_NAME,
                                     WINHTTP_NO_PROXY_BYPASS, 0);
    if (!hSession) return false;

    HINTERNET hConnect = WinHttpConnect(hSession, host, INTERNET_DEFAULT_HTTPS_PORT, 0);
    if (!hConnect) return false;

    HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"POST", path,
                                            NULL, WINHTTP_NO_REFERER,
                                            WINHTTP_DEFAULT_ACCEPT_TYPES,
                                            WINHTTP_FLAG_SECURE);

    // En-têtes Authorization et Content-Type
    std::wstring headers = L"Content-Type: application/json\r\n";
    headers += L"Authorization: Bearer " + accessToken + L"\r\n";

    // Corps JSON
    std::string body = R"({"channel":")" + channel + R"(","text":")" + text + R"("})";

    BOOL result = WinHttpSendRequest(hRequest,
                                     headers.c_str(),
                                     (DWORD)-1,
                                     (LPVOID)body.c_str(),
                                     body.length(),
                                     body.length(),
                                     0);

    if (!result || !WinHttpReceiveResponse(hRequest, NULL)) {
        std::cerr << "Erreur d'envoi\n";
        return false;
    }

    // Vérification du code d'état
    DWORD statusCode = 0;
    DWORD size = sizeof(statusCode);
    WinHttpQueryHeaders(hRequest,
                        WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER,
                        WINHTTP_HEADER_NAME_BY_INDEX,
                        &statusCode, &size, WINHTTP_NO_HEADER_INDEX);

    WinHttpCloseHandle(hRequest);
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);

    return (statusCode == 200);
}

int main() {
    std::wstring token = L"xoxb-votre_jeton_d_acces"; // Jeton d'accès
    std::string channel = "ID_DU_CANAL_ou_#general";  // Ex : "#general" ou "C0123456789"
    std::string message = "Test de publication sur Slack depuis C++ !";

    if (PostSlackMessage(token, channel, message)) {
        std::cout << "Publication réussie !\n";
    } else {
        std::cerr << "Échec de la publication.\n";
    }

    return 0;
}

📌 Comment obtenir l’ID du canal

Utiliser uniquement le nom du canal (ex : #general) peut provoquer une erreur. La méthode fiable consiste à utiliser l’ID trouvé dans l’URL de la page du canal Slack.

1
2
https://app.slack.com/client/Txxxxx/C0123456789
                                 ↑Cette partie est l'ID du canal

✅ À propos des types de jetons (Supplément)

Format du jetonUtilisationExemple
xoxb-...Bot Token (Recommandé)Publier, modifier, supprimer
xoxp-...User Token (Non recommandé)Opérations non liées aux bots
Refresh TokenPour le renouvellement de jeton à long termeNormalement non utilisé

📝 Résumé

  • Pour publier sur Slack depuis C++, la méthode Slack Web API + Bearer Token est fiable
  • Utilisez le point de terminaison chat.postMessage avec HTTPS POST
  • Le jeton doit être envoyé dans l’en-tête Bearer
  • La spécification de l’ID pour le canal est fiable
comments powered by Disqus