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

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

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

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

Helm

Helmは、Kubernetes用のパッケージマネージャーです。Chart(s)と呼ばれる仕組みであり、Kubernetesクラスタの全リソースと依存関係をパッケージ化して管理。Chartに要するリソースと依存関係を定義し、Kubernetesクラスタの煩雑な管理が可能になります。

Python

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

Q&A

1回答

1008閲覧

pythonとherokuを使ってLINEBOTを作成しているのですがエラーが出ていて困っています。

k667

総合スコア0

LINE Messaging API

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

Helm

Helmは、Kubernetes用のパッケージマネージャーです。Chart(s)と呼ばれる仕組みであり、Kubernetesクラスタの全リソースと依存関係をパッケージ化して管理。Chartに要するリソースと依存関係を定義し、Kubernetesクラスタの煩雑な管理が可能になります。

Python

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

0グッド

0クリップ

投稿2023/11/17 06:43

編集2023/11/20 05:56

実現したいこと

Pythonとherokuを用いたオウム返しBOTを作りたいです。
また、トーク画面でレシピ検索ができるようにもしたいです。

前提

Pythonとherokuを用いたオウム返しBOTを作っています。
しかし、デプロイをしてメッセージを送ってみても正常に返信されません。
一応コードの137行目と150行目に問題があるとは思っているのですが治し方、どのようにコードを書き換えたらいいかわかりません。

pythonとHerokuを使っています。

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

デプロイした後にメッセージが正常に返信されないです。
また、webhookを検証した後もボットサーバーから200以外のHTTPステータスコードが返されました。(503 Service Unavailable)と表示されます。
エラーメッセージ
Warning: heroku update available from 7.69.1 to 8.5.0.
2023-11-14T18:14:27.541284+00:00 app[web.1]: push()
2023-11-14T18:14:27.541321+00:00 app[web.1]: File "/app/main.py", line 137, in push
2023-11-14T18:14:27.541406+00:00 app[web.1]: (to_user,) = cur.fetchone()
2023-11-14T18:14:27.541445+00:00 app[web.1]: ^^^^^^^^^^
2023-11-14T18:14:27.541456+00:00 app[web.1]: TypeError: cannot unpack non-iterable NoneType object
2023-11-14T18:14:27.678846+00:00 heroku[web.1]: Process exited with status 1
2023-11-14T18:14:27.701793+00:00 heroku[web.1]: State changed from starting to crashed
2023-11-14T23:57:27.935597+00:00 heroku[web.1]: State changed from crashed to starting
2023-11-14T23:57:30.919958+00:00 heroku[web.1]: Starting process with command python main.py
2023-11-14T23:57:31.891688+00:00 app[web.1]: /app/main.py:19: LineBotSdkDeprecatedIn30: Call to deprecated class LineBotApi. (Use v3 class; linebot.v3.<feature>. See https://github.com/line/line-bot-sdk-python/blob/master/README.rst for more details.) -- Deprecated since version 3.0.0.
2023-11-14T23:57:31.891713+00:00 app[web.1]: line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
2023-11-14T23:57:31.891728+00:00 app[web.1]: /app/main.py:20: LineBotSdkDeprecatedIn30: Call to deprecated class WebhookHandler. (Use 'from linebot.v3.webhook import WebhookHandler' instead. See https://github.com/line/line-bot-sdk-python/blob/master/README.rst for more details.) -- Deprecated since version 3.0.0.
2023-11-14T23:57:31.891728+00:00 app[web.1]: handler = WebhookHandler(LINE_CHANNEL_SECRET)
2023-11-14T23:57:31.920147+00:00 app[web.1]: Traceback (most recent call last):
2023-11-14T23:57:31.920148+00:00 app[web.1]: File "/app/main.py", line 150, in <module>
2023-11-14T23:57:31.920219+00:00 app[web.1]: push()
2023-11-14T23:57:31.920241+00:00 app[web.1]: File "/app/main.py", line 137, in push
2023-11-14T23:57:31.920287+00:00 app[web.1]: (to_user,) = cur.fetchone()
2023-11-14T23:57:31.920307+00:00 app[web.1]: ^^^^^^^^^^
2023-11-14T23:57:31.920318+00:00 app[web.1]: TypeError: cannot unpack non-iterable NoneType object
2023-11-14T23:57:32.011432+00:00 heroku[web.1]: Process exited with status 1
2023-11-14T23:57:32.032774+00:00 heroku[web.1]: State changed from starting to crashed
2023-11-15T05:57:53.033017+00:00 heroku[web.1]: State changed from crashed to starting
2023-11-15T05:57:56.222008+00:00 heroku[web.1]: Starting process with command python main.py
2023-11-15T05:57:57.322891+00:00 app[web.1]: /app/main.py:19: LineBotSdkDeprecatedIn30: Call to deprecated class LineBotApi. (Use v3 class; linebot.v3.<feature>. See https://github.com/line/line-bot-sdk-python/blob/master/README.rst for more details.) -- Deprecated since version 3.0.0.
2023-11-15T05:57:57.322903+00:00 app[web.1]: line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
2023-11-15T05:57:57.322939+00:00 app[web.1]: /app/main.py:20: LineBotSdkDeprecatedIn30: Call to deprecated class WebhookHandler. (Use 'from linebot.v3.webhook import WebhookHandler' instead. See https://github.com/line/line-bot-sdk-python/blob/master/README.rst for more details.) -- Deprecated since version 3.0.0.
2023-11-15T05:57:57.322939+00:00 app[web.1]: handler = WebhookHandler(LINE_CHANNEL_SECRET)
2023-11-15T05:57:57.350404+00:00 app[web.1]: Traceback (most recent call last):
2023-11-15T05:57:57.350406+00:00 app[web.1]: File "/app/main.py", line 150, in <module>
2023-11-15T05:57:57.350512+00:00 app[web.1]: push()
2023-11-15T05:57:57.350539+00:00 app[web.1]: File "/app/main.py", line 137, in push
2023-11-15T05:57:57.350610+00:00 app[web.1]: (to_user,) = cur.fetchone()
2023-11-15T05:57:57.350649+00:00 app[web.1]: ^^^^^^^^^^
2023-11-15T05:57:57.350658+00:00 app[web.1]: TypeError: cannot unpack non-iterable NoneType object
2023-11-15T05:57:57.502129+00:00 heroku[web.1]: Process exited with status 1
2023-11-15T05:57:57.528893+00:00 heroku[web.1]: State changed from starting to crashed
2023-11-15T06:14:06.892234+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=POST path="/callback" host=sotukenn-e1e02abe7625.herokuapp.com request_id=674a3891-f332-4d89-abbd-d62540f75cbf fwd="147.92.150.197" dyno= connect= service= status=503 bytes= protocol=https```

該当のソースコード

python

###ソースコード
from flask import Flask, request, abort
import requests, os
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage, ImageMessage, ImageSendMessage, FollowEvent, UnfollowEvent
from PIL import Image
from io import BytesIO
import psycopg2

LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]
LINE_CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"]
DATABASE_URL = os.environ["DATABASE_URL"]
HEROKU_APP_NAME = os.environ["HEROKU_APP_NAME"]

app = Flask(name)
Heroku = "https://{}.herokuapp.com/".format(HEROKU_APP_NAME)

line_bot_api = LineBotApi(LINE_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(LINE_CHANNEL_SECRET)

header = {
"Content_Type": "application/json",
"Authorization": "Bearer " + LINE_CHANNEL_ACCESS_TOKEN
}

@app.route("/")
def hello_world():
return "hello world!"

アプリにPOSTがあったときの処理```ここに言語を入力

コード

@app.route("/callback", methods=["POST"]) def callback(): # get X-Line-Signature header value signature = request.headers["X-Line-Signature"] # get request body as text body = request.get_data(as_text=True) app.logger.info("Request body: " + body) # handle webhook body try: handler.handle(body, signature) except InvalidSignatureError: abort(400) return "OK" # botにメッセージを送ったときの処理 @handler.add(MessageEvent, message=TextMessage) def handle_message(event): line_bot_api.reply_message( event.reply_token, TextSendMessage(text=event.message.text)) print("返信完了!!\ntext:", event.message.text) # botに画像を送ったときの処理 @handler.add(MessageEvent, message=ImageMessage) def handle_image(event): print("画像を受信") message_id = event.message.id image_path = getImageLine(message_id) line_bot_api.reply_message( event.reply_token, ImageSendMessage( original_content_url = Heroku + image_path["main"], preview_image_url = Heroku + image_path["preview"] ) ) print("画像の送信完了!!") # 受信メッセージに添付された画像ファイルを取得 def getImageLine(id): line_url = f"https://api-data.line.me/v2/bot/message/{id}/content" result = requests.get(line_url, headers=header) print(result) img = Image.open(BytesIO(result.content)) w, h = img.size if w >= h: ratio_main, ratio_preview = w / 1024, w / 240 else: ratio_main, ratio_preview = h / 1024, h / 240 width_main, width_preview = int(w // ratio_main), int(w // ratio_preview) height_main, height_preview = int(h // ratio_main), int(h // ratio_preview) img_main = img.resize((width_main, height_main)) img_preview = img.resize((width_preview, height_preview)) image_path = { "main": f"static/images/image_{id}_main.jpg", "preview": f"static/images/image_{id}_preview.jpg" } img_main.save(image_path["main"]) img_preview.save(image_path["preview"]) return image_path # データベース接続 def get_connection(): return psycopg2.connect(DATABASE_URL, sslmode="require") # botがフォローされたときの処理 @handler.add(FollowEvent) def handle_follow(event): profile = line_bot_api.get_profile(event.source.user_id) with get_connection() as conn: with conn.cursor() as cur: conn.autocommit = True cur.execute('CREATE TABLE IF NOT EXISTS users(user_id TEXT)') cur.execute('INSERT INTO users (user_id) VALUES (%s)', [profile.user_id]) print('userIdの挿入OK!!') cur.execute('SELECT * FROM users') db = cur.fetchall() print("< データベース一覧 >") for db_check in db: print(db_check) # botがアンフォロー(ブロック)されたときの処理 @handler.add(UnfollowEvent) def handle_unfollow(event): with get_connection() as conn: with conn.cursor() as cur: conn.autocommit = True cur.execute('DELETE FROM users WHERE user_id = %s', [event.source.user_id]) print("userIdの削除OK!!") # データベースに登録されたLINEアカウントからランダムでひとりにプッシュ通知 def push(): with get_connection() as conn: with conn.cursor() as cur: cur.execute('SELECT * FROM users ORDER BY random() LIMIT 1') (to_user,) = cur.fetchone() line_bot_api.multicast([to_user], TextSendMessage(text="今日もお疲れさん!!")) # アプリの起動 if __name__ == "__main__": # 初回のみデータベースのテーブル作成 with get_connection() as conn: with conn.cursor() as cur: conn.autocommit = True cur.execute('CREATE TABLE IF NOT EXISTS users(user_id TEXT)') # LINE botをフォローしているアカウントのうちランダムで一人にプッシュ通知 push() port = int(os.getenv("PORT", 5000)) app.run(host="0.0.0.0", port=port) ### End

環境はWindowsを使用しています。
プロックファイルの中身は以下のようにしています・
web: python main.py

ここにより詳細な情報を記載してください。

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

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

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

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

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

melian

2023/11/17 06:52

ログにエラーの詳細が表示されていますので、これを直せばよいかと。 2023-11-14T18:14:27.541321+00:00 app[web.1]: File "/app/main.py", line 137, in push 2023-11-14T18:14:27.541406+00:00 app[web.1]: (to_user,) = cur.fetchone() 2023-11-14T18:14:27.541445+00:00 app[web.1]: ^^^^^^^^^^ 2023-11-14T18:14:27.541456+00:00 app[web.1]: TypeError: cannot unpack non-iterable NoneType object 2023-11-14T18:14:27.678846+00:00 heroku[web.1]: Process exited with status 1
y_waiwai

2023/11/17 07:40

このままではコードが読めないので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
k667

2023/11/20 05:59

(to_user,) = cur.fetchone()の文の具体的にどのように修正を行えばよろしいですか?
guest

回答1

0

エラーを読むと、以下のように書いてあります。

2023-11-15T05:57:57.350610+00:00 app[web.1]: (to_user,) = cur.fetchone() 2023-11-15T05:57:57.350649+00:00 app[web.1]: ^^^^^^^^^^ 2023-11-15T05:57:57.350658+00:00 app[web.1]: TypeError: cannot unpack non-iterable NoneType object

「cannot unpack non-iterable NoneType object」は、ざっくり言うとcur.fetchone()がNoneだったときに(to_user,)の形で値を格納できない、というエラーです。
なので、cur.executeのSQLが合っているか、DBの値は正しいか、cur.fetchone()だけprintして中身を見てみる、等を確認すれば良いかと思います!

投稿2023/11/21 04:25

uma9626

総合スコア42

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

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

k667

2023/11/21 07:10

ご回答ありがとうございます。 cur.fetchone()のpurint文の記述のやり方を教えていただけますでしょうか。また、確認できたとしてSQL,DBの値が違ていた場合の変更、改善のやり方を教えていただけますでしょうか。
uma9626

2023/11/22 01:13 編集

> cur.fetchone()のpurint文の記述のやり方を教えていただけますでしょうか。 いくつかやり方はあると思いますが、例えばcur.fetchone()の結果を一度1つの変数に入れてからprintするとかですかね。 ``` def push(): with get_connection() as conn: with conn.cursor() as cur: cur.execute('SELECT * FROM users ORDER BY random() LIMIT 1') tmp = cur.fetchone() print(tmp) # ここでcur.fetchone()の結果が表示される (to_user,) = tmp # ここでエラーになると思う line_bot_api.multicast([to_user], TextSendMessage(text="今日もお疲れさん!!")) ``` > SQL,DBの値が違ていた場合の変更、改善のやり方を教えていただけますでしょうか。 こちらはどんなDBを使っているかによりますが、psycopg2で不適切な値を削除もしくは更新で修正するか、 DBクライアントでDBに接続して値を修正するなどの手段があります。 psycopg2でのCRUD操作については検索してみてください。 DBクライアントもいくつかありますが、私が使ったことがあるのはDBeaverとかですかね。 参考:https://qiita.com/12345/items/48f6856e32fd618ea307
k667

2023/11/28 05:04

ご返信ありがとうございます。返信の間隔があいてしまい申し訳ございません。いただいたコメントを見ながら作業を進めていきたいと思います。またなにかありましたら質問させていただきます。コメントありがとうございます。
k667

2023/11/28 05:06

返信の間隔が空いてしまい申し訳ございません。いただいたコメントをもとに作業に取り掛かります、またわからないところがあったら質問させていただきます。よろしくお願いします。
k667

2023/11/28 06:19

質問失礼します。教えていただいたコードを入れてプリント表記できるように修正したのですが以下のように表示されました。 (kasou) C:\Users\自分の名前\kasou>python main.py Traceback (most recent call last): File "C:\Users\自分の名前\kasou\main.py", line 11, in <module> LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"] File "C:\Users\自分の名前\AppData\Local\Programs\Python\Python310\lib\os.py", line 680, in __getitem__ raise KeyError(key) from None KeyError: 'LINE_CHANNEL_ACCESS_TOKEN' と表示されたのですがこれだとまだ,cur.fetchoneの結果を表示できていないということなのでしょうか素人質問で申し訳ないのですがよろしくおねがいします。
uma9626

2023/11/28 06:23

このエラーは、「LINE_CHANNEL_ACCESS_TOKENという環境変数は無いよ」という意味のエラーです。 前回はこのエラーは出ていなかったと思いますが、設定変更や実行環境の変更がありましたでしょうか? (実行するPCを変えたとか) 念のため、PCのLINE_CHANNEL_ACCESS_TOKEN環境変数がちゃんと設定されているかもご確認ください。
k667

2023/11/29 04:17

ご回答ありがとうございます。確認してみます。
k667

2023/11/29 04:52

確認したところディレクトリの中にLINE_CHANNEL_ACCESS_TOKENがなかったのでsetコマンドを使って追加したのですがKeyError: 'LINE_CHANNEL_ACCESS_TOKEN'と出てきます。set Lコマンドで確認したのですが設定されているのにこのエラーが出る原因はわかりますか。なんどもすみません。
uma9626

2023/11/29 06:08

理由は分かりませんが、setで追加した環境変数はos.environでは取得できないようです。 (pathが通ってないからかも?) WindowsのGUIで、システムのプロパティ>詳細設定>環境変数>システム環境変数から環境変数を追加してどうなるか試してみてください。 また、うまくいかない場合は一度PCを再起動してみてください。
k667

2023/11/30 04:51

ご回答ありがとうございます。ためしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問