C#을 이용한 텔레그램 봇 생성 및 메시지 전송 가이드

Daeho Song

C#을 이용한 텔레그램 봇 생성 및 메시지 전송 가이드

텔레그램 봇은 자동화된 작업을 수행하고 사용자와 상호작용할 수 있는 강력한 도구입니다. 이 가이드에서는 텔레그램 봇을 처음부터 만들고 C#을 사용하여 메시지를 보내는 방법을 단계별로 설명합니다.

목차

  1. 텔레그램 봇 생성하기
  2. 개발 환경 설정
  3. C# 프로젝트 설정
  4. 텔레그램 API 연동하기
  5. 메시지 보내기 기능 구현
  6. 메시지 수신 및 응답하기
  7. 샘플 코드 전체
  8. 배포 및 운영 팁

1. 텔레그램 봇 생성하기

텔레그램 봇을 만들기 위해서는 먼저 BotFather를 통해 봇을 생성해야 합니다.

  1. 텔레그램 앱을 열고 검색창에 @BotFather를 입력합니다.
  2. BotFather와의 채팅을 시작하고 /newbot 명령어를 입력합니다.
  3. 봇의 이름을 입력합니다 (예: "My Test Bot").
  4. 봇의 사용자 이름을 입력합니다. 사용자 이름은 반드시 'bot'으로 끝나야 합니다 (예: "my_test_bot").
  5. 성공적으로 봇이 생성되면 BotFather가 HTTP API 토큰을 제공합니다. 이 토큰은 매우 중요하니 안전하게 보관하세요.
예시 토큰: 1234567890:ABCdefGhIJklMNoPQRstUVwxYZ

2. 개발 환경 설정

C#으로 텔레그램 봇을 개발하기 위한 환경을 설정합니다.

  1. Visual Studio 또는 Visual Studio Code를 설치합니다.
  2. .NET 6.0 SDK 이상을 설치합니다.

3. C# 프로젝트 설정

  1. 새 콘솔 애플리케이션 프로젝트를 생성합니다:
dotnet new console -n TelegramBotApp cd TelegramBotApp
  1. 텔레그램 봇 API를 사용하기 위한 NuGet 패키지를 설치합니다:
dotnet add package Telegram.Bot

4. 텔레그램 API 연동하기

Program.cs 파일을 열고 기본 코드를 다음과 같이 작성합니다:

using System; using System.Threading; using System.Threading.Tasks; using Telegram.Bot; namespace TelegramBotApp { class Program { static async Task Main(string[] args) { // 봇 토큰 설정 (BotFather에서 받은 토큰) var botToken = "YOUR_BOT_TOKEN_HERE"; // TelegramBotClient 인스턴스 생성 var botClient = new TelegramBotClient(botToken); // 봇 정보 가져오기 var me = await botClient.GetMeAsync(); Console.WriteLine($"Bot 시작: @{me.Username}"); // 프로그램이 종료되지 않도록 대기 Console.ReadLine(); } } }

YOUR_BOT_TOKEN_HERE 부분을 BotFather에서 받은 실제 토큰으로 교체하세요.

5. 메시지 보내기 기능 구현

특정 채팅에 메시지를 보내는 기능을 추가합니다:

static async Task SendMessageAsync(ITelegramBotClient botClient, string chatId, string message) { try { await botClient.SendTextMessageAsync( chatId: chatId, text: message ); Console.WriteLine($"메시지 발송 완료: {message}"); } catch (Exception ex) { Console.WriteLine($"메시지 발송 오류: {ex.Message}"); } }

그리고 Main 메서드에서 이 함수를 호출합니다:

// 메시지 보내기 예제 // 여기서 chatId는 메시지를 받을 사용자 또는 그룹의 ID입니다 // 봇과 대화를 시작한 사용자의 ID를 알아내려면 먼저 봇에게 메시지를 보내고 업데이트를 받아야 합니다 var chatId = "RECIPIENT_CHAT_ID"; // 예: "123456789" await SendMessageAsync(botClient, chatId, "안녕하세요! 저는 C#으로 만든 텔레그램 봇입니다.");

채팅 ID 알아내기

채팅 ID를 알아내기 위한 간단한 방법은 사용자가 봇에게 메시지를 보내게 한 다음, 업데이트를 받아 확인하는 것입니다. 다음과 같이 코드를 추가할 수 있습니다:

// 업데이트 수신 설정 using var cts = new CancellationTokenSource(); // 업데이트 핸들러 등록 botClient.StartReceiving( HandleUpdateAsync, HandleErrorAsync, new Telegram.Bot.Polling.ReceiverOptions(), cts.Token ); // 몇 초 동안 메시지 대기 Console.WriteLine("봇이 메시지를 기다리는 중입니다. 봇에게 메시지를 보내보세요..."); await Task.Delay(TimeSpan.FromSeconds(30)); // UpdateHandler 함수 정의 async Task HandleUpdateAsync(ITelegramBotClient botClient, Telegram.Bot.Types.Update update, CancellationToken cancellationToken) { // 메시지가 없으면 무시 if (update.Message is not { } message) return; // 텍스트 메시지가 아니면 무시 if (message.Text is not { } messageText) return; var chatId = message.Chat.Id; Console.WriteLine($"사용자 채팅 ID: {chatId}, 메시지: {messageText}"); // 받은 메시지에 응답 await botClient.SendTextMessageAsync( chatId: chatId, text: $"당신의 채팅 ID는 {chatId}입니다.", cancellationToken: cancellationToken ); } // ErrorHandler 함수 정의 Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken) { var ErrorMessage = exception switch { Telegram.Bot.Exceptions.ApiRequestException apiRequestException => $"텔레그램 API 오류:\n{apiRequestException.ErrorCode}\n{apiRequestException.Message}", _ => exception.ToString() }; Console.WriteLine(ErrorMessage); return Task.CompletedTask; }

6. 메시지 수신 및 응답하기

지속적으로 메시지를 수신하고 응답하는 봇을 만들기 위해 다음과 같이 코드를 작성합니다:

using System; using System.Threading; using System.Threading.Tasks; using Telegram.Bot; using Telegram.Bot.Exceptions; using Telegram.Bot.Polling; using Telegram.Bot.Types; using Telegram.Bot.Types.Enums; namespace TelegramBotApp { class Program { static async Task Main(string[] args) { var botToken = "YOUR_BOT_TOKEN_HERE"; var botClient = new TelegramBotClient(botToken); using var cts = new CancellationTokenSource(); // 업데이트 수신 옵션 설정 var receiverOptions = new ReceiverOptions { AllowedUpdates = Array.Empty<UpdateType>() // 모든 업데이트 유형 수신 }; // 봇 시작 botClient.StartReceiving( updateHandler: HandleUpdateAsync, errorHandler: HandleErrorAsync, receiverOptions: receiverOptions, cancellationToken: cts.Token ); var me = await botClient.GetMeAsync(); Console.WriteLine($"봇 @{me.Username} 시작됨"); // 콘솔 입력을 통해 봇 종료 가능 Console.WriteLine("봇을 종료하려면 아무 키나 누르세요"); Console.ReadKey(); // 봇 종료 cts.Cancel(); } static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) { // 메시지가 없으면 무시 if (update.Message is not { } message) return; // 텍스트 메시지가 아니면 무시 if (message.Text is not { } messageText) return; var chatId = message.Chat.Id; Console.WriteLine($"{message.Chat.FirstName} ({chatId}): {messageText}"); // 메시지 내용에 따라 다른 응답 string responseText = messageText.ToLower() switch { "/start" => "안녕하세요! 저는 C#으로 만든 텔레그램 봇입니다.", "안녕" or "안녕하세요" => $"안녕하세요, {message.Chat.FirstName}님!", "시간" => $"현재 시간은 {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}입니다.", _ => $"받은 메시지: {messageText}" }; // 응답 메시지 전송 await botClient.SendTextMessageAsync( chatId: chatId, text: responseText, cancellationToken: cancellationToken ); } static Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken) { var ErrorMessage = exception switch { ApiRequestException apiRequestException => $"텔레그램 API 오류:\n{apiRequestException.ErrorCode}\n{apiRequestException.Message}", _ => exception.ToString() }; Console.WriteLine(ErrorMessage); return Task.CompletedTask; } } }

7. 샘플 코드 전체

아래는 텔레그램 봇에 메시지를 보내는 간단한 C# 콘솔 애플리케이션의 전체 코드입니다:

using System; using System.Threading; using System.Threading.Tasks; using Telegram.Bot; using Telegram.Bot.Exceptions; using Telegram.Bot.Polling; using Telegram.Bot.Types; using Telegram.Bot.Types.Enums; namespace TelegramBotApp { class Program { static async Task Main(string[] args) { // 봇 토큰 설정 (BotFather에서 받은 토큰) var botToken = "YOUR_BOT_TOKEN_HERE"; // TelegramBotClient 인스턴스 생성 var botClient = new TelegramBotClient(botToken); Console.WriteLine("1. 봇 정보 확인"); Console.WriteLine("2. 특정 사용자에게 메시지 보내기"); Console.WriteLine("3. 메시지 수신 모드 시작"); Console.Write("원하는 작업을 선택하세요 (1-3): "); var choice = Console.ReadLine(); switch (choice) { case "1": // 봇 정보 가져오기 var me = await botClient.GetMeAsync(); Console.WriteLine($"봇 이름: {me.FirstName}"); Console.WriteLine($"봇 사용자명: @{me.Username}"); Console.WriteLine($"봇 ID: {me.Id}"); break; case "2": // 특정 사용자에게 메시지 보내기 Console.Write("메시지를 보낼 채팅 ID를 입력하세요: "); var chatId = Console.ReadLine(); Console.Write("보낼 메시지를 입력하세요: "); var messageText = Console.ReadLine(); await SendMessageAsync(botClient, chatId, messageText); break; case "3": // 메시지 수신 모드 시작 await StartReceivingMessages(botClient); break; default: Console.WriteLine("잘못된 선택입니다."); break; } Console.WriteLine("프로그램을 종료하려면 아무 키나 누르세요..."); Console.ReadKey(); } static async Task SendMessageAsync(ITelegramBotClient botClient, string chatId, string message) { try { var sentMessage = await botClient.SendTextMessageAsync( chatId: chatId, text: message ); Console.WriteLine($"메시지 발송 완료: {message}"); } catch (Exception ex) { Console.WriteLine($"메시지 발송 오류: {ex.Message}"); } } static async Task StartReceivingMessages(ITelegramBotClient botClient) { using var cts = new CancellationTokenSource(); // 업데이트 수신 옵션 설정 var receiverOptions = new ReceiverOptions { AllowedUpdates = Array.Empty<UpdateType>() // 모든 업데이트 유형 수신 }; // 업데이트 핸들러 등록 botClient.StartReceiving( updateHandler: HandleUpdateAsync, errorHandler: HandleErrorAsync, receiverOptions: receiverOptions, cancellationToken: cts.Token ); var me = await botClient.GetMeAsync(); Console.WriteLine($"봇 @{me.Username} 메시지 수신 모드 시작됨"); Console.WriteLine("수신 모드를 종료하려면 아무 키나 누르세요..."); Console.ReadKey(); cts.Cancel(); } static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) { // 메시지가 없으면 무시 if (update.Message is not { } message) return; // 텍스트 메시지가 아니면 무시 if (message.Text is not { } messageText) return; var chatId = message.Chat.Id; Console.WriteLine($"메시지 수신: {message.Chat.FirstName} ({chatId}): {messageText}"); // 메시지 내용에 따라 다른 응답 string responseText = messageText.ToLower() switch { "/start" => "안녕하세요! 저는 C#으로 만든 텔레그램 봇입니다.", "안녕" or "안녕하세요" => $"안녕하세요, {message.Chat.FirstName}님!", "시간" => $"현재 시간은 {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}입니다.", _ => $"받은 메시지: {messageText}" }; // 응답 메시지 전송 await botClient.SendTextMessageAsync( chatId: chatId, text: responseText, cancellationToken: cancellationToken ); } static Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken) { var ErrorMessage = exception switch { ApiRequestException apiRequestException => $"텔레그램 API 오류:\n{apiRequestException.ErrorCode}\n{apiRequestException.Message}", _ => exception.ToString() }; Console.WriteLine(ErrorMessage); return Task.CompletedTask; } } }

8. 배포 및 운영 팁

웹후크 vs 폴링

텔레그램 봇 API를 사용하는 방법은 두 가지가 있습니다:

  1. 폴링(Long Polling): 위 예제에서 사용한 방식으로, 봇이 주기적으로 텔레그램 서버에 업데이트가 있는지 확인합니다.
  2. 웹후크(Webhook): 텔레그램 서버가 업데이트가 있을 때마다 지정된 URL로 HTTP 요청을 보내는 방식입니다.

웹후크 방식은 서버가 있을 때 더 효율적입니다. 웹후크를 사용하려면 ASP.NET Core 웹 애플리케이션을 만들어 HTTPS 엔드포인트를 제공해야 합니다.

배포 옵션

  1. VPS/클라우드 서버: DigitalOcean, AWS, Azure 등에 배포
  2. Azure Functions: 서버리스 옵션으로 비용 효율적
  3. Windows 서비스: 자체 서버에 윈도우 서비스로 실행

보안 팁

  1. 봇 토큰은 민감한 정보이므로 코드에 하드코딩하지 말고 환경 변수나 설정 파일에 저장하세요.
  2. HTTPS를 사용하여 안전한 통신을 보장하세요.
  3. 봇이 접근할 수 있는 사용자를 제한하는 것이 좋습니다.

텔레그램 봇 명령어 등록

BotFather를 통해 봇 명령어를 등록하면 사용자가 봇과 더 쉽게 상호작용할 수 있습니다:

  1. BotFather와 채팅을 시작합니다.
  2. /mybots 명령어를 입력합니다.
  3. 원하는 봇을 선택합니다.
  4. Edit Bot > Edit Commands를 선택합니다.
  5. 명령어 목록을 다음 형식으로 입력합니다:
    start - 봇 시작하기
    help - 도움말 보기
    time - 현재 시간 확인하기
    

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.