65.9K
CodeProject 正在变化。 阅读更多。
Home

从 Win32 C++ 程序发送 WhatsApp 消息 - 第一部分

starIconstarIconstarIconstarIconstarIcon

5.00/5 (10投票s)

2018 年 11 月 3 日

CPOL

2分钟阅读

viewsIcon

70379

downloadIcon

3127

一种从 C++ 向个人或群组发送 WhatsApp 消息的简单方法

引言

我正在寻找一个简单的 API,用于向 Secured Globe, Inc. 的程序员组发送 WhatsApp 消息。 有几家服务提供商,我们选择了 其中一家WhatsAppMate)并开始了免费试用。 然而,他们使用其服务的代码示例几乎涵盖了所有编程语言,除了 C++。 因此,我们编写了自己的 C++ 类来实现这个目的。 请同时阅读 第二部分。 

背景

WhatsApp 是一款跨平台免费服务,用于通过视频或语音聊天以及向个人或群组发送消息,包括文件、媒体等。 WhatsApp 比旧的 SMS 更好,因为它免费且具有更多功能。 在日常工作中,我们需要设置各种警报,发送给共享工作或处理功能的团队,并在完成后自动通知,这使得生活更轻松。

Using the Code

对于 GitHub 仓库,请参阅 这个(类)和 这个(基于 MFC 的工具)。

可以发送的消息类型有很多,包括个人消息或群组消息,以及带有或不带有照片或 PDF 文件的消息。 您可以在 此页面上了解更多信息。

以下是您需要具备的构建块。 或者,我稍后会附上一个编译后的(.exe)测试应用程序。

//
#define    GroupAdmin                <YOUR GROUP ADMIN MOBILE PHONE>
#define GroupName                <YOUR GROUP NAME>
#define CLIENT_ID                <YOUR CLIENT ID>
#define CLIENT_SECRET            <YOUR CLIENT SECRET>

#define GROUP_API_SERVER        L"api.whatsmate.net"
#define GROUP_API_PATH          L"/v3/whatsapp/group/text/message/12"
#define IMAGE_SINGLE_API_URL    L"http://api.whatsmate.net/v3/whatsapp/group/image/message/12"

//

连接 Internet

首先,我们打开一个互联网连接并连接到 API 服务

    hOpenHandle = InternetOpen(_T("HTTP"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if (hOpenHandle == NULL)
    {
        return false;
    }

    hConnectHandle = InternetConnect(hOpenHandle,
        GROUP_API_SERVER,
        INTERNET_DEFAULT_HTTP_PORT,
        NULL, NULL, INTERNET_SERVICE_HTTP,
        0, 1);

    if (hConnectHandle == NULL)
    {
        InternetCloseHandle(hOpenHandle);
        return false;
    }

打开请求

    const wchar_t *AcceptTypes[] = { _T("application/json"),NULL };
    HINTERNET hRequest = HttpOpenRequest(hConnectHandle, _T("POST"), 
                         GROUP_API_PATH, NULL, NULL, AcceptTypes, 0, 0);

    if (hRequest == NULL)
    {
        InternetCloseHandle(hConnectHandle);
        InternetCloseHandle(hOpenHandle);
        return false;
    }

标题栏 (Header)

接下来,我们发布 Header,该 Header 使用以下代码组成

    std::wstring HeaderData;
            
    HeaderData += _T("X-WM-CLIENT-ID: ");
    HeaderData += _T(CLIENT_ID);
    HeaderData += _T("\r\nX-WM-CLIENT-SECRET: ");
    HeaderData += _T(CLIENT_SECRET);
    HeaderData += _T("\r\n");
    HttpAddRequestHeaders(hRequest, HeaderData.c_str(), HeaderData.size(), NULL);

发送消息

现在我们可以将消息发送到群组了

    std::wstring WJsonData;
    WJsonData += _T("{");
    WJsonData += _T("\"group_admin\":\"");
    WJsonData += groupAdmin;
    WJsonData += _T("\",");
    WJsonData += _T("\"group_name\":\"");
    WJsonData += groupName;
    WJsonData += _T("\",");
    WJsonData += _T("\"message\":\"");
    WJsonData += message;
    WJsonData += _T("\"");
    WJsonData += _T("}");

    const std::string JsonData(WJsonData.begin(), WJsonData.end());

    bResults = HttpSendRequest(hRequest, NULL, 0, (LPVOID)(JsonData.c_str()), JsonData.size());

检查结果

接收者将看到如下 WhatsApp 消息

但是为了确保,我们需要在此阶段知道一切是否顺利。 这通过查询 Http 请求的结果来完成。

如果一切正常,我们期望的 StatusText 是“OK”。

    TCHAR StatusText[BUFFER_LENGTH] = { 0 };
    DWORD StatusTextLen = BUFFER_LENGTH;
    HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_TEXT, &StatusText, &StatusTextLen, NULL);
    bResults = (StatusTextLen && wcscmp(StatusText, L"OK")==FALSE);

使用 SGWhatsApp 类

现在我们可以看看如何使用我们的类。

#include "SGWhatsApp.h"

int _tmain(int argc, _TCHAR* argv[])
{    
    SGWhatsApp sender;
    sender.SendGroupMessage(GroupAdmin, GroupName, _T("hi"));
    return 0;
}

历史

  • 2018 年 11 月 3 日:初始版本

谢谢

感谢 Ivan Voloschuk 的帮助。 

© . All rights reserved.