実現したい事: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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/12 16:41
2020/08/13 00:30
2020/08/13 02:49