質問編集履歴

1 デコレータを忘れているという回答をいただき、追記しました。もともとのコードにはデコレータは書いていましたが、コピペし忘れていたようです。

kento15

kento15 score 0

2021/07/11 14:15  投稿

LINEbotを初めて作っているのですが、フォローイベントの際にその人のスキーマをPostgreSQLで作る方法が分かりません。
### 前提・実現したいこと
初めてLINEbotをPython,Herokuを用いて作っているのですが、フォローイベントの際にその人のユーザーID名のスキーマをPostgreSQlで作成する方法が分かりません。
### 該当のソースコード
```Python
from flask import Flask,request,abort
from linebot import LineBotApi,WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent,TextMessage,TextSendMessage,FollowEvent
import os
import psycopg2
app=Flask(__name__)
#環境変数の取得
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]
line_bot_api=LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler=WebhookHandler(YOUR_CHANNEL_SECRET)
@app.route("/callback",methods=["POST"])
def callback():
   signature=request.headers["X-Line-Signature"]
   body=request.get_data(as_text=True)
   app.logger.info("Request body"+body)
   try:
       handler.handle(body,signature)
   except InvalidSignatureError:
       abort(400)
   return "OK"
@handler.add(FollowEvent)  
def handle_follow(event):
   your_id = event.source.user_id
  message = "君のユーザーIDは{}だよ".format(your_id)
   line_bot_api.reply_message(event.reply_token,TextSendMessage(text=message))
   #まだその人のスキーマが作成されていなければ新規作成する。
   with psycopg2.connect("dbname=linebot user=postgres password=pass") as conn:
       with conn.cursor() as cur:
           cur.execute("CREATE SCHEMA IF NOT EXISTS {}".format(your_id))
if __name__=="__main__":
   port=int(os.getenv("PORT",5000))
   app.run(host="0.0.0.0",port=port)
```
### 試したこと
スキーマの作成だけでなくデータベースからのデータ取得などもできるか確認しましたができませんでした。
しかし「君のユーザーIDは○○だよ」というメッセージは届くので、Bot自体は動いていると思います。
また、with文のところのみを別に実行してみたところ、無事にスキーマを作成することが出来ました。
なのでAPIの使いかたを間違えているのかと思いましたが、リファレンスを読んでも原因を見つけることができませんでした。(もしかすると見落としてしまっているのかもしれません...。)
何か分かる方がいらっしゃれば、よろしくお願いします。
### 補足情報(FW/ツールのバージョンなど)
同階層のファイルです。
Procfile
```
web: python main.py
```
requirements.txt
```
Flask==0.12
line-bot-sdk==1.8.0
psycopg2==2.8.6
```
runtime.txt
```
python-3.9.2
```
  • Python

    38083 questions

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

  • PostgreSQL

    2674 questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

  • Heroku

    3054 questions

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

  • LINE Messaging API

    706 questions

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

  • LINE SDK

    119 questions

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る