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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

Q&A

1回答

864閲覧

PythonでLINEbotをプログラミング(Heroku、GitHubを利用して)

n_thk72

総合スコア19

Python 3.x

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

0グッド

0クリップ

投稿2019/03/16 14:10

前提・実現したいこと

いろんなウェブページを見ながらLINEbotの作り方を調べて、上記のサービスを利用しながらまずは簡単なサンプルコードを動作させるべく環境構築を行なっております。
エラーコードが出て詰まっています…。
以下のエラーコードは、Herokuへデプロイを行った時に生じたものです。
なお、エラーメッセージやソースコードの#KEYには実際には設定されたキーが書いてあります。

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

2019-03-16T13:22:12.766718+00:00 heroku[web.1]: State changed from crashed to starting 2019-03-16T13:22:15.842395+00:00 heroku[web.1]: Starting process with command `python main.py` 2019-03-16T13:22:18.506780+00:00 heroku[web.1]: State changed from starting to crashed 2019-03-16T13:22:18.404630+00:00 app[web.1]: Traceback (most recent call last): 2019-03-16T13:22:18.404685+00:00 app[web.1]: File "main.py", line 23, in <module> 2019-03-16T13:22:18.404835+00:00 app[web.1]: channel_secret = os.environ['264b57c401f98ec9c16f5fd36ffe4869'] 2019-03-16T13:22:18.404838+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/os.py", line 669, in __getitem__ 2019-03-16T13:22:18.405130+00:00 app[web.1]: raise KeyError(key) from None 2019-03-16T13:22:18.405136+00:00 app[web.1]: KeyError: '#KEY' 2019-03-16T13:22:18.486627+00:00 heroku[web.1]: Process exited with status 1 2019-03-16T13:22:19.000000+00:00 app[api]: Build succeeded 2019-03-16T13:24:47.313407+00:00 heroku[web.1]: State changed from crashed to starting 2019-03-16T13:24:50.984575+00:00 heroku[web.1]: Starting process with command `python main.py` 2019-03-16T13:24:54.060273+00:00 heroku[web.1]: Process exited with status 1 2019-03-16T13:24:54.085032+00:00 heroku[web.1]: State changed from starting to crashed 2019-03-16T13:24:53.968851+00:00 app[web.1]: Traceback (most recent call last): 2019-03-16T13:24:53.968917+00:00 app[web.1]: File "main.py", line 23, in <module> 2019-03-16T13:24:53.969087+00:00 app[web.1]: channel_secret = os.environ['#KEY'] 2019-03-16T13:24:53.969135+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/os.py", line 669, in __getitem__ 2019-03-16T13:24:53.969711+00:00 app[web.1]: raise KeyError(key) from None 2019-03-16T13:24:53.969767+00:00 app[web.1]: KeyError: '#KEY'

該当のソースコード

Python

1# -*- coding: utf-8 -*- 2import os 3import logging 4import sys 5from account_response import Response 6from flask import Flask, request, abort 7from linebot import ( 8 LineBotApi, WebhookHandler 9) 10from linebot.exceptions import ( 11 InvalidSignatureError 12) 13from linebot.models import ( 14 MessageEvent, TextMessage, TextSendMessage, 15) 16 17app = Flask(__name__) 18 19#インスタンス生成 20res=Response() 21 22#Herokuの変数からトークンなどを取得 23channel_secret = os.environ['#KEY'] 24channel_access_token = os.environ['#KEY'] 25if channel_secret is None: 26 print('Specify LINE_CHANNEL_SECRET as environment variable.') 27 sys.exit(1) 28if channel_access_token is None: 29 print('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.') 30 sys.exit(1) 31 32line_bot_api = LineBotApi(channel_access_token) 33handler = WebhookHandler(channel_secret) 34 35#LINEからのWebhook 36@app.route("/callback", methods=['POST']) 37def callback(): 38 # リクエストヘッダーから署名検証のための値を取得 39 signature = request.headers['X-Line-Signature'] 40 41 # リクエストボディを取得 42 body = request.get_data(as_text=True) 43 app.logger.info("Request body: " + body) 44 45 # 署名を検証し、問題なければhandleに定義されている関数を呼び出す。 46 try: 47 handler.handle(body, signature) 48 except InvalidSignatureError: 49 abort(400) 50 return 'OK' 51 52#LINEでMessageEvent(普通のメッセージを送信された場合)が起こった場合 53#reply_messageの第一引数のevent.reply_tokenは、イベントの応答に用いるトークンです。 54#第二引数には、linebot.modelsに定義されている返信用のTextSendMessageオブジェクトを渡しています。 55@handler.add(MessageEvent, message=TextMessage) 56def handle_message(event): 57 #入力された内容(event.message.text)に応じて返信する 58 line_bot_api.reply_message( 59 event.reply_token, 60 TextSendMessage(text=os.environ[res.getResponse(event.message.text)]) 61 ) 62 63if __name__ == "__main__": 64 app.run(host="0.0.0.0", port=int(os.getenv("PORT", 5000))) 65

試したこと

エラーメッセージから、channel_secretキーに問題があるのかと思いLINE Developerで確認したり、ウェブページで他の人のキーの書き方などを見ましたが、直し方がわかりませんでした。

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

Python 3.6.8

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

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

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

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

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

guest

回答1

0

なお、エラーメッセージやソースコードの#KEYには実際には設定されたキーが書いてあります。

「設定されたキー」の意味を汲み取りかねているのですが、エラー内容を見た限りでは、os.environで指定されている名前の環境変数が存在しないのが原因です。以下のようにすれば動くはずです。

まず、LINEから発行されたトークンは予めHeroku側に「環境変数」として登録しておいてください。登録方法は以下公式ドキュメントを参照してください。

Configuration and Config Vars | Heroku Dev Center

この回答では環境変数名を仮にCHANNEL_SECRETCHANNEL_ACCESS_TOKENとします。
Heroku CLIを使うなら以下のようなコマンドを実行してください。
(「LINEから発行されたトークン」の部分は実際の値に書き換えてください)

bash

1$ heroku config:set CHANNEL_SECRET=LINEから発行されたトークン 2$ heroku config:set CHANNEL_ACCESS_TOKEN=LINEから発行されたトークン

次に、ソースコードのos.environを使っている部分は以下のように書きます。

python

1#Herokuの変数からトークンなどを取得 2channel_secret = os.environ['CHANNEL_SECRET'] 3channel_access_token = os.environ['CHANNEL_ACCESS_TOKEN']

この状態でデプロイしてみてください。

投稿2019/03/18 10:16

ryu22e

総合スコア132

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

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

n_thk72

2019/03/19 05:48

環境変数はherokuのsetting上でもしっかり登録していることが確認できましたが、同様のエラーメッセージが出てステータスコードが503で返されてしまいます…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問