概要
curl + Telegram bot でこんなことが実現できる。
- サーバーの処理が終わったらスマホに通知
- スマホからサーバーにメッセージを送信
Telegram とは
- ラインのようなメッセージアプリ
- 無料
- 有償プランもあるが、普通に使う分には無料で十分
- プロトコルがオープン
- クライアントがクロスプラットフォーム
- https://telegram.org/apps
- アプリ: Android、iOS、Windows、Mac、Linux 系
- Web ブラウザ、python、curl 等
今回は curl + Telegram で、スマホ <-> サーバー間のメッセージの送受信をやってみる。
手順
1. bot を作成する
bot = REST API エンドポイント。
@BotFather にチャットを送信することで、bot が作成できる。
/start
を送信するとヘルプが表示される。
/newbot
を送信し、指示に従い bot を作成する。
- 今回の設定:
- 表示名:
My 20230223 Bot
- アカウント名:
@my20230223_bot
(末尾は必ず_bot
)
- 表示名:
bot が作成され、トークンが表示された。※bot は削除済み
$ 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 にチャットを送信する。
/getUpdates メソッドで、bot が直近24時間に受信したメッセージが取得できる。
※result:[]
のように結果が空になる場合は、/getUpdates
とチャット送信を何度か繰り返すとメッセージを取得できるようになる。初回の /getUpdates
以降に bot が受信したメッセージのみ取得できる?
$ 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 にも対応している。
chat_id について
bot がチャットする相手は bot の作成者だけとは限らない。
bot はいろんなユーザーとチャットを行ったりグループチャットに参加できる。
チャットを一意に識別するために、チャットごとに chat_id
が払い出される。
chat_id
は、/getUpdates
の結果の id
に書いてある。
今回のチャットの chat_id
は 5981890605
と分かる。
$ chat_id=5981890605
bot からユーザーにメッセージを送信 (/sendMessage
)
/sendMessage メソッドで、bot からユーザーにメッセージを送信できる。
※chat_id
による送信先チャットの指定が必要。
$ 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
を送信できた。