Featured image of post Comment publier un message sur Slack en C++ (API Win32 + WinHTTP) 【Support Webhook】

Comment publier un message sur Slack en C++ (API Win32 + WinHTTP) 【Support Webhook】

Comment publier un message sur Slack en C++ (API Win32 + WinHTTP) 【Support Webhook】

Je veux publier un message sur Slack depuis le C++. C’est très courant en Node.js ou en Python, mais les cas d’utilisation de « C++ × API Win32 × WinHTTP » sont rares.

Dans cet article, je vais expliquer étape par étape, de manière claire, comment envoyer un message à Slack depuis le C++ en utilisant une URL Webhook.


✅ Flux global

Pour publier sur Slack, suivez ces étapes :

  1. Obtenir l’URL Webhook (clé API) de Slack
  2. Envoyer une requête POST en utilisant WinHTTP
  3. Construire le corps du message au format JSON
  4. Vérifier le résultat et c’est terminé !

🔑 Étape 1 : Comment obtenir l’URL Webhook de Slack

Sur Slack, vous pouvez facilement publier des messages à partir de services externes en utilisant une fonctionnalité appelée Incoming Webhooks.

Procédure d’obtention

  1. Accédez à https://api.slack.com/apps
  2. Cliquez sur Create New App
  3. Sélectionnez From scratch, choisissez un nom d’application et l’espace de travail cible
  4. Dans le menu de gauche, sélectionnez « Incoming Webhooks » et activez-le
  5. Cliquez sur « Add New Webhook to Workspace » et sélectionnez un canal
  6. Copiez l’URL générée (ex : https://hooks.slack.com/services/xxx/yyy/zzz)

Cette URL fonctionne comme une clé API.


💻 Étape 2 : Envoyer un message à Slack avec du code C++

Technologies utilisées

  • API Win32
  • WinHTTP (bibliothèque standard)
  • Message au format JSON

Code d’exemple (Publication sur Slack)

 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
73
74
75
76
77
78
79
80
81
82
#include <windows.h>
#include <winhttp.h>
#include <iostream>

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

bool PostToSlack(const std::wstring& webhookUrl, const std::string& messageJson) {
    // Décomposition de l'URL
    URL_COMPONENTS urlComp{};
    wchar_t hostName[256];
    wchar_t urlPath[1024];

    urlComp.dwStructSize = sizeof(urlComp);
    urlComp.lpszHostName = hostName;
    urlComp.dwHostNameLength = _countof(hostName);
    urlComp.lpszUrlPath = urlPath;
    urlComp.dwUrlPathLength = _countof(urlPath);

    if (!WinHttpCrackUrl(webhookUrl.c_str(), 0, 0, &urlComp)) {
        std::wcerr << L"Échec de la décomposition de l'URL\n";
        return false;
    }

    // Session HTTP et connexion
    HINTERNET hSession = WinHttpOpen(L"SlackPoster/1.0",
                                     WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                                     WINHTTP_NO_PROXY_NAME,
                                     WINHTTP_NO_PROXY_BYPASS, 0);
    HINTERNET hConnect = WinHttpConnect(hSession, hostName, urlComp.nPort, 0);
    HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"POST", urlPath,
                                            NULL, WINHTTP_NO_REFERER,
                                            WINHTTP_DEFAULT_ACCEPT_TYPES,
                                            WINHTTP_FLAG_SECURE);

    std::wstring headers = L"Content-Type: application/json\r\n";
    BOOL result = WinHttpSendRequest(hRequest,
                                     headers.c_str(),
                                     -1,
                                     (LPVOID)messageJson.c_str(),
                                     messageJson.length(),
                                     messageJson.length(),
                                     0);

    if (!result) {
        std::cerr << "Échec de la requête d'envoi\n";
        return false;
    }

    WinHttpReceiveResponse(hRequest, NULL);

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

    // Libération des ressources
    WinHttpCloseHandle(hRequest);
    WinHttpCloseHandle(hConnect);
    WinHttpCloseHandle(hSession);

    return (statusCode == 200);
}

int main() {
    std::wstring webhookUrl = L"https://hooks.slack.com/services/xxx/yyy/zzz"; // Remplacez par votre Webhook

    std::string message = R"({
        "text": "Hello from C++ :rocket:",
        "username": "C++ Bot",
        "icon_emoji": ":robot_face:"
    })";

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

    return 0;
}

🧪 Personnalisation du message JSON

Dans les Webhooks de Slack, vous pouvez inclure les paramètres suivants :

1
2
3
4
5
6
{
  "text": "Contenu de la notification",
  "username": "Nom du bot",
  "icon_emoji": ":rocket:",
  "channel": "#Nom du canal souhaité"
}

📌 Remarques supplémentaires

  • Assurez-vous de spécifier "application/json" pour Content-Type
  • L’URL Webhook est passée telle quelle en tant que wstring (l’encodage URL n’est pas nécessaire)
  • N’oubliez pas WINHTTP_FLAG_SECURE car il s’agit d’une communication HTTPS

🎉 Bonus : Exemple de vérification de publication sur Slack

Cela s’affichera ainsi sur Slack :

1
2
[C++ Bot]
Hello from C++ :rocket:

✍️ Résumé

ÉlémentContenu
Méthode de publicationWebhook (Incoming Webhooks)
Bibliothèque réseauWinHTTP
Format des donnéesJSON
Paramètres utilisablestext, username, icon_emoji, channel, etc.

Même vous qui pensiez que l’intégration Slack en C++ était difficile, vous pouvez intégrer un bot de notification dès aujourd’hui !


🚀 Prochainement ?

Si vous êtes intéressé, la prochaine fois :

  • Pièces jointes de fichiers
  • Interface utilisateur avec des boutons
  • Manipulation flexible de l’API avec Slack App + OAuth2

Je peux également présenter une intégration Slack un peu plus avancée !

comments powered by Disqus
Généré avec Hugo
Thème Stack conçu par Jimmy