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

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

ただいまの
回答率

90.33%

  • Python 3.x

    7456questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Django

    1189questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

  • Heroku

    951questions

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

  • LINE Messaging API

    171questions

LINE@ボットが適切にreplyしない問題について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,545

switch0805

score 5

djangoを用いてLINE@ボットをheroku上で動かしています。期待する動作はなにかテキストでメッセージを送ったら同じメッセージを返すというものです。しかしそれがちゃんと動作しません。以下確認した症状などです。

1.オウム返しをそもそもしない

2.ログを見る限りテキスト自体はheroku上のbotに届いており処理はしている

3.webhookの接続確認の際Webhookが無効なHTTPステータスコードを返しました(期待されるステータスコードは200です)が帰ってくる。ログを確認したところ500番を返している模様。

以下ソースとログです。

//Djnago views.py

from django.shortcuts import render
from django.http.response import HttpResponse
import os
import json
import random
import requests
from django.http import JsonResponse
from django.views.generic import View
import urllib
REPLY_ENDPOINT = 'https://api.line.me/v2/bot/message/reply'

header = {
    "Content-Type": "application/json",
    "Authorization": (大変恐縮ですが伏せさせていただきます)
    }

def dispose(events):
    global header
    print('This is dispose request')
    for event in events:
        reply_token = event['replyToken']
        event_type = event['type']
        user_id = event['source']['userId']
        response_to_talk(reply_token, event)

def response_to_talk(reply_token, event):
    global header
    print("enter response to talk")
    payload = {
          "replyToken":reply_token,
          "messages":
                {
                        "type":"text",
                         "text": event['message']['text']
                    }

    }
    print(payload)
    req = requests.post(REPLY_ENDPOINT, headers=header, data=json.dumps(payload))



class ViewSet(View):
    global header
    http_method_names = ['get', 'post']

    def get(self, *args, **kwargs):
        return JsonResponse({'Successfully': 'Connected!'})

    def post(self, request, *args, **kwargs):
        dispose(json.loads(request.body.decode("utf-8"))['events'])
        return JsonResponse({'': ''})
//heroku log --tailでとれたもの

2018-06-13T04:53:10.741071+00:00 app[web.1]: 10.41.206.209 - - [13/Jun/2018:04:53:10 +0000] "POST /callback HTTP/1.1" 200 8 "-" "LineBotWebhook/1.0"
2018-06-13T04:53:10.391842+00:00 app[web.1]: This is dispose request
2018-06-13T04:53:10.391864+00:00 app[web.1]: enter response to talk
2018-06-13T04:53:10.391873+00:00 app[web.1]: {'replyToken': 'e47767136fcd4afa82b3d52a736eb3b5', 'messages': {'type': 'text', 'text': 'ほほj'}}
2018-06-13T04:53:13.881517+00:00 app[web.1]: This is dispose request
2018-06-13T04:53:13.881529+00:00 app[web.1]: enter response to talk
2018-06-13T04:53:13.881544+00:00 app[web.1]: {'replyToken': '82bf4aa40cf145798da1aa66f20817cb', 'messages': {'type': 'text', 'text': 'cうckgkjpxycお'}}
2018-06-13T04:53:14.120924+00:00 app[web.1]: 10.41.206.209 - - [13/Jun/2018:04:53:14 +0000] "POST /callback HTTP/1.1" 200 8 "-" "LineBotWebhook/1.0"
2018-06-13T04:53:14.121747+00:00 heroku[router]: at=info method=POST path="/callback" host=metabots.herokuapp.com request_id=2526f5f1-8db7-46e6-99f2-ce938303078e fwd="203.104.146.152" dyno=web.1 connect=1ms service=241ms status=200 bytes=188 protocol=https
2018-06-13T04:54:17.320200+00:00 app[web.1]: This is dispose request
2018-06-13T04:54:17.320220+00:00 app[web.1]: enter response to talk
2018-06-13T04:54:17.320224+00:00 app[web.1]: {'replyToken': '00000000000000000000000000000000', 'messages': {'type': 'text', 'text': 'Hello, world'}}
2018-06-13T04:54:17.546120+00:00 app[web.1]: enter response to talk
2018-06-13T04:54:17.597216+00:00 heroku[router]: at=info method=POST path="/callback" host=metabots.herokuapp.com request_id=6665a3a6-e24b-4d46-b6b6-7b7ef76606b8 fwd="203.104.156.73" dyno=web.1 connect=1ms service=277ms status=500 bytes=234 protocol=https
2018-06-13T04:54:17.595865+00:00 app[web.1]: 10.136.186.78 - - [13/Jun/2018:04:54:17 +0000] "POST /callback HTTP/1.1" 500 27 "-" "LINE-Developers/0.1"
2018-06-13T05:00:02.322179+00:00 heroku[router]: at=info method=POST path="/callback" host=metabots.herokuapp.com request_id=099bf773-08e5-45f4-9c5b-ea4803fb2528 fwd="203.104.156.74" dyno=web.1 connect=0ms service=307ms status=500 bytes=234 protocol=https

足りない情報などあれば大変恐縮ですが、ご指摘いただければ幸いです。以上よろしくお願いいたします。

追記

症状の一つにrequests.post実行後の返り値が<Response 400>でした

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

check解決した方法

+1

自己解決いたしました。400番エラーというだけありPOSTするデータ形式を間違えていました。正確には

'''
payload = {
"replyToken":reply_token,
"messages":
{
"type":"text",
"text": event['message']['text']
}

}
'''

'''
payload = {
"replyToken":reply_token,
"messages":[ //変更点
{
"type":"text",
"text": event['message']['text']
}] //変更点

}
'''

に変えないとまずかったようです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

私も以前動いていたプログラムが動かなくなり困っています。

最初はLet's Encryptの証明書の期限切れかと思いましたが・・・

つい先ほど見つけたのですが、Let's Encryptによる証明書が使えなくなった可能性があります。
https://teratail.com/questions/130079

ただ、私の状況はプログラムもリクエストを受け取っていない様なので、原因が違うかも知れませんが、参考になれば幸いです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/14 01:20

    ありがとうございます。let’s encryptは私も最初自宅環境のapacheサーバー使って実装を試みていました。
    しかしそれだとLINEから弾かれるという記述があり(https://osa030.hatenablog.com/entry/2016/04/08/214939)自宅環境での実装を諦めた経緯があります(笑)

    herokuも内部でlet’s encrypt使っているようならそもそもLINEからJSONを貰えないかと思います。そのため多分ここではないのだろうと思う次第ですね。

    キャンセル

  • 2018/06/18 22:55

    もう解決したようですが、私の回答の追記としてもう一度回答です。
    lets encryptの証明書はまだ使用できるようです。
    複数立てていたサーバーを全て確認した所まだ動いている物がありましたので、
    私の場合も lets encrypt が原因ではないということがわかりました。

    まだlets encryot由来の証明書は使用できるようです。

    キャンセル

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

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

同じタグがついた質問を見る

  • Python 3.x

    7456questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Django

    1189questions

    DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

  • Heroku

    951questions

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

  • LINE Messaging API

    171questions