1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ひとりアドベントカレンダーAdvent Calendar 2024

Day 1

telegram-bot-rbを使ってTelegram Botを動かす

Last updated at Posted at 2024-11-30

概要

Telegramでは簡単にBotを作成でき、それを外部からあれこれ動かすためのAPIが提供されています。
いくつかのGemがこのAPIをラップしてくれていますが、今回はtelegram-bot-rbというGemでメッセージを返すBotを動かしてみます。

リンク

環境

MacBook Pro(M3 Pro)
docker desktop: 4.34.3
Ruby 3.3.5
rails ~> 7.2.2

チュートリアル

1. Railsプロジェクトを用意する

以下の記事っぽく構築

自分がいつも参考にさせていただいている記事
細かい部分まで解説されている上に、内容がわかりやすく頭が上がらない

2. Gemを追加

Gemfileの末尾に以下を追加

gem 'telegram-bot'
gem 'telegram-bot-types'

追加したら反映するために再度 build & up

docker-compose build
docker-compose up -d

telegram-bot-typesを有効にするために、以下を適当な場所に追加する

application.rb
# ひとまずapplication.rbに追記
Telegram::Bot::Client.typed_response!

3. TelegramBotの作成

BotFatherとのチャットを開く

以下BotFatherへ送信する

# ボット作成開始コマンド
/newbot

# 任意のbotの名前(末尾がbotでないといけない 例: TetrisBot or tetris_bot)
test_231512_bot

そうするとアクセストークンをもらえるのでメモしておく
この記事では 123456:ABCDEFGHIJKLMN だったということにする

4. Credentialsを設定

コンテナ内に入る

docker-compose exec -it web bash

Credentialsファイルを開く

EDITOR="vi" bin/rails credentials:edit

Botのアクセストークンを追記する

telegram:
  bot: 123456:ABCDEFGHIJKLMN

正しく設定できたかはrailsコンソールで確認できる

root@5112704f29eb:/app# rails c
app(dev)> Telegram.bot.get_me
=> #<Telegram::Bot::Types::User id=7652787638 is_bot=true first_name="bot_test_43824" last_name=nil username="test_231512_bot" language_code=nil can_join_groups=true can_read_all_group_messages=false supports_inline_queries=false>

Bot情報を取得できている

5. Webhookの用意

Webhook用のコントローラーを用意する

app/controllers/webhook_controller.rb
class WebhookController < Telegram::Bot::UpdatesController
  include Telegram::Bot::UpdatesController::TypedUpdate

  def start!(word = nil, *words)
    respond_with :message, text: (word || "") + "hello!"
  end
end

ルーティングの設定

routes.rb
Rails.application.routes.draw do
  telegram_webhook WebhookController
end

development.rbとproduction.rbに、パス生成用の設定を追加

development.rbとproduction.rb
# 必ずhttpsじゃないといけない
# yourdomain.comは自分のホスト名に書き換える
routes.default_url_options = {host: 'yourdomain.com', protocol: 'https'}

以下を実行することで、Botにwebhookのリンクを設定できる (便利で嬉しい)

rake telegram:bot:set_webhook RAILS_ENV=production

6. Poller起動

ローカル環境で実際にWebhook用のAPIを叩かせるのは少しめんどくさいので、サーバーにデプロイされた時にwebhookが叩かれることを確認すればいい
ローカル環境ではpollerモードで動作確認する

# コンテナの中に入って...
docker-compose exec -it web bash

# Poller起動
rake telegram:bot:poller

7. 動作確認

Telegram Botに /start と送ってメッセージが返ってくることを確認する

完了!

作ったもの

補足

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?