먹는게 남는거다!

[크롬북으로 개발하기] 원격접속시 텔레그램 메시지 받기 : 5. 전송 프로그램 만들기 (C#)

C#, ASP.NET

드디어 모든 개발 환경이 구축되었기 때문에 본격적인 개발을 시작하려 합니다.

사실 개발할 프로그램은 단순합니다. 입력받은 메시지를 텔레그램봇에게 전송하는 것이 전부입니다.


소스도 정말 간단해서 기본 콘솔 프로그램 클래스와 텔레그램 전송 클래스만으로 구성되어 있습니다.

텔레그램 메시지 전송 클래스 (\src\TelegramBot.cs)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using System;
using System.Net;
using System.Net.Cache;
using System.Text;
using System.IO;
 
public class TelegramBot
{
    private static readonly string _baseUrl = "https://api.telegram.org/bot";
    private static readonly string _token = "xxxxxxxxx:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    private static readonly string _chatId = "xxxxxxxx";
 
    /// <summary>
    /// 텔레그램봇에게 메시지를 보냅니다.
    /// </summary>
    /// <param name="text">보낼 메시지</param>
    /// <param name="errorMessage">오류 메시지</param>
    /// <returns>결과</returns>
    public static bool SendMessage(string text, out string errorMessage)
    {
        return SendMessage(_chatId, text, out errorMessage);
    }
    
    /// <summary>
    /// 텔레그램봇에게 메시지를 보냅니다.
    /// </summary>
    /// <param name="chatId">chat id</param>
    /// <param name="text">보낼 메시지</param>
    /// <param name="errorMessage">오류 메시지</param>
    /// <returns>결과</returns>
    public static bool SendMessage(string chatId, string text, out string errorMessage)
    {
        string url = string.Format("{0}{1}/sendMessage", _baseUrl, _token);
        
        HttpWebRequest req = WebRequest.Create(new Uri(url)) as HttpWebRequest;
        req.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.NoCacheNoStore);
        req.Timeout = 30 * 1000;        
        req.Method = "POST";
        req.ContentType = "application/json";
 
        string json = String.Format("{{\"chat_id\":\"{0}\", \"text\":\"{1}\"}}", chatId, EncodeJsonChars(text));
        byte[] data = UTF8Encoding.UTF8.GetBytes(json);
        req.ContentLength = data.Length;
        using (Stream stream = req.GetRequestStream())
        {
            stream.Write(data, 0, data.Length);
            stream.Flush();
        }
 
        HttpWebResponse httpResponse = null;
        try
        {
            httpResponse = req.GetResponse() as HttpWebResponse;
            if (httpResponse.StatusCode == HttpStatusCode.OK)
            {
                string responseData = null;
                using (Stream responseStream = httpResponse.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(responseStream, UTF8Encoding.UTF8))
                    {
                        responseData = reader.ReadToEnd();
                    }
                }
                
                if (0 < responseData.IndexOf("\"ok\":true"))
                {
                    errorMessage = String.Empty;
                    return true;
                }
                else
                {
                    errorMessage = String.Format("결과 json 파싱 오류 ({0})", responseData);
                    return false;
                }
            }
            else
            {
                errorMessage = String.Format("Http status: {0}", httpResponse.StatusCode);
                return false;
            }
        }
        catch (Exception ex)
        {
            errorMessage = ex.Message;
            return false;
        }
        finally
        {
            if (httpResponse != null)
                httpResponse.Close();
        }
    }
    
    private static string EncodeJsonChars(string text)
    {
        return text.Replace("\b""\\\b")
            .Replace("\f""\\\f")
            .Replace("\n""\\\n")
            .Replace("\r""\\\r")
            .Replace("\t""\\\t")
            .Replace("\"""\\\"")
            .Replace("\\", "\\\\");
    }
}
    
cs


텔레그램에서 제공하는 Web api를 호출하는 것이 주 내용입니다.

위 코드 중에서 _token, _chatId는 이전 포스트([크롬북으로 개발하기] 원격접속시 텔레그램 메시지 받기 : 2. 텔레그램봇 생성하기)에서 발급받은 token과 chat id를 입력하시면 됩니다.

콘솔 프로그램 클래스 (\src\main.cs)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
 
public class RemoteAlert 
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Telegram Remote Alert v0.1\n\n");
        
        if (args.Length == 0)
        {
            Console.WriteLine("사용 예) TelegramRemoteAlert.exe \"보낼 내용\"");
            return;
        }
        
        string text = args[0];
        string errorMessage = null;
        bool ret = TelegramBot.SendMessage(text, out errorMessage);
        
        if (ret)
            Console.WriteLine(String.Format("발송: {0}", text));
        else
            Console.WriteLine(String.Format("오류: {0}", errorMessage));
    }
}
cs


위의 코드를 컴파일 후 cmd 창에서 아래와 같이 입력하면 메시지가 전송되는 것을 확인할 수 있습니다.


실행파일.exe "보낼 메시지"



위 화면은 cloud ide인 goorm.io에서 컴파일 후 실행한 모습입니다.

"발송: 메시지 왔숑! 메시지 왔숑!"에서 메시지가 성공적으로 발송된 것을 알 수 있습니다.



이제 해당 프로그램을 윈도우 시작 프로그램에 등록만 해주면 윈도우 시작 때마다

텔레그램으로 메시지를 받을 수 있습니다.


- 끝 -