iT邦幫忙

1

LINEBOT API問題 (python)

  • 分享至 

  • xImage

各位前輩好,我嘗試用LINEBOT串接chatGPT,並且已部屬在Heroku上,希望透過LINEBOT來與chatGPT溝通,但目前LINEBOT都無法正確回應訊息,我也一直找不到原因,還請協助看一下代碼是否有問題。

目前狀況如下:

  1. Webhook的設定應該是正確的,所以LINEBOT可以正常的與Heroku溝通,URL Verify顯示Success
  2. 當我從手機向LINEBOT發出請求,Heroku的log顯示有正確回應200,沒出現bug
  3. 但是LINEBOT目前都一直回應" 很抱歉,本帳號無法個別回覆用戶的訊息。 "
  4. 我已經測過chatGPT調用API的方法,是正常沒問題的,所以問題應該還是在LINEBOT上

附上完整代碼與註解:

※問題已解決,代碼已更新

from flask import Flask, request, abort
import os
import json
import requests
import cfg
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError

app = Flask(__name__)

# 設置LINE Bot的API URL和Token
LINE_API_URL = "https://api.line.me/v2/bot/message/reply"
LINE_ACCESS_TOKEN = cfg.LINE_BOT_TOKEN
LINE_SECRET = cfg.LINE_BOT_SECRET
handler = WebhookHandler(LINE_SECRET)

# 設置OpenAI API的URL和密鑰
OPENAI_API_KEY = cfg.OPEN_AI_API_KEY


@app.route("/")
def welcome():
    return "welcome to my flask web service"


@app.route("/t")
def test():
    return "testing page"


@app.route('/webhook', methods=['POST'])
def webhook():
    # 接收LINE Bot的請求
    signature = request.headers['X-Line-Signature']
    body = request.get_data(as_text=True)

    try:
        # 驗證 Webhook 請求是否來自 LINE 平臺
        handler.handle(body, signature)
    except InvalidSignatureError:
        # 如果不是來自 LINE 平臺的 Webhook 請求,則拋出錯誤
        abort(400)

    # 如果是來自 LINE 平臺的 Webhook 請求,則處理訊息事件
    events = json.loads(body)["events"]
    for event in events:
        if event["type"] == "message" and event["message"]["type"] == "text":
            # 取得使用者 ID 和訊息內容
            user_id = event["source"]["userId"]
            message_text = event["message"]["text"]

            # 調用OpenAI API進行文本生成
            response = generate_text(message_text)

            # 回復用戶的消息
            headers = {
                'Content-Type': 'application/json',
                'Authorization': 'Bearer ' + LINE_ACCESS_TOKEN
            }
            data = {
                'replyToken': event['replyToken'],
                'messages': [{
                    'type': 'text',
                    'text': response
                }]
            }
            requests.post(LINE_API_URL, headers=headers, data=json.dumps(data))

    return 'OK', 200


def generate_text(prompt):
    # 設置OpenAI API請求的數據
    data = {
        'prompt': prompt,
        'temperature': 0.5,
        'max_tokens': 500,
        "model": "davinci",
        'stop': '\n',
    }
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + OPENAI_API_KEY
    }

    # 發送OpenAI API請求
    response = requests.post(cfg.OPENAI_ENDPOINT, headers=headers, json=data)
    response_data = json.loads(response.content)

    # 解析OpenAI API的響應數據
    message = response_data['choices'][0]['text'].strip()
    return message


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=int(os.environ.get("PORT", 5000)))
    # app.run()

https://ithelp.ithome.com.tw/upload/images/20230215/20114492kqQrquLO53.pnghttps://ithelp.ithome.com.tw/upload/images/20230215/20114492QeN7VsXQAS.png
https://ithelp.ithome.com.tw/upload/images/20230215/20114492hQVRUj3lfE.pnghttps://ithelp.ithome.com.tw/upload/images/20230215/20114492jFcUm4THPT.png

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
I code so I am
iT邦高手 1 級 ‧ 2023-02-16 09:23:22
最佳解答

先以ngrok debug。

Peter iT邦新手 4 級 ‧ 2023-02-16 12:11:47 檢舉

感謝大大! 沒想到還有這種好東西,昨天在排查問題的時候真的是頭好痛,並且我也用ngrok發現了問題,是我在判斷isinstance的那段寫錯了

0
arthas989
iT邦見習生 ‧ 2023-02-15 14:40:19

在Messaging API中的Messaging API settings
把Auto-reply messages設成DISABLED試試

Peter iT邦新手 4 級 ‧ 2023-02-15 15:33:32 檢舉

關掉會讓那個罐頭訊息停止,之後就甚麼都沒有回覆,並且Heroku仍然是有收到請求

我要發表回答

立即登入回答