質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

2931閲覧

Linebotの設定でWebhook設定の検証が失敗してしまう

athlaliel

総合スコア7

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2020/08/12 14:16

編集2020/08/13 07:00

実現したい事:railsで作成したLinebotで、入力した事に対してbotからの返信を成功させたい。

開発環境:ruby on rails
デプロイ:heroku
データベース:postgresql

質問内容

###ruby on railsを使用してLinebotを作成しています。
###herokuへのデプロイは完了していますが、webhookの検証設定が成功しない為、callbackに反映されません。

####下記の画像と共に、「ボットサーバーから200以外のHTTPステータスコードが返されましたと、エラーが表示されます。何度検証してみても、時間をおいてみてもダメです。

発生している問題・エラーメッセージ

![イメージ説明]

###ターミナルでheroku logsを実行すると、logが出てきます。status=500と一番下に出ているので、サーバーエラーなのは分かるのですが、どこが悪いのか最早分からない状態です。

該当のソースコード

  • posts_contoroller.rb↓

※scaffoldで作成したファイルなのでデフォルトのまま

class PostsController < ApplicationController before_action :set_post, only: [:show, :edit, :update, :destroy] # GET /posts # GET /posts.json def index @posts = Post.all end # GET /posts/1 # GET /posts/1.json def show end # GET /posts/new def new @post = Post.new end # GET /posts/1/edit def edit end # POST /posts # POST /posts.json def create @post = Post.new(post_params) respond_to do |format| if @post.save format.html { redirect_to @post, notice: 'Post was successfully created.' } format.json { render :show, status: :created, location: @post } else format.html { render :new } format.json { render json: @post.errors, status: :unprocessable_entity } end end end # PATCH/PUT /posts/1 # PATCH/PUT /posts/1.json def update respond_to do |format| if @post.update(post_params) format.html { redirect_to @post, notice: 'Post was successfully updated.' } format.json { render :show, status: :ok, location: @post } else format.html { render :edit } format.json { render json: @post.errors, status: :unprocessable_entity } end end end # DELETE /posts/1 # DELETE /posts/1.json def destroy @post.destroy respond_to do |format| format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_post @post = Post.find(params[:id]) end # Only allow a list of trusted parameters through. def post_params params.require(:post).permit(:name) end end

該当のソースコード②

  • linebots_controller.rb↓

※特定の言葉に反応して返信させたい

class LinebotsController < ApplicationController require 'line/bot' # gem 'line-bot-api' # callbackアクションのCSRFトークン認証を無効 protect_from_forgery :except => [:callback] def client @client ||= Line::Bot::Client.new { |config| config.channel_secret = ENV["LINE_CHANNEL_SECRET"] config.channel_token = ENV["LINE_CHANNEL_TOKEN"] } end def callback # Postモデルの中身をランダムで@postに格納する @post=Post.offset( rand(Post.count) ).first body = request.body.read signature = request.env['HTTP_X_LINE_SIGNATURE'] unless client.validate_signature(body, signature) head :bad_request end events = client.parse_events_from(body) events.each { |event| # event.message['text']でLINEで送られてきた文書を取得 if event.message['text'].include?("パスワード") response = "パスワードが違う!曲者め!" elsif event.message['text'].include?("覚悟") response = "ふん、意気込みだけでは儂に勝てぬぞ" elsif event.message['text'].include?("姫はどこだ") response = "そんな小娘のことより、己自身の心配をせい" else response = @post.name end #if文でresponseに送るメッセージを格納 case event when Line::Bot::Event::Message case event.type when Line::Bot::Event::MessageType::Text message = { type: 'text', text: response } client.reply_message(event['replyToken'], message) end end } head :ok end end

該当のソースコード③

  • rutes.rb
Rails.application.routes.draw do resources :posts post '/callback' => 'linebots#callback' root 'posts#index' end

使用したGemfaile

gem 'dotenv-rails' gem 'line-bot-api' gem 'sinatra' gem 'httpclient'

試したこと

config.channel_secret = ENV['LINE_BOT_CHANNEL_SECRET'] config.channel_token = ENV['LINE_BOT_CHANNEL_TOKEN']

#####↑環境変数はターミナルで設定済みです。
####② routes.rbの記載がおかしいのかと思い、callback部分の記述を編集して再デプロイを繰り返しました。

Rails.application.routes.draw do resources :posts post '/callback' => 'linebots#callback' root 'posts#index' end

###↑callbackの内容をpostsに変えたり、単数形に変えたりしていく中で他にも色々なエラーが出ました。

  • Stopping all processes with SIGTERM
  • Process exited with status 143

ターミナルに入力したコマンド達

heroku ps:scale web=0
heroku ps
heroku restart
heroku logs

いずれも効果なしでした。

###最終的にはターミナルでstatus500のサーバーエラーが出てきますが、これ以上どこを見直せばいいのか不明です。色々と調べて実行するも、一日経っても未だ解決しないので、途方にくれています。そこで先人の方々の知恵をお借りしたく思います。よろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

rails 6.0.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

2020-08-12T13:12:53.339075+00:00 app[web.1]: [b5dc7586-5c4b-4a9e-96ca-fcb01120e96e] ArgumentError (channel_token is not configured):

と出ているのでチャネルトークンが読み取れていないようですね。
herokuに環境変数がうまく登録できていない可能性が高いです。

herokuに環境変数を設定するには下記のようなコマンドでいけるはずです。

$ heroku config:set LINE_BOT_CHANNEL_SECRET="チャネルシークレット" LINE_BOT_CHANNEL_TOKEN="チャネルトークン" --app "アプリ名"

投稿2020/08/12 15:06

Arahabica

総合スコア209

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

athlaliel

2020/08/12 16:41

回答をいただきありがとうございます。 環境変数のチャネルシークレットが上手く設定できていない事をログを見直して確認しました。 しかしながらチャネルシークレットを再発行した上でコマンド入力をやり直してみましたが、やはり登録ができませんでした。入力間違いを疑ってスペースを消したりしたりして何度かやり直してもダメでした。 ``` 2020-08-12T16:29:15.205254+00:00 app[web.1]: D, [2020-08-12T16:29:15.205075 #4] DEBUG -- : [5b3e3c32-caf3-44b8-9917-9c76e1f7e963] (5.5ms) SELECT COUNT(*) FROM "posts" 2020-08-12T16:29:15.288044+00:00 app[web.1]: D, [2020-08-12T16:29:15.287888 #4] DEBUG -- : [5b3e3c32-caf3-44b8-9917-9c76e1f7e963] Post Load (6.0ms) SELECT "posts".* FROM "posts" ORDER BY "posts"."id" ASC LIMIT $1 OFFSET $2 [["LIMIT", 1], ["OFFSET", 7]] 2020-08-12T16:29:15.289193+00:00 app[web.1]: I, [2020-08-12T16:29:15.289108 #4] INFO -- : [5b3e3c32-caf3-44b8-9917-9c76e1f7e963] Completed 500 Internal Server Error in 490ms (ActiveRecord: 96.7ms | Allocations: 2637) 2020-08-12T16:29:15.290097+00:00 app[web.1]: F, [2020-08-12T16:29:15.290019 #4] FATAL -- : [5b3e3c32-caf3-44b8-9917-9c76e1f7e963] 2020-08-12T16:29:15.290098+00:00 app[web.1]: [5b3e3c32-caf3-44b8-9917-9c76e1f7e963] ArgumentError (`channel_token` is not configured): 2020-08-12T16:29:15.290099+00:00 app[web.1]: [5b3e3c32-caf3-44b8-9917-9c76e1f7e963] 2020-08-12T16:29:15.290100+00:00 app[web.1]: [5b3e3c32-caf3-44b8-9917-9c76e1f7e963] app/controllers/linebots_controller.rb:63:in `block in callback' 2020-08-12T16:29:15.290100+00:00 app[web.1]: [5b3e3c32-caf3-44b8-9917-9c76e1f7e963] app/controllers/linebots_controller.rb:27:in `each' 2020-08-12T16:29:15.290100+00:00 app[web.1]: [5b3e3c32-caf3-44b8-9917-9c76e1f7e963] app/controllers/linebots_controller.rb:27:in `callback' 2020-08-12T16:29:15.296547+00:00 heroku[router]: at=info method=POST path="/callback" host=shinobi01bot.herokuapp.com request_id=5b3e3c32-caf3-44b8-9917-9c76e1f7e963 fwd="203.104.156.73" dyno=web.1 connect=10ms service=537ms status=500 bytes=1827 protocol=https ``` ArgumentError (`channel_token` is not configured): このエラーは解決できず、status500エラーのままです。 heroku config:set LINE_BOT_CHANNEL_TOKEN="[LINEのアクセストークン]" で入力しても、 $ heroku config:set LINE_BOT_CHANNEL_SECRET="チャネルシークレット" LINE_BOT_CHANNEL_TOKEN="チャネルトークン" --app "アプリ名" 伺ったこちらも効果なしでした。 他はどこかの文法ミスを疑うレベルなので、また入力を試してみます。 ありがとうございます。
Arahabica

2020/08/13 00:30

1つ目のソースコードでは、 ``` config.channel_secret = ENV["LINE_CHANNEL_SECRET"] config.channel_token = ENV["LINE_CHANNEL_TOKEN"] ``` となっていますが、もしかして、LINE_CHANNEL_SECRETとLINE_BOT_CHANNEL_SECRETで微妙に名前を間違えてるとかないですか?
athlaliel

2020/08/13 02:49

重ねてアドバイスありがとうございます。 おっしゃる内容の通りで、contorollerにはLINE_CHANNEL_SECRETと記載がありましたが、実際にターミナルで叩いていたコマンドはLINE_BOT_CHANNEL_SECRETでした。 記述したものと入力していたコマンドがそもそも違う事に気づいていませんでした。 ご指摘のおかげで今度こそ環境変数は設定できたと思います。 改めてありがとうございました。 webhookの検証はまだ成功していませんが、新たなエラーも出てきました。 そちらの原因を探ってみようと思います????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問