curlでTelegram botを操作

# 概要
curl + Telegram bot でこんなことが実現できる。

- サーバーの処理が終わったらスマホに通知
- スマホからサーバーにメッセージを送信

# Telegram とは
- ラインのようなメッセージアプリ
- 無料
    - 有償プランもあるが、普通に使う分には無料で十分
- プロトコルがオープン
- クライアントがクロスプラットフォーム
    - https://telegram.org/apps
    - アプリ: Android、iOS、Windows、Mac、Linux 系
    - Web ブラウザ、python、curl 等

チャット画面例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101023/76a9f086-9f11-2d8b-8f1a-b2f9c551c116.png)

今回は curl + Telegram で、スマホ <-> サーバー間のメッセージの送受信をやってみる。

# 手順
## 1. bot を作成する
bot = REST API エンドポイント。

[@BotFather](https://telegram.me/BotFather) にチャットを送信することで、bot が作成できる。

https://telegram.me/BotFather

`/start` を送信するとヘルプが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101023/f0f54d11-74ec-8d53-0709-e62371ba0618.png)

`/newbot` を送信し、指示に従い bot を作成する。
- 今回の設定:
    - 表示名: `My 20230223 Bot`
    - アカウント名: `@my20230223_bot` (末尾は必ず `_bot`)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101023/52f31425-294b-e345-1483-fd1773075c31.png)

bot が作成され、トークンが表示された。※bot は削除済み
```shell:トークンをシェル変数に保存
$ token=6242345480:AAEm6fDDg1Ww5OAN4aDmkABqILDE0-ss18Q
```

なお、公式には書いていないが、bot は1人20個までらしい?

REST API エンドポイントは
`https://api.telegram.org/bot<token>`
なので、今回は
`https://api.telegram.org/bot6242345480:AAEm6fDDg1Ww5OAN4aDmkABqILDE0-ss18Q`
となる。

## bot が受信したメッセージを取得 (/getUpdates)
http://t.me/my20230223_bot にアクセスし、自身のアカウントから bot にチャットを送信する。

右上の START を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101023/7a402976-41e6-14d0-d3a8-88603030f6cf.png)

`test1` と送信する。(なんでもいい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101023/10c3a582-23a0-61da-b082-fe8346f18264.png)

[/getUpdates](https://core.telegram.org/bots/api#getupdates) メソッドで、bot が直近24時間に受信したメッセージが取得できる。
※`result:[]` のように結果が空になる場合は、`/getUpdates` とチャット送信を何度か繰り返すとメッセージを取得できるようになる。初回の `/getUpdates` 以降に bot が受信したメッセージのみ取得できる?

```shell:/getUpdates で直近24時間のチャットを取得
$ curl https://api.telegram.org/bot$token/getUpdates
{"ok":true,"result":[{"update_id":721386731,
"message":{"message_id":2,"from":{"id":5981890605,"is_bot":false,"first_name":"yabeenico","language_code":"en"},"chat":{"id":5981890605,"first_name":"yabeenico","type":"private"},"date":1677165363,"text":"test1"}}]}
```

なお、[webhook](https://core.telegram.org/bots/api#setwebhook) にも対応している。

## chat_id について
bot がチャットする相手は bot の作成者だけとは限らない。
bot はいろんなユーザーとチャットを行ったりグループチャットに参加できる。
チャットを一意に識別するために、チャットごとに `chat_id` が払い出される。
`chat_id` は、`/getUpdates` の結果の `id` に書いてある。
今回のチャットの `chat_id` は `5981890605` と分かる。

```shell:chat_id をシェル変数に保存
$ chat_id=5981890605
```

## bot からユーザーにメッセージを送信 (`/sendMessage`)
[/sendMessage](https://core.telegram.org/bots/api#sendmessage) メソッドで、bot からユーザーにメッセージを送信できる。
※`chat_id` による送信先チャットの指定が必要。

```shell:/sendMessage で bot からユーザーにメッセージを送信
$ curl https://api.telegram.org/bot$token/sendMessage -d chat_id=$chat_id -d text=test2
{"ok":true,"result":{"message_id":3,"from":{"id":6242345480,"is_bot":true,"first_name":"My 20230223 Bot","username":"my20230223_bot"},"chat":{"id":5981890605,"first_name":"yabeenico","type":"private"},"date":1677167043,"text":"test2"}}
```

bot からユーザーに `test2` を送信できた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101023/76a9f086-9f11-2d8b-8f1a-b2f9c551c116.png)