본문 바로가기
프로그래밍/MFC

텔레그램 봇으로 메시지 보내기 (MFC, 텔레그램 봇 API)

by 머니테크리더 2023. 5. 18.
반응형

MFC 텔레그램 메시지 보내기 대표 이미지
MFC 텔레그램 메시지 보내기 대표 이미지

🔖 INDEX

     

     

    안녕하세요! 오늘은 텔레그램 봇 API를 활용하여 우리가 원하는 메시지를 받아보는 방법에 대해 알아보겠습니다. 우선, 텔레그램 봇이 무엇인지 간단히 설명하자면, 텔레그램 봇은 텔레그램 메신저에서 제공하는 서비스 중 하나로, 사용자와의 대화를 통해 다양한 기능을 수행할 수 있는 프로그램입니다.
    이 텔레그램 봇을 활용하면, 사용자가 직접 메시지를 보내지 않아도 자동으로 메시지를 보내거나, 사용자로부터 메시지를 받아 처리하는 등 다양한 기능을 구현할 수 있습니다.
    이번 포스트에서는 텔레그램 봇 API를 활용하여 원하는 메시지를 텔레그램으로 보내는 방법에 대해 자세히 알아보겠습니다.

    텔레그램 봇 만들기

    먼저, 텔레그램 봇을 만들어야 합니다. 텔레그램 봇을 만드는 방법은 다음과 같습니다:

    1. Telegram에서 BotFather 검색: Telegram 앱 또는 웹 버전에서 "BotFather"라고 검색하여 BotFather 봇을 찾습니다.
    2. BotFather 채팅 시작: BotFather를 찾으면 채팅을 시작할 수 있습니다. "START" 버튼을 클릭하거나 "/start"라는 메시지를 입력하여 채팅을 시작합니다.
    3. 새로운 봇 생성: BotFather 채팅창에서 "/newbot" 명령어를 입력합니다. 이 명령어를 통해 새로운 봇을 생성할 수 있습니다.
    4. 봇 이름 설정: 봇의 이름을 입력합니다. 이 이름은 봇이 나타낼 이름이며 사용자에게 보여지는 것입니다. 원하는 이름을 입력한 후 엔터를 누릅니다.
    5. 봇 사용자명 설정: 봇의 사용자명(유저네임)을 입력합니다. 이 사용자명은 봇을 식별하는 고유한 값이므로 고유하게 설정해야 합니다. 입력한 사용자명은 반드시 "bot"으로 끝나야 하며, 다른 봇과 중복되지 않아야 합니다. 유효한 사용자명을 입력한 후 엔터를 누릅니다.
    6. 봇 토큰 발급: BotFather가 봇 토큰을 생성하고 제공합니다. 이 토큰은 봇을 인증하고 API와 통신하는 데 사용됩니다. 토큰은 알파벳과 숫자로 구성된 긴 문자열입니다. 토큰은 안전하게 보관되어야 하므로 노출되지 않도록 주의해야 합니다.
    7. 봇 설정 완료: 봇 토큰을 받은 후, 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

    댓글