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

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

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

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

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

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

Python

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

Q&A

解決済

1回答

1146閲覧

python + Heroku + flask でLine Botを作る際のRequest Body

tolottolotto

総合スコア8

LINE Messaging API

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

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

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

Python

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

0グッド

0クリップ

投稿2018/11/20 10:29

編集2018/11/22 05:27

前提・実現したいこと

LineBotのチュートリアルとして用いられる「おうむ返しBot」をタイトルものを用いて、作成しました。
次の段階でMessageAPIを用いてPUSH_MESSAGEを送ろうとしていますが、useridの獲得方法がわからず困っております。

より具体的には、RequestのBodyの中に入っているみたいなのはわかるのですが、これを確認する方法がわかりません。
printで、$heroku logs -tailで、なんとか出力できることは確認しましたが、app.logger.infoで書き込んでるため、heroku環境でそこを確認したく思っております。
よろしくお願いいたします。

該当のソースコード

Python

1from flask import Flask, request, abort 2 3from linebot import ( 4 LineBotApi, WebhookHandler 5) 6from linebot.exceptions import ( 7 InvalidSignatureError 8) 9from linebot.models import ( 10 MessageEvent, TextMessage, TextSendMessage, 11) 12import os 13 14app = Flask(__name__) 15 16#環境変数取得 17YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"] 18YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"] 19 20line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN) 21handler = WebhookHandler(YOUR_CHANNEL_SECRET) 22 23@app.route("/") 24def hello_world(): 25 return "hello world!" 26 27@app.route("/callback", methods=['POST']) 28def callback(): 29 # get X-Line-Signature header value 30 signature = request.headers['X-Line-Signature'] 31 32 # get request body as text 33 body = request.get_data(as_text=True) 34 app.logger.info("Request body: " + body) #ここでloggerに保存しているが、Herokuで運用中にloggerの参照方法がわからない!!! 35 36 # handle webhook body 37 try: 38 handler.handle(body, signature) 39 except InvalidSignatureError: 40 abort(400) 41 42 return 'OK' 43 44 45@handler.add(MessageEvent, message=TextMessage) 46def handle_message(event): 47 line_bot_api.reply_message( 48 event.reply_token, 49 TextSendMessage(text=event.message.text)) 50 51 52if __name__ == "__main__": 53 port = int(os.getenv("PORT", 5000)) 54 app.run(host="0.0.0.0", port=port) 55

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

python == 3.6.3
flask == 0.12.2
line-bot-sdk == 1.5.0

  • herokuを用いている

Profile

1web: python main.py

webhookURLの接続確認にはエラーが出ている

error

12018-11-20T10:22:54.797625+00:00 app[web.1]: [2018-11-20 10:22:54,796] ERROR in app: Exception on /callback [POST] 22018-11-20T10:22:54.797639+00:00 app[web.1]: Traceback (most recent call last): 32018-11-20T10:22:54.797644+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app 42018-11-20T10:22:54.797647+00:00 app[web.1]: response = self.full_dispatch_request() 52018-11-20T10:22:54.797648+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request 62018-11-20T10:22:54.797650+00:00 app[web.1]: rv = self.handle_user_exception(e) 72018-11-20T10:22:54.797652+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception 82018-11-20T10:22:54.797654+00:00 app[web.1]: reraise(exc_type, exc_value, tb) 92018-11-20T10:22:54.797656+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise 102018-11-20T10:22:54.797658+00:00 app[web.1]: raise value 112018-11-20T10:22:54.797659+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request 122018-11-20T10:22:54.797661+00:00 app[web.1]: rv = self.dispatch_request() 132018-11-20T10:22:54.797663+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request 142018-11-20T10:22:54.797665+00:00 app[web.1]: return self.view_functions[rule.endpoint](**req.view_args) 152018-11-20T10:22:54.797666+00:00 app[web.1]: File "main.py", line 40, in callback 162018-11-20T10:22:54.797668+00:00 app[web.1]: handler.handle(body, signature) 172018-11-20T10:22:54.797670+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/linebot/webhook.py", line 227, in handle 182018-11-20T10:22:54.797671+00:00 app[web.1]: func(event) 192018-11-20T10:22:54.797673+00:00 app[web.1]: File "main.py", line 51, in handle_message 202018-11-20T10:22:54.797675+00:00 app[web.1]: TextSendMessage(text=event.message.text)) 212018-11-20T10:22:54.797676+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/linebot/api.py", line 94, in reply_message 222018-11-20T10:22:54.797678+00:00 app[web.1]: '/v2/bot/message/reply', data=json.dumps(data), timeout=timeout 232018-11-20T10:22:54.797680+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/linebot/api.py", line 372, in _post 242018-11-20T10:22:54.797681+00:00 app[web.1]: self.__check_error(response) 252018-11-20T10:22:54.797683+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/linebot/api.py", line 381, in __check_error 262018-11-20T10:22:54.797684+00:00 app[web.1]: raise LineBotApiError(response.status_code, error) 272018-11-20T10:22:54.797693+00:00 app[web.1]: linebot.exceptions.LineBotApiError: <LineBotApiError [Invalid reply token]> 28

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

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

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

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

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

gh640

2018/11/21 01:15

「確認する方法がわからない」というのは、細かく言うとどこが障害になっている感じでしょう?「 `request.get_data()` でリクエストデータはいい感じに取れているし Heroku のログの見方についても問題ないけど、 `app.logger.info()` を呼び出してもログに出力されない」ということだと理解しましたがこの理解で正しいでしょうか。
gh640

2018/11/21 01:19 編集

また、「 print以外の方法でよろしくお願いいたします。」は、「 print を使えばログに出力されることはすでに確認しているけれど、 `app.logger` を使いたい」という意味だと理解しましたがこの理解は正しいでしょうか?(もしそうなら Flask タグを付けられた方が回答がもらえやすくなると思います)
tolottolotto

2018/11/21 02:02

後者の、「printを使えばログは出力されることはすでに確認しているけれど、'app.logger'を使いたい」という意味で間違いありません。heroku logs -tailで送られてきたことについては、確認できているのですが、app.logger.infoの呼び出し方、等もやり方がわからずできていません。修正に関するアドバイス等もありがとうございます。
guest

回答1

0

ベストアンサー

ご返信いただきありがとうございます。なるほど、そういうことですね。

Flask の app.logger は Python の標準ライブラリ logginglogging.Logger オブジェクトなので、そこに標準出力(= Heroku のログ)に出力する設定を行えばよいのではないかと思います。

patch

1+ import logging 2import os 3+ import sys 4 5app = Flask(__name__) 6 7+ # ログを標準出力に出力する 8+ app.logger.addHandler(logging.StreamHandler(sys.stdout)) 9+ # (レベル設定は適宜行ってください) 10+ app.logger.setLevel(logging.ERROR)

Flask の公式ドキュメントの次の部分が参考になります。

Python 3.6 の logging.Logger の使い方については Python のドキュメントの次のところをお読みになるとよいかと思います。

次の Gist もご参考になるものと思います。

お試しになってみてください :)

投稿2018/11/21 02:22

編集2018/11/22 09:04
gh640

総合スコア1407

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

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

tolottolotto

2018/11/22 05:25 編集

ありがとうございます。 無事実現できました。 Flaskの問題というより、pythonの標準ライブラリの使い方の問題でしたね。 いただいた例では、`import logging` が抜けてたことを念のため補足しておきます。 この度は本当にありがとうございました
gh640

2018/11/22 09:06

そうでしたか。それはよかったです! `import logging` の件ご指摘くださりありがとうございます。回答を編集しました :D
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問