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

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

ただいまの
回答率

89.12%

Djangoでおうむ返しするbotを作成し、Herokuにデプロイしたがメッセージが返ってこない

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,364

nokonoko_1203

score 17

いつも大変お世話になっております。

表記の件について、line-bot-sdk-pythonを使ってみたを参考に送信したメッセージがおうむ返しされるbotを作りましたが、返ってきません。

$ heroku logs -tail

2018-08-19T21:35:47.514283+00:00 heroku[router]: at=info method=POST path="/linebot/callback" host=echo-bot123.herokuapp.com request_id=aefb51e5-8487-4936-98b1-00607b167f77 fwd="203.104.146.155" dyno=web.1 connect=1ms service=3ms status=301 bytes=204 protocol=https
2018-08-19T21:35:47.515531+00:00 app[web.1]: 10.182.199.117 - - [20/Aug/2018:06:35:47 +0900] "POST /linebot/callback HTTP/1.1" 301 0 "-" "LineBotWebhook/1.0"

となり、エラーは出ていないようなのですが…

何が原因なのかわからず困っておりますので助言いただけるとありがたいです。

書いたコードは以下の通りです。

開発環境
・mac OS 10.13.6
・Python 3.7.0
・Django 2.1
・line-bot-sdk 1.8.0

コード全文
https://github.com/nokonoko1203/line_bot

# views.py

# -*- encoding: utf-8 -*-
#from django.shortcuts import render
#
## Create your views here.
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError, LineBotApiError
from linebot.models import MessageEvent, TextMessage, TextSendMessage

import os


ECHO_BOT_ACCESS_TOKEN = os.environ.get('ECHO_BOT_ACCESS_TOKEN')
ECHO_BOT_CHANNEL_SECRET = os.environ.get('ECHO_BOT_CHANNEL_SECRET')

# 各クライアントライブラリのインスタンス作成
line_bot_api = LineBotApi(channel_access_token=ECHO_BOT_ACCESS_TOKEN)
handler = WebhookHandler(channel_secret=ECHO_BOT_CHANNEL_SECRET)


def index(request):
    return HttpResponse("This is bot api.")


@csrf_exempt
def callback(request):
    # リクエストヘッダーから署名検証のための値を取得
    signature = request.META['HTTP_X_LINE_SIGNATURE']
    # リクエストボディを取得
    body = request.body.decode('utf-8')
    try:
        # 署名の検証を行い、成功した場合にhandleされたメソッドを呼び出す
        handler.handle(body, signature)
    except InvalidSignatureError:
        # 署名検証で失敗したときは例外をあげる
        return HttpResponseForbidden()
    # handleの処理を終えればOK
    return HttpResponse('OK')


# メッセージイベントの場合の処理
@handler.add(MessageEvent, message=TextMessage)
def handle_text_message(event):
    # メッセージでもテキストの場合はオウム返しする
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text)
    )
# urls.py

from django.conf.urls import include, url
from django.urls import path
from . import views

urlpatterns = [
    path('callback/', views.callback),
    path('index/', views.index),
]

よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

ローカルでログを確認しながら、どこでエラーが出るのか確認していると「/がないよ!」と行った旨のエラーが発生していました。
webhookに指定するURLの末尾に/を入れるのを忘れていたようでした。
入れると無事に動きました。ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

直接の解決策ではないですが、調査したらいいと思うことをあげます。

/linebot/callbackへのレスポンスのステータスコードが301(リダイレクト?)になってるのが気になりました。どんなリクエストをしたのでしょう?
callback()の先頭で、request変数の中身をログ出力して見てはどうでしょう。
そもそもcallback()の中が実行されていないのではないかも知れないです。(例えばログインページにリダイレクトされているとか。login_requiredデコレーターが付いてないので違うとは思いますが)

また、そもそも通ってほしい行がちゃんと実行されているか確認してはどうでしょう。そのためには、ログ出力処理を追加すると早いです。※ログレベルに注意。
特に、ちゃんとhandle_text_message()の中に処理が入っているかが気になりました。

基本的なところですが、heroku appの環境変数に指定してる値は合ってますか?linebot apiの仕様、linebot api のsdkの仕様が分かりませんが、誤った値を指定した時にどんな結果になるのか、調べるといいかもしれません。
sdkのそれぞれの呼び出し箇所の戻り値が変な値になってないか、ログに出して確認するとか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる