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





5.00/5 (10投票s)
一种从 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 的帮助。