🦔

Telegramにメッセージを送るプログラムを書いてみた

2023/07/26に公開

はじめに

とある業務の実装がブラックボックス化されており、つい最近になってソースを見れる状況になリました。
アプリの状況を伝えるために様々な通知やメッセージ送信が使われており、
その中で、扱った事がないサービスがいくつかありましたので、
その中でも気になったTelegramの使用感を試してみました。

Teregramとは

いわゆるメッセンジャーアプリです。
メッセンジャーアプリといえば日本ではLINEが有名ですが、
世界的に見るとTelegramの方が有名だったりします。
Wikipedia情報によると、特にロシアや旧ソ連圏の国では一番使われているアプリのようです。
他にはWhatsAppやWeChat、Facebook Messengerなども有名ですね。

日本

全世界

ロシア

改めて見るとWhatsAppが圧倒的

https://telegram.org/

Telegramにメッセージを送るためにはどうするか

Telegram APIBot APIを用いることでTelegramに対して様々な操作を送ることが可能です。
ページ構成が結構見づらく、導入ページを探すために文章読み、その中のリンク開いてみないとわからない感じでした。
ページ内検索があると良いのですが。

ページ上部のメニューからAPIをクリック
https://core.telegram.org/api
からの、 Bot APIの説明文中のリンクLearn more about the Bot API here »をクリック
https://core.telegram.org/bots
このページの一番下にある3つのリンクが実装において参考になりそうです。

  • Full API Reference for Developers APIリファレンス
  • Basic Tutorial: From @BotFather to 'Hello World' チュートリアル
  • Code Examples コードサンプル

と言うことで、チュートリアル見ながら進めていき、困ったらリファレンス見ていくのが良さそうですね。
https://core.telegram.org/bots/tutorial

実装に困ったら、コードサンプルのページにあるGithubのリンクからソースを見ることで、ヒントが得られるかもしれません。

Telegramにメッセージを送るサンプル

Telegram Bot APIは HTTPS 経由で提供されているようです。
ちなみに、Java、C#、Python、Go、TypeScriptなど各種言語のSDKも用意されています。
今回は元々のチュートリアルで示されているHTTPS経由のリクエストで試していきます。

URLの形式

https://api.telegram.org/bot<token>/<METHOD_NAME>
  • <token>にボットのトークン
  • <METHOD_NAME>は操作したいAPIの名前を指定します。

ボットのトークンを取得する

まずはアクセスするURLの一部であるトークンを取得します。
よくあるサービスではログインした後の管理メニューでAPIキーの発行ができたりするのですが、ちょっと違うようです。

トークンの取得は、@BotFatherを用いて、/newbotコマンドを実行することで発行されるようです。
なので、一旦立ち止まって@BotFatherを使えるようにします。
そのためにはTelegramのアプリが必要なのでインストールしておきましょう。
詰まるところはあまりないかもですが、下記手順でインストールしました。
Telegramアプリケーションのインストールと初期設定

BotFatherの導入

https://t.me/botfather にアクセスすると、下記のようなページが表示されます。

RESTARTをタップすると、下記のように使えるコマンドがズラーっと表示されます。

ボットの作成

トークンを発行するにはボットを作る必要があるため、ボットを作っていきます。

チュートリアルにあるように/newbotを入力するか、
右下にあるメニューからcreate a new botでボットを作成します。

アプリ名を決める
ここでは単純にnotificationとしました。
入力は、BotFatherに対してチャットでメッセージを送ることで決めていきます。
ユーザー名を決める
ここではkat_test_botとしました。
注意点としては、名前の最後はbotで終わる必要があります。
あまりに単純な名前だと既に使われているようで、使えません。
長さは 5 ~ 32 文字、大文字小文字の区別はなし、支える文字種は英数字+「_」
また、一度決めると変えられないので、実際に使用するアプリでは慎重に決めましょう。
ユーザ名の仕様の詳細については下記に記載があります。
https://core.telegram.org/bots/features#creating-a-new-bot

トークンが発行されます。

画像では見えていないですが、一番下のメッセージの中にトークンが含まれています。
以下のように数値:英字の組み合わせになっています。

110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw

メッセージの全体

Done! Congratulations on your new bot. You will find it at t.me/kat_test_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw
Keep your token secure and store it safely, it can be used by anyone to control your bot.

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

※ここで表示されているトークンは適当な値です。
※メッセージ内のt.me/<botユーザ名>のリンクをタップしておきます。
   おそらくこれをしないと後述のグループの追加時にボットが候補に出てこないです。

トークンの扱いについて

トークンは非常に重要な情報であり、不適切に扱うと大きなセキュリティリスクとなります。以下にトークンの取り扱いにおける主な注意点です。

  • 公開しない:
    トークンは、あなたのアプリケーションやサービスを認証するための秘密の鍵と考えてください。この情報が漏洩すると、不正利用される可能性があります。したがって、GitHubなどの公開された場所に直接書き込まないように注意してください。

  • 環境変数を使用する:
    トークンをコードに直接書き込む代わりに、環境変数を使用して保管することを検討してみてください。これにより、コード自体には機密情報が含まれず、環境ごとに異なる設定を行うことも可能になります。

  • 定期的に更新する:
    可能であれば、トークンを定期的に更新することを検討してみてください。これにより、もしトークンが漏洩したとしても、その影響を最小限に抑えることができます。

  • アクセス権を最小限にする:
    トークンが提供するアクセス権は最小限に抑えるべきです。不必要に広範な権限を持つトークンは、漏洩した場合のリスクが大きくなります。

  • トークンの使用を監視する:
    トークンの使用状況を定期的に確認し、不審なアクティビティを発見した場合はすぐにそのトークンを無効化します。これは、トークンが漏洩した場合や不正利用された場合に、問題を早期に検出するのに役立ちます。

以上のような注意点を守ることで、トークンの安全性を確保し、あなたのサービスを保護することができます。

メッセージを送るAPI

メッセージを送るAPIはsendMessageです。
詳細は以下
https://core.telegram.org/bots/api#sendmessage

chat_idとtextのみ必須であとは必要に応じて指定できるようです。
では、必要な情報をそろえていきましょう。

chat_idを取得する

ここまで来たらサクッといけるかと思いきや意外と面倒でした。

ざっくり手順は以下

  1. ボットがメッセージを受け取るグループを作ります。
  2. 作ったグループに、先ほど作ったボットをメンバーとして追加します。 ここまでは下準備
  3. 作ったグループチャットで適当にメッセージを送ります。※スラッシュ付きで送るのがポイント
    ここでは「/test」と送っています。
  4. メッセージを送ったら下記URLにアクセス。tokenは先ほどのと同じです。
    • https://api.telegram.org/bot<token>/getUpdates
      スラッシュ付きでメッセージを送らないと送ったメッセージが確認できません。
  5. 先ほど送った「/test」のメッセージがJSON形式で確認できます。
  6. chatの中にあるidの値がchat_idです。先頭のマイナス(-)も含めてidです。
    ※説明が優しくなくてすみません。余裕ができたら補足します。
{
    "update_id": 1234567890,
    "message": {
        "message_id": 12,
        "from": {
            "id": 123456789013,
            "is_bot": true,
            "first_name": "Group",
            "username": "GroupAnonymousBot"
        },
        "sender_chat": {
            "id": -123456789012,
            "title": "testgroup",
            "type": "supergroup"
        },
        "chat": {
            "id": -123456789012,   ← コレです
            "title": "testgroup",
            "type": "supergroup"
        },
        "date": 1689697211,
        "text": "/test",           ← 送ったメッセージ
        "entities": [
            {
                "offset": 0,
                "length": 8,
                "type": "bot_command"
            }
        ]
    }
}

メッセージを送る

チュートリアルはjavaでの実装例となっており、他の言語の場合は色々な方が提供しているライブラリから選んでね、な感じでした。
https://core.telegram.org/bots/samples

コードはChatGPTにチャチャっと書いてもらいます。

main.go

package main

import (
	"fmt"
	"net/http"
	"net/url"
	"os"

	"github.com/joho/godotenv"
)

func main() {
	err := godotenv.Load()
	if err != nil {
		fmt.Println("Error loading .env file")
		os.Exit(1)
	}

	botToken := os.Getenv("YOUR_BOT_TOKEN")
	chatID := os.Getenv("YOUR_CHAT_ID")

	baseURL := "https://api.telegram.org/bot"
	endpoint := baseURL + botToken + "/sendMessage"

	message := "Hello, World!"
	resp, err := http.PostForm(
		endpoint,
		url.Values{
			"chat_id": {chatID},
			"text":    {message},
		},
	)

	if err != nil {
		fmt.Println("Error sending message:", err)
		os.Exit(1)
	}

	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		fmt.Println("Unexpected status code:", resp.StatusCode)
	}
	fmt.Println(resp.Body)
}

.env

同じ階層に.envファイルを置いて下記のように定義します。

YOUR_BOT_TOKEN=your-bot-token
YOUR_CHAT_ID=your-chat-id

YOUR_BOT_TOKEN・・・先ほど生成したトークンを指定します。
YOUR_CHAT_ID・・・先ほど取得したchart_idを指定します。

実行

go run main.go

と言うことで、無事メッセージを送る事ができました。

最後に

chat_idの取得に苦戦しましたが、なんとかメッセージ送信までできてよかったです。
アプリ自体が日本語対応していないので、日本での普及は難しいですが、特定地域への展開を見据えると対応する余地もあるのかもしれません。
むしろ圧倒的人気のWhatsAppも試してみたいですね。

今回作成したサンプルプログラムは下記ですので、参考になれば幸いです。
https://github.com/KaT0819/telegram-sample/tree/main

おまけ

Telegramアプリケーションのインストールと初期設定

Telegramのアプリをインストールします。
ここではAndroidでのインストールです。

インストールが終わったら、アプリを起動します。

途中、通知など許可を求められますので、許可してあげます。
英語であるのでとっつきにくいですが、よくあるタイプの情報を入れていけば進められます。

Start Messagingをタップ

電話番号入力。
日本を選び、番号を入力。番号は090や080の最初の0を抜いて入れます。

入れた電話番号にSMSが届くのでコードを入力。
私の場合、自動で入力してくれました。

氏名を入力

これにて初期設定は完了

メニューはこんな感じ

言語の設定項目はありますが、残念ながら日本語対応はされていません。

レスキューナウテックブログ

Discussion