Telegram Botを使う


https://telegrambots.github.io/book/1/quickstart.html

#### Hello World

>　前提条件 Telegramがインストールされていること

#### アクセストークンを取得する

##### TelegramのBotFatherにアクセスする

[https://t.me/botfather](https://t.me/botfather)

このような画面が出ます。

<img width="500" alt="Screenshot from 2022-05-12 20-29-38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/aa77830a-d630-0864-c15c-28b4a5b8b491.png">

startと入力します。

```shell
/start
```

<img width="500" alt="Screenshot from 2022-05-12 20-25-21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/ba7badad-076f-8dac-a58a-fb96b20f290f.png">

/newbotと入力し、ボットの名前を決めます。

```shell
/newbot
```

**ボットの名前を決めます。名前の後に_bot or Botと必ず記入します。**

ボットの名前に被りがなければこのような画面でて**アクセストークン**と**アクセスURL**を取得できます。

<img width="500" alt="Screenshot from 2022-05-12 20-25-59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/7b8bc26a-dec9-c069-4c5d-45006d3ba81c.png">

**https://t.me/決めたボットの名前_bot**

#### C# コンソール側

#### NugetからTelegram.Botパッケージをインストール

```sh
dotnet add package Telegram.Bot
```

アクセストークンを記入し、結果が正しく返ってきたら初期セットアップは完了です。

```cs
using System;
using System.Diagnostics;
using Telegram.Bot;

namespace TelegramApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
 
            var botClient = new TelegramBotClient("アクセストークン");

            var me = await botClient.GetMeAsync();
            Console.WriteLine($"Hello, World! I am user {me.Id} and my name is {me.FirstName}.");

        }
    }
}

```

### Sampleを試してみる

Telegram.Bot.Extensions.PollingをNugetで追加

```sh
dotnet add package Telegram.Bot.Extensions.Polling
```

サンプルはここにあります

https://github.com/TelegramBots/Telegram.Bot.Examples

https://telegrambots.github.io/book/1/example-bot.html

実行するとリスニング状態になります。

**https://t.me/決めたボットの名前_bot**

リンクをクリックして入ります。

<img width="350" alt="Screenshot from 2022-05-13 01-22-45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/dfc10d50-ab12-c625-5e30-7eb1454cd685.png">

```cs
using System;
using System.Diagnostics;
using Telegram.Bot;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Extensions.Polling;

using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;

namespace TelegramApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
 
            var botClient = new TelegramBotClient("アクセストークン");

            using var cts = new CancellationTokenSource();

            // StartReceiving does not block the caller thread. Receiving is done on the ThreadPool.
            var receiverOptions = new ReceiverOptions
            {
                AllowedUpdates = Array.Empty<UpdateType>() // receive all update types
            };
            
            botClient.StartReceiving(updateHandler: HandleUpdateAsync,
                errorHandler: HandlePollingErrorAsync,
                receiverOptions: new ReceiverOptions()
                {
                    AllowedUpdates = Array.Empty<UpdateType>()
                },
                cancellationToken: cts.Token);

            var me = await botClient.GetMeAsync();

            Console.WriteLine($"Start listening for @{me.Username}");
            Console.ReadLine();

            // Send cancellation request to stop bot
            cts.Cancel();

        }

        static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
        {
            // Only process Message updates: https://core.telegram.org/bots/api#message
            if (update.Type != UpdateType.Message)
                return;
            // Only process text messages
            if (update.Message!.Type != MessageType.Text)
                return;

            var chatId = update.Message.Chat.Id;
            var messageText = update.Message.Text;

            Console.WriteLine($"Received a '{messageText}' message in chat {chatId}.");

            // Echo received message text
            Message sentMessage = await botClient.SendTextMessageAsync(
                chatId: chatId,
                text: "You said:\n" + messageText,
                cancellationToken: cancellationToken);
        }
        static Task HandlePollingErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
        {
            var ErrorMessage = exception switch
            {
                ApiRequestException apiRequestException
                    => $"Telegram API Error:\n[{apiRequestException.ErrorCode}]\n{apiRequestException.Message}",
                _ => exception.ToString()
            };

            Console.WriteLine(ErrorMessage);
            return Task.CompletedTask;
        }
    }
}
```

[C#からPythonでWebApiのデータを取得する](https://qiita.com/iota_11/items/2435e0334a12ee1ff4d7)に続く