🔖 INDEX
안녕하세요! 오늘은 텔레그램 봇 API를 활용하여 우리가 원하는 메시지를 받아보는 방법에 대해 알아보겠습니다. 우선, 텔레그램 봇이 무엇인지 간단히 설명하자면, 텔레그램 봇은 텔레그램 메신저에서 제공하는 서비스 중 하나로, 사용자와의 대화를 통해 다양한 기능을 수행할 수 있는 프로그램입니다.
이 텔레그램 봇을 활용하면, 사용자가 직접 메시지를 보내지 않아도 자동으로 메시지를 보내거나, 사용자로부터 메시지를 받아 처리하는 등 다양한 기능을 구현할 수 있습니다.
이번 포스트에서는 텔레그램 봇 API를 활용하여 원하는 메시지를 텔레그램으로 보내는 방법에 대해 자세히 알아보겠습니다.
텔레그램 봇 만들기
먼저, 텔레그램 봇을 만들어야 합니다. 텔레그램 봇을 만드는 방법은 다음과 같습니다:
- Telegram에서 BotFather 검색: Telegram 앱 또는 웹 버전에서 "BotFather"라고 검색하여 BotFather 봇을 찾습니다.
- BotFather 채팅 시작: BotFather를 찾으면 채팅을 시작할 수 있습니다. "START" 버튼을 클릭하거나 "/start"라는 메시지를 입력하여 채팅을 시작합니다.
- 새로운 봇 생성: BotFather 채팅창에서 "/newbot" 명령어를 입력합니다. 이 명령어를 통해 새로운 봇을 생성할 수 있습니다.
- 봇 이름 설정: 봇의 이름을 입력합니다. 이 이름은 봇이 나타낼 이름이며 사용자에게 보여지는 것입니다. 원하는 이름을 입력한 후 엔터를 누릅니다.
- 봇 사용자명 설정: 봇의 사용자명(유저네임)을 입력합니다. 이 사용자명은 봇을 식별하는 고유한 값이므로 고유하게 설정해야 합니다. 입력한 사용자명은 반드시 "bot"으로 끝나야 하며, 다른 봇과 중복되지 않아야 합니다. 유효한 사용자명을 입력한 후 엔터를 누릅니다.
- 봇 토큰 발급: BotFather가 봇 토큰을 생성하고 제공합니다. 이 토큰은 봇을 인증하고 API와 통신하는 데 사용됩니다. 토큰은 알파벳과 숫자로 구성된 긴 문자열입니다. 토큰은 안전하게 보관되어야 하므로 노출되지 않도록 주의해야 합니다.
- 봇 설정 완료: 봇 토큰을 받은 후, BotFather는 생성된 봇에 대한 정보와 설정을 안내합니다. 이 단계에서는 선택적으로 봇의 프로필 사진, 설명 등을 설정할 수 있습니다.
이제 봇 토큰을 사용하여 Telegram API를 호출하고 봇을 프로그래밍적으로 조작할 수 있습니다. 봇 토큰을 안전하게 보관하고 사용자에게 노출되지 않도록 주의해야 합니다.
텔레그램 Chat ID 확인하기
텔레그램의 chat_id는 다음과 같은 방법으로 확인할 수 있습니다:
텔레그램 봇을 통한 chat_id 확인
- 텔레그램 앱에서 봇을 생성하고, 생성한 봇의 토큰을 받습니다.
- 텔레그램 앱에서 생성한 봇을 검색하고, 해당 봇과 대화를 시작합니다.
- 대화를 시작한 후, 다음 URL을 웹 브라우저나 API 클라이언트에 입력하여 요청을 보냅니다:
- https://api.telegram.org/bot{봇_토큰}/getUpdates
- 응답으로 받은 JSON 데이터에서 "chat" 객체 내의 "id" 값을 확인합니다. 이 값이 해당 채팅의 chat_id입니다.
@userinfobot을 통한 chat_id 확인
- 텔레그램 앱에서 @userinfobot을 검색하여 해당 봇을 찾습니다.
- 해당 봇과 대화를 시작합니다.
- 대화를 시작한 후, 봇이 제공하는 정보 중에서 "chat" 항목을 찾습니다. 여기에서 "id" 값을 확인하면 해당 채팅의 chat_id입니다.
코드를 통한 chat_id 확인
- 텔레그램 봇으로부터 메시지를 수신하면, 해당 메시지에는 chat_id가 포함되어 있습니다. 코드를 통해 수신한 메시지의 chat_id를 출력하면 확인할 수 있습니다.
위의 방법 중 하나를 선택하여 chat_id를 확인할 수 있습니다. chat_id는 해당 채팅의 고유 식별자이므로, 메시지를 전송하고자 하는 대상 채팅의 chat_id를 정확하게 사용해야 합니다.
WinHTTP 라이브러리 활용 함수 개발
이제 우리의 텔레그램 봇이 준비되었습니다. 다음으로 C++과 WinHTTP를 이용해 텔레그램 봇 API에 접근하는 방법을 알아보겠습니다. 먼저 필요한 라이브러리를 포함시키고, WinHTTP를 이용하여 HTTP 요청을 보내는 함수를 만들어 보겠습니다:
#include <winhttp.h>
#pragma comment(lib, "winhttp.lib")
std::wstring PostRequestWinHTTP(const std::wstring& server, const std::wstring& path, const std::wstring& message)
{
DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer;
BOOL bResults = FALSE;
HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;
hSession = WinHttpOpen(L"A WinHTTP Example Program/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
if (hSession)
hConnect = WinHttpConnect(hSession, server.c_str(), INTERNET_DEFAULT_HTTPS_PORT, 0);
if (hConnect)
hRequest = WinHttpOpenRequest(hConnect, L"POST", path.c_str(),
NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_SECURE);
if (hRequest)
bResults = WinHttpAddRequestHeaders(hRequest,
L"Content-Type: application/json",
-1L,
WINHTTP_ADDREQ_FLAG_ADD |
WINHTTP_ADDREQ_FLAG_REPLACE);
std::string new_message = WStringToUTF8(message);
if (bResults)
bResults = WinHttpSendRequest(hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS,
0, (LPVOID)new_message.c_str(),
new_message.size(),
new_message.size(),
0);
if (bResults)
bResults = WinHttpReceiveResponse(hRequest, NULL);
std::wstring response;
pszOutBuffer = NULL;
if (bResults)
{
do
{
dwSize = 0;
if (!WinHttpQueryDataAvailable(hRequest, &dwSize))
printf("Error %u in WinHttpQueryDataAvailable.\n", GetLastError());
if (dwSize > 0) {
pszOutBuffer = new char[dwSize + 1];
}
if (!pszOutBuffer)
{
printf("Out of memory\n");
dwSize = 0;
}
else
{
ZeroMemory(pszOutBuffer, dwSize + 1);
if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer,
dwSize, &dwDownloaded))
printf("Error %u in WinHttpReadData.\n", GetLastError());
else
response = std::wstring(pszOutBuffer, pszOutBuffer + dwDownloaded);
delete[] pszOutBuffer;
pszOutBuffer = NULL;
}
} while (dwSize > 0);
}
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);
return response;
}
std::string WStringToUTF8(const std::wstring& wstr)
{
int len = WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
std::string str(len - 1, '\0');
WideCharToMultiByte(CP_UTF8, 0, wstr.c_str(), -1, &str[0], len, NULL, NULL);
return str;
}
이 함수는 WinHTTP를 이용하여 HTTP POST 요청을 보내고, 응답을 받아 반환합니다. 서버의 이름과 요청 경로, 그리고 메시지를 인자로 받습니다.
그 다음으로는 텔레그램 봇 API에 접근하여 메시지를 보내는 코드입니다:
std::wstring SendTelegramMessage(std::wstring text)
{
std::wstring server = L"api.telegram.org";
std::wstring token = L"텔레그램 bot token을 입력합니다.";
std::wstring chat_id = L"chat ID를 입력합니다.";
std::wstring path = L"/bot" + token + L"/sendMessage?";
std::wstring message = L"{\"chat_id\":\"" + chat_id + L"\",\"text\":\"" + text + L"\"}";
std::wstring response = PostRequestWinHTTP(server, path, message);
return response.c_str();
}
int main()
{
std::wstring strReturn = SendTelegramMessage(L"이 메시지는 WinHTTP 라이브러리를 활용해서 전송한 메시지 입니다.");
CString cstrMessage(strReturn.c_str());
AfxMessageBox(cstrMessage);
}
위 코드에서 token은 'BotFather'가 생성한 봇의 토큰이고, chat_Id는 메시지를 보낼 대화방의 ID입니다. 이제, 이 코드를 실행하면 우리가 원하는 메시지가 텔레그램 봇을 통해 보내집니다. 이렇게 하면 텔레그램 봇을 이용하여 다양한 서비스를 구현할 수 있습니다.
예를 들어, 서버의 상태를 주기적으로 확인하고, 문제가 발생하면 알림을 받는 등의 기능을 구현할 수 있습니다. 오늘은 텔레그램 봇 API를 이용하여 원하는 메시지를 보내는 방법에 대해 알아보았습니다.
다음 포스트에서는 텔레그램 봇 API를 이용하여 사용자로부터 메시지를 받는 방법에 대해 알아보겠습니다. 그럼, 다음 포스트에서 뵙겠습니다!
'프로그래밍 > MFC' 카테고리의 다른 글
MFC에서 Thread 사용하기 (0) | 2023.10.04 |
---|
댓글