ローカルで始めるLINE bot @Ruby


## 今回する内容
- ngrokを使ってローカル開発環境を構築します  
herokuを使って永続化させたい場合はこちらを参照ください[【LINE bot】初めてのおみくじbot](https://qiita.com/4geru/items/438a2dfcaf9eea4bdbb5)

- 簡単なおうむ返しbotをおみくじbotに変更します。

# ローカルの環境設定
ngrokを使います。
初めはLINEの設定をするので、インストールされていない方はあらかじめインストールをお願いします。

```shell
# macの場合
brew cask install ngrok
# linuxの場合
npm i -g ngrok
```



### ngrokを利用します。

※サーバーとは別のターミナルで開く

```shell
$ ngrok http 3000

Session Status                online
Session Expired               Restart ngrok or upgrade: ngrok.com/upgrade
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://xxxxxx.ngrok.io -> localhost:3000
Forwarding                    https://xxxxxx.ngrok.io -> localhost:3000

Connections                   ttl     opn     rt1     rt5     p50     p90
                              105     0       0.00    0.00    0.87    4.76
```

### 必要なパッケージのインストール

Gemfileの作成

```shell
$ gem install bundler
$ bundle init 
```

Gemfileの記述

```ruby:Gemfile
gem 'sinatra'
gem 'sinatra-contrib'
gem 'rake'
gem 'line-bot-api'
gem 'dotenv'
```

gemのインストールを行います。

```shell
$ bundle install
```

app.rbを作成しserverの部分をrubyで記述していきます。

```shell
$ touch app.rb
```

とりあえず、サーバーが起動するかを確認します。
ここで動かない場合はruby/sinatraの環境構築で詰まっていると思われます。

```ruby:app.rb
require 'bundler/setup'
Bundler.require

get '/' do
    'true'
end
```

### サーバーを起動
起動した先に`true`が表示されれば大丈夫。

```shell
$  bundle exec ruby app.rb
```

line botのプログラムを追加していきます。
app.rbにプログラムの記述していきます。


```ruby:app.rb
require 'line/bot'
require 'bundler/setup'
Bundler.require
Dotenv.load

get '/' do
  'true'
end

def client
  @client ||= Line::Bot::Client.new { |config|
    config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
    config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
  }
end

post '/callback' do
  body = request.body.read
  signature = request.env['HTTP_X_LINE_SIGNATURE']
  unless client.validate_signature(body, signature)
    error 400 do 'Bad Request' end
  end
  events = client.parse_events_from(body)
  events.each { |event|
    case event
    when Line::Bot::Event::Message
      case event.type
      when Line::Bot::Event::MessageType::Text
        message = {
          type: 'text',
          text: event.message['text']
        }
        client.reply_message(event['replyToken'], message)
      when Line::Bot::Event::MessageType::Image, Line::Bot::Event::MessageType::Video
        response = client.get_message_content(event.message['id'])
        tf = Tempfile.open("content")
        tf.write(response.body)
      end
    end
  }

  "OK"
end
```


# Messaging APIの利用
[LINE Developers](https://developers.line.me/ja/services/messaging-api/)から新しいbotを作成します。

「今すぐ始めよう」 > 「プロバイダの選択」 > 「新規チャネル作成」　をします。
※チャンネル作成時に業種選択がありますが、特段の理由がない場合は「その他」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/64677/2f31aca4-7907-e848-1268-49b43519a8a2.png)


### 初期設定画面
![screencapture-developers-line-me-console-channel-1598664616-basic-2018-08-05-16_45_00.png](https://qiita-image-store.s3.amazonaws.com/0/64677/94af9b77-e93d-3113-e426-3113ccc748b0.png)


### 初期設定から変更すること

1. メールアドレスの編集
2. Webhook送信 > 編集 > 利用する
3. アクセストークンの発行  
時間は0時間で大丈夫
4. 自動応答メッセージ/友だち追加時あいさつ を利用しないに変更
5. Channel Secret/アクセストークンをメモ



### webhookの設定

設定画面からwebhookのURLを`https://xxxxxxxx.ngrok.io` + `/callback` に変更。
※[プロバイダーリスト](https://developers.line.me/console/) > プロバイダー > bot名からアクセスできます



### 環境変数の設定

```shell
touch .env
```

```env
LINE_CHANNEL_SECRET="Channel Secretのメモ"
LINE_CHANNEL_TOKEN="アクセストークンのメモ"
```


## おみくじbotを作る

### おみくじの機能

次のようにおみくじのプログラムを実装します。

```ruby:./app.rb
if event.message['text'] =~ /おみくじ/
message[:text] = ["大吉", "中吉", "小吉", "凶", "大凶"].sample
end
```

#### おみくじプログラム解説1
if文で[正規表現](https://qiita.com/tossh/items/635aea9a529b9deb3038)でパターンマッチングをしています。

```ruby
if event.message['text'] =~ /おみくじ/
```

#### おみくじプログラム解説2
配列の中の順番をランダムに並び替え一番最初の要素を返します。

```ruby
["大吉", "中吉", "小吉", "凶", "大凶"].sample
```


以上でおみくじbotが完成しました！