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

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

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

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

Django

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

Heroku

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

514閲覧

DjangoとHerokuでLINEbotを製作中 callbackが上手くいかない

akaikumako

総合スコア19

LINE Messaging API

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

Django

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

Heroku

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/06/07 18:00

前提・実現したいこと

PythonでDjangoとHerokuを使ってLINEbotを製作しています。

https://qiita.com/yakan10/items/b7ad35c2cbba5db81462

こちらを参考に似たものを作っているのですが、実際に最後まで作って見たところcallbackの処理が上手くいっていないようです。原因がいまいち分からないので良ければ教えてください。

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

以下がhttps://{アプリ名}/bot/callbackに表示されます。

ValueError at /bot/callback No JSON object could be decoded Request Method: GET Request URL: https://dry-dusk-55498.herokuapp.com/bot/callback Django Version: 1.10.3 Exception Type: ValueError Exception Value: No JSON object could be decoded Exception Location: /app/.heroku/python/lib/python2.7/json/decoder.py in raw_decode, line 382 Python Executable: /app/.heroku/python/bin/python Python Version: 2.7.15 Python Path: ['/app/.heroku/python/bin', '/app', '/app/.heroku/python/lib/python27.zip', '/app/.heroku/python/lib/python2.7', '/app/.heroku/python/lib/python2.7/plat-linux2', '/app/.heroku/python/lib/python2.7/lib-tk', '/app/.heroku/python/lib/python2.7/lib-old', '/app/.heroku/python/lib/python2.7/lib-dynload', '/app/.heroku/python/lib/python2.7/site-packages'] Server time: Thu, 7 Jun 2018 17:50:49 +0000

該当のソースコード

python

1from django.shortcuts import render 2from django.http import HttpResponse 3import json 4import requests 5import re 6import urllib 7 8REPLY_ENDPOINT = 'https://api.line.me/v2/bot/message/reply' 9ACCESS_TOKEN = "AjVgISkuYRmpS+DKpT6pqs7wp6Lzb0qT482VpiWjXTDEUK06KWSjk477LwVO6qp/z1fNdwmuxyCj3yBvipfWMFVptvBdcT0Annc0M9F2ym5wsoDdsfMQPclamBgbIu7BkJHhTuAoqDGuayZiEHdx1AdB04t89/1O/w1cDnyilFU=" 10HEADER = { 11 "Content-Type": "application/json", 12 "Authorization": "Bearer " + ACCESS_TOKEN 13} 14 15def index(request): 16 return HttpResponse("This is bot api.") 17 18def callback(request): 19 reply = "" 20 request_json = json.loads(request.body.decode('utf-8')) 21 for e in request_json['events']: 22 reply_token = e['replyToken'] 23 message_type = e['message']['type'] 24 25 if message_type == 'text': 26 text = e['message']['text'] 27 reply += reply_text(reply_token, text) 28 return HttpResponse(reply) 29 30def reply_text(reply_token, text): 31 reply = word_search(text) 32 payload = { 33 "replyToken":reply_token, 34 "messages":[ 35 { 36 "type":"text", 37 "text": reply 38 } 39 ] 40 } 41 42 requests.post(REPLY_ENDPOINT, headers=HEADER, data=json.dumps(payload)) 43 return reply 44 45def word_search(text): 46 err = False 47 x = text 48 url = 'https://ejje.weblio.jp/content/' + x.replace(' ','+') 49 response = urllib.request.urlopen(url).read().decode('utf-8') 50 51 repro = re.search(r'<span class=phoneticEjjeDesc>(.*?)<',response) 52 if repro != None: 53 pro = repro.group(1) 54 else: 55 pro = '' 56 57 remean = re.search(r'<meta name="twitter:description" content="(.*?)"',response) 58 if remean == None: 59 err = True 60 mean = remean.group(1) 61 62 url = 'https://dictionary.cambridge.org/dictionary/learner-english/' + x.replace(' ','-') 63 response = urllib.request.urlopen(url).read().decode('utf-8') 64 reenmean = re.search(r'<meta name="description" content="(.*?)Learn more."',response) 65 if reenmean == None: 66 err = True 67 enmean = reenmean.group(1) 68 69 return "{}\n{}\n{}\n{}".format(x, pro, mean, enmean)

よろしくお願いします

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

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

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

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

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

Udomomo

2018/06/07 23:51

No JSON object could be decodedと出ていますね。callbackに渡されたrequestにどのような値が入っているか確認すると、何かわかるかもしれません。
akaikumako

2018/06/22 09:10

ご連絡遅くなってしまい、申し訳ありませんm(_ _)m 何とかなりそうです!ありがとうございます!
Udomomo

2018/06/23 01:39

それは良かったです。もし解決できたら、どうやって解決したかを回答欄に書いておくと、これから同じところで詰まった人のために役立ちます。
guest

回答1

0

ベストアンサー

json.loads(request.body.decode(...の行でエラーになっていると思います。おそらく。
json.loads()は、空文字を渡すと、jsonとして読み込めないよ、というエラーを出すと思います。
request.bodyが空文字だとそうなります。

リクエストメソッドがgetというログが出ているので、ブラウザからurlを叩いたのかなと推測します。そうするとリクエストボディに何も設定されません。
リクエストボディに、linebotのapi仕様に従った値を設定する必要があるはずです。

(追記) 参考になさったページに以下の記述がありました。

動作確認
jsonをPOSTしてエラーが出ないか確かめます。

jsonをPOSTする方法はいろいろあると思いますが、ここではChromeのAdvanced REST clientを使ってPOSTしてみます。

どんなリクエストを投げたのか、それは仕様通りなのか確認して見てください。
とりあえずrequest.bodyの値をログに出力するといいと思います。

投稿2018/08/20 15:22

編集2018/08/20 16:10
betahikaru

総合スコア20

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

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

akaikumako

2018/09/06 01:42

うまくいきそうです。説明不足ですみません。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問